MG4J – Managing GigaBytes for Java
Indicizzazione ed interrogazione di una collezione di documenti
Esercitazione
Ilaria Bordino
Sapienza Università di Roma & Universitat Pompeu Fabra de Barcelona
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 2
Overview dei pacchetti principali
• Document– Document– DocumentCollection– FileSetDocumentCollection– DocumentFactory
• Index• Query
– HttpQueryServer– QueryEngine
• Documentation: http://mg4j.dsi.unimi.it/docs/• Manual: http://mg4j.dsi.unimi.it/man/manual.pdf
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 3
Document
• Interfaccia definita in it.unimi.dsi.mg4j.document• Ogni classe che implementa Document rappresenta un
singolo documento indicizzabile.
• Un documento è composto da un numero di campi che dipende dal tipo di documento;
• esempio:
– E-mail: from, to, data, subject, body
– Pagina html: title, url, body
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 4
Document
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 5
Document Collection
• Interfaccia definita in it.unimi.dsi.mg4j.document• Una collection è una lista di documenti accessibili in
modo casuale.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 6
FileSetDocumentCollection
• Classe definita in it.unimi.dsi.mg4j.document• Una DocumentCollection corrisponde a un insieme
di file specificati in forma di array.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 7
Document Factory
• Interfaccia definita in it.unimi.dsi.mg4j.document• Una factory esegue il parsing di documenti omogenei.• Ogni documento prodotto da una stessa factory contiene un
certo numero di campi che vanno indicizzati separatemente.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 8
Implementazioni di DocumentFactory
• CompositeDocumentFactory• HtmlDocumentFactory• IdentityDocumentFactory• MailDocumentFactory• PdfDocumentFactory• ReplicatedDocumentFactory• PropertyBasedDocumentFactory• TRECHeaderDocumentFactory• ZipDocumentCollection.ZipFactory
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 9
Query
• Interprete a riga di comando per l’interrogazione di indici• Può anche avviare un web server che mostra i risultati in modo
simile ai motori di ricerca a cui siamo abituati
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 10
QueryEngine
• Un motore di ricerca che prende una query e restituisce i risultati, utilizzando un insieme programmabile di politiche di scoring.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 11
HttpQueryServer
• Un semplice web server che processa le query.• Se una collezione di documenti è disponibile, il server
mostrerà alcuni intervalli che soddisfano la query sottomessa.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 12
Costruzione della prima collezione di documenti
• L’indicizzazione in MG4J e’ centrata sul concetto di documento;
• Collezione di partenza: Attori e attrici
• Si usa la class FileSetDocumentCollection: che permette di costruire e serializzare un insieme di documenti specificati mediate il nome del file
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 13
Addizionare al CLASSPATH
• DIR=mg4j-dependencies• CLASSPATH=.:$DIR/BeanShell/bsh-2.0b2.jar:$DIR/mg4j-2.0.1.jar:
$DIR/colt-1.2.0.jar:$DIR/jakarta-commons-collections-3.1.jar:$DIR/jakarta-commons-configuration-1.2.jar:$DIR/jal-20031117.jar:$DIR/jsap-2.0.jar:$DIR/mysql-connector-java.jar:$DIR/fastutil5-5.0.9.jar:$DIR/jakarta-commons-io-1.2.jar:$DIR/javacc-4.0.jar:$DIR/libreadline-java.jar:$DIR/pdfbox-0.7.1.jar:$DIR/gnu.getopt.jar:$DIR/jakarta-commons-lang-2.1.jar:$DIR/javamail/mailapi.jar:$DIR/servletapi5.jar:$DIR/jaf.jar:$DIR/jakarta-commons-logging-1.1.jar:$DIR/jetty5/jetty5.jar:$DIR/mstor.jar:$DIR/tagsoup.jar:$DIR/log4j-1.2.14.jar:$DIR/velocity-1.4.jar:$DIR/classpathx-jaf-1.0.jar:$DIR/tomcat5-servlet-2.4-api-5.5.23.jar:$DIR/xalan-j2-serializer-2.7.0.jar
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 14
Costruzione della prima collezione di documenti
• java it.unimi.dsi.mg4j.document.FileSetDocumentCollection --help
• FileDocumentFactory –e <encoding> –f <factory> <collection-name>
• find Attori_e_attrici/ -iname \*.html -type f | java it.unimi.dsi.mg4j.document.FileSetDocumentCollection -f it.unimi.dsi.mg4j.document.HtmlDocumentFactory -p encoding=UTF-8 actors.collection
• find: e’ un comando linux che fornisce la lista dei file contenuti nella directory specificata. Restituisce un file per ogni linea.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 15
La collezione di documenti
• La collezione actors.collection non contiene i file, ma soltanto i loro nomi (riferimenti).
• L’inserimento o la cancellazione di file nell’insieme di documenti che vogliamo indicizzare, rende inconsistente la collezione.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 16
Informazioni sulla collezione
• BeanShell: java source interpreter
• java bsh.Interpreter• bsh % t = load(“actors.collection");• bsh % print (t.size());• bsh % d = t.document(0);• bsh % print (d.title());• bsh % print (d.uri());• bsh % exit();
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 17
La BeanShell
• E’ una shell java che permette di eseguire frammenti di codice java in maniera interattiva.
• Utile per scrivere prototipi o per il test di applicazioni.
• Download e tutorial: http://www.beanshell.org/intro.html
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 18
Creazione dell’indice
• Index:– java it.unimi.dsi.mg4j.tool.IndexBuilder --help
• java it.unimi.dsi.mg4j.tool.IndexBuilder --downcase -S actors.collection mycollection
• --downcase: tutti i termini vengono considerati minuscoli (case folding)
• -S: specifica la collection generata al punto precedente. Se non specificata, IndexBuilder legge lo standard input
• mycollection: basename che vogliamo assegnare all’indice.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 19
Fasi dell’indicizzazione
• Passo 0 (opzionale): costruisce il dizionario dei termini. Genera i file basename.index e basename.properties
• Passo 1: costruisce l’indice invertito:doc1: pos1,.., posM
• Passo intermedio (opzionale): produce un ordinamento lessicografico dei termini nell’indice.
• Passo 2: sceglie il metodo di compressione e crea il basename.index ed inserisce altre voci in basename.properties
-e specifica il metodo di compressione (attualmente implementati -code, -code, golub)
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 20
Struttura dell’indice
• mycollection-{text,title}.terms: un file di testo contenente l’intero dizionario, un termine per riga, ordinato secondo l’indice– more mycollection-text.terms
• mycollection-{text,title}.frequencies: per ciascun termine, il numero di documenti in cui tale termine appare (codificato in -code)
• mycollection-{title,text}.sizes: contiene, per ciascun documento indicizzato, la corrispondente dimensione (=numero di parole) in - code.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 21
Struttura dell’indice (2)
• mycollection{text,title}.globcounts: per ciascun termine, viene memorizzato il numero di occorrenze in -code.
• mycollection{text,title}.offset: per ciascun termine, viene memorizzato l’offset in -code
• mycollection-{text,title}.batch<i>: quando la memoria e’ piena di termini, viene effettuata una copia codificata in -code in un file batch e viene iniziata una nuova lista. Alla fine del processo, i file di batch vengono uniti.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 22
Struttura dell’indice (3)
• mycollection{text,title}.stats: raccoglie alcune statistiche sull' indicizzazione
• mycollection{text,title}.index: l’indice invertito in -code.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 23
Struttura dell’indice (4)
• mycollection{text,title}.properties: contiene alcuni dati relativi al processo di indicizzazione:
• Documents: numero di documenti nella collection; • Terms: numero di termini indicizzati; • Occurrences: numero di parole nell’intera collection; • Batches: numero di batch file generati; • Maxdocsize: massima dimensione di un documento (parole);• termprocessor: il term processor (se presente) usato durante la
costruzione: ad esempio DowncaseTermProcessor; • Occsperbatch: massimo numero di occorrenze in ciascun batch; • Permutation: nome del file di premutazione usato.
– More mycollection-text.properties– ls –lh mycollection
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 24
Il Web Server
• Query: it.unimi.dsi.mg4j.query.Query [--help] [(-c|--collection) <collection>] [(-t|--titleList) <titleList>] [-n|--no-sizes] [-h|--http] [(-i|--itemclass) <itemClass>] [(-m|--item-mime-type) <itemMimeType>][(-p|--port) <port>]basenameWeight1 basenameWeight2 ... basenameWeightN
• java it.unimi.dsi.mg4j.query.Query --help• java it.unimi.dsi.mg4j.query.Query -h -i
it.unimi.dsi.mg4j.query.FileSystemItem -c actors.collection mycollection-text mycollection-title
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 25
Interrogazione dell’indice
• Interprete a linea di comando• Web page : http://localhost:4242/Query
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 26
Interrogazioni semplici
• Ricerca delle occorrenze di una parola– EX: attorettore– EX: attrice
• AND: scrivendo piu’ termini separati da AND (o &) si ottengono i documenti che contengono tutte le parole specificate;– EX: claudia & pandolfi & pandolfi
• OR: restituisce i documenti che contengono almeno una delle parole separate da OR (o |);– EX: pandolfi | gerini | gerini
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 27
Interrogazioni semplici (2)
• NOT: restituisce i documenti che non contengono la parola preceduta da NOT (o !);– EX: claudia & !pandolfi & !pandolfi
• Parentesi: le parentesi sono usate per definire le priorita’ nella query
• EX: claudia & (pandolfi | gerini) & (pandolfi | gerini)
• FraseFrase: le parole messe fra “ “ appaiono consecutivamente nelle documenti ritornati– EX: “invia questa” | “ricerca avanzata”
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 28
Interrogazioni con asterisco (wildcard)
• Prossimita’:Prossimita’: si puo` limitare la distanza massima fra si puo` limitare la distanza massima fra un insieme di paroleun insieme di parole– EX: (claudia attrice)~3
• AsteristicoAsteristico: * serve per specificare una qualunque sequenza di caratteri– EX: att*
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 29
Interrogazioni complesse
• MG4J fornisce sofisticati meccanismi di tuning delle query.
• Gli scorer permettono di riordinare i documenti ottenuti in risposta ad una interrogazione in base a un dato criterio.
• Per sfruttare queste possibilità occorre usare l’interfaccia a linea di comando.
• $ --- Mostra le opzioni disponibili• $mode -- Seleziona la modalità di presentazione del
risultato
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 30
Interrogazioni complesse
• $score -- Seleziona uno scorer per i documenti
es. $score BM25Scorer VignaScorer
• $mplex on -- Determina l’indirizzamento della query a tutti gli indici disponibili
• $weigth – Cambia il peso degli indici
es. $weigth text:1 title:3
• $selector -- Seleziona max numero di intervalli e massima lunghezza di ogni intervallo.
es. $selector 3 40
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 31
Scorer: esempi
• Opzione di default: BM25Scorer + VignaScorer
• $score BM25Scorer VignaScorer
• ConstantScorer
• $score ConstantScorer
• Uno scorer che assegna uno score costante (0 di default) a
tutti i documenti
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 32
Scorer: esempi (2)
• CountScorer: uno scorer molto semplice che conta il
numero di occorrenze di ogni termine all'interno del
documento corrente moltiplicato per il peso del
relativo indice
• $score CountScorer
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 33
Scorer: esempi (3)
• TfIdfScorer: uno scorer che implementa la formula di
ranking TF/IDF. Il peso assegnato ad un documento
che, in una collezione di N documenti, appare in f
documenti, e`, per un documento di lunghezza l in cui
il termine appare c volte:
• log(N/f) c /l
• $score TfIdfScorer
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 34
Score: esempi (4)
• DocumentRankScorer: Assegna un punteggio fisso
ad ogni documento. Gli score sono letti da un file il
cui nome deve essere passato al costruttore.
• $score DocumentRankScorer
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 35
Indicizzazione dei campi virtuali
• Come primo passo occorre costruire un document resolver che sia in grado di tradurre le document spec prodotte per il campo anchor di ogni documento HTML in riferimenti a documenti della collezione.
• URLMPHVirtualDocumentResolver trasforma le URL in riferimenti a documenti.
• Il comando
java it.unimi.dsi.mg4j.tool.ScanMetadata -S actors.collection -u actors.urls
permette di costruire l’elenco delle URL dei documenti che appartengono alla collezione.
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 36
Indicizzazione dei campi virtuali
• java it.unimi.dsi.mg4j.tool.URLMPHVirtualDocumentResolver -o actors.urls actors-anchor.resolver
costruisce il resolver di cui abbiamo bisogno per indicizzare il campo anchor.
• Ora possiamo ricostruire l’indice chiedendo esplicitamente l’indicizzazione dei campi virtuali:
java it.unimi.dsi.mg4j.tool.IndexBuilder -a -v anchor:actors-anchor.resolver --downcase -S actors.collection mycollection
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 37
Interrogazioni sul campo anchor
• A questo punto possiamo riavviare il query engine e
sottomettere query che richiedono i documenti che
soddisfano determinate condizioni anche nel campo
anchor
• java it.unimi.dsi.mg4j.query.Query -h -i
FileSystemItem -c actors.collection mycollection-text
mycollection-title mycollection-anchor
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 38
Utilizzo dei gap virtuali
• Per evitare la restituzione di documenti che
contengono i termini della query in ancore differenti,
si puo` imporre una prossimita` dei termini tenendo
conto dello spazio virtuale (numero di parole vuote)
lasciato tra due frammenti consecutivi.
• es. (claudia AND attrice)~64
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 39
Specificare gap virtuali differenti
• Si possono ottenere falsi negativi se la lunghezza di
qualche ancora e` maggiore di quella scelta per lo spazio
virtuale. In fase di indicizzazione e` possibile specificare
una differente lunghezza per il gap virtuale.
• java it.unimi.dsi.mg4j.tool.IndexBuilder -a -g anchor:100 -v
anchor:mycollection-anchor.resolver –downcase -S
actors.collection mycollection
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 40
Realizzazione della mappa dei termini
• Il più semplice tipo di rappresentazione di un
dizionario è la lista dei termini: un file di testo
contentente un termine su ogni riga.
Esempio: file .terms
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 41
Rappresentazione del dizionario
• Una rappresentazione più efficiente può essere ottenuta
attraverso l’uso di una MPH (Unsigned Minimal Perfect
Hash), una struttura dati molto efficiente che può essere
utilizzata per rispondere alla domanda: “Qual è l’indice del
termine XXX ?”
• java it.unimi.dsi.mg4j.util.MinimalPerfectHash -s -o
basename.terms basename.mph
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 42
Rappresentazione del dizionario
• La struttura Unsigned Minimal Perfect Hash è in grado di rispondere
correttamente alla domanda “ Qual è l’indice del termine XXX” solo per I termini
che compaiono veramente nel dizionario. Se si ha bisogno non solo di mappare
i termini in indici ma anche di determinare se un termine è davvero presente nel
dizionario occorre usare la struttua SMPH (Signed Minimal Perfect Hash)
java it.unimi.dsi.mg4j.util.MinimalPerfectHash -c
it.unimi.dsi.mg4j.util.HashCodeSignedMinimalPerfectHash -s -o
basename.terms basename.smph
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 43
Minimal Perfect Hash: esempio di utilizzo
• import it.unimi.dsi.fastutil.io.BinIO;
• import it.unimi.dsi.mg4j.util.MinimalPerfectHash;
• MinimalPerfectHash myMap = (MinimalPerfectHash)
BinIO.loadObject("basename.mph");
• int pos = myMap.getNumber(“pippo”);
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 44
Signed Minimal Perfect Hash: esempio di utilizzo
• import it.unimi.dsi.fastutil.io.BinIO;
• import it.unimi.dsi.mg4j.util.MinimalPerfectHash;
• MinimalPerfectHash myMap = (MinimalPerfectHash)
BinIO.loadObject("basename.smph");
• int pos = myMap.getNumber(“pippo”);
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 45
Mappa dei termini
• Per rispondere ad una wildcard query occorre utilizzare una term map, una struttura dati che è in grado di rispondere efficientemente alla domanda “Qual è l’indice dei termini che iniziano con XXX”. Se i termini sono ordinati lessicograficamente la risposta è costituita da due interi, gli indici del primo e dell’ultimo termine che soddisfano la proprietà.
java it.unimi.dsi.mg4j.util.ImmutableExternalPrefixDictionary -b4Ki -o basename.urls basename.dict
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 46
Term Map: esempio di utilizzo
• La mappa costruita consente di effettuare il mapping tra termini e indici in
entrambe le direzioni.
• import it.unimi.dsi.fastutil.io.BinIO;
• import it.unimi.dsi.mg4j.util.ImmutableExternalPrefixDictionary;
• ImmutableExternalPrefixDictionary ext =
(ImmutableExternalPrefixDictionary)BinIO.loadObject("termini.dict");
Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 47
Esercizio
• Ripetere l'esercitazione utilizzando la collezione
HTMLDIS.
Top Related