mg4j – managing gigabytes for java indicizzazione ed interrogazione di una collezione di documenti...

Post on 01-May-2015

216 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

MG4J – Managing GigaBytes for Java

Indicizzazione ed interrogazione di una collezione di documenti

Esercitazione

Ilaria Bordino

Yahoo! Research, 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

CLASSPATH• Scaricare e scompattare MG4J http://mg4j.dsi.unimi.it/mg4j-4.0-bin.tar.gz

e le dipendenze necessarie: http://mg4j.dsi.unimi.it/mg4j-deps.tar.gz

Copiare tutti i file .jar in una directory a vostra scelta

Scrivere in un file set-classpath.sh le righe seguenti:

• export DIR= your_directory

• export CLASSPATH=.:$DIR/dsiutils-2.0.jar:$DIR/fastutil-6.4.jar:$DIR/fontbox-1.4.0.jar:$DIR/jakarta-commons-collections-3.2.1.jar:$DIR/jakarta-commons-configuration-1.4.jar:$DIR/jakarta-commons-digester-1.8.jar:$DIR/jakarta-commons-io-1.4.jar:$DIR/jakarta-commons-lang-2.3.jar:$DIR/jakarta-commons-logging-1.1.jar:$DIR/javacc-5.0.jar:$DIR/jetty6-6.1.14.jar:$DIR/jetty6-html-6.1.14.jar:$DIR/jetty6-util-6.1.14.jar:$DIR/jsap-2.1.jar:$DIR/junit4-4.5.jar:$DIR/log4j-1.2.14.jar:$DIR/mailapi-1.3.1.jar:$DIR/mg4j-4.0.jar:$DIR/pdfbox-1.4.0.jar:$DIR/sux4j-3.0.jar:$DIR/tagsoup-1.0.1.jar:$DIR/tika-core-0.7.jar:$DIR/tika-parsers-0.7.jar:$DIR/tomcat5-servlet-2.4-api-5.5.27.jar:$DIR/velocity-1.5.jar:$DIR/velocity-tools-1.4.jar

• source set-classpath.sh per settare il classpath nella shell corrente (per settaggio permanente aggiungere le righe sopra al .bashrc)

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 -name *.html | 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’itero 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 monotone minimal perfect hash

function, una struttura dati molto compatta che può essere

utilizzata per rispondere alla domanda: “Qual è l’indice del

termine XXX ?”

• Tale mappa può essere costruita a partire da una lista ordinata

di termini

• java it.unimi.dsi.sux4j.mph.MinimalPerfectHashFunction

titles.mph mycollection-title.terms

Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 42

Rappresentazione del dizionario• La correttezza della risposta restituita da una MinimalPerfectHash è garantita solo per I

termini efffettivamente presenti nel dizionario. Se non si è sicuri che la struttura venga

interrogata utilizzando solo termini del dizionario, occorre utilizzare una funzione “firmata”,

che utlizza uno speciale valore di ritorno (-1) per segnalare il fatto che un termine non esiste

all’interno della mappa.

java it.unimi.dsi.util.ShiftAddXorSignedStringMap titles.mph titles.map

mycollection-title.terms

Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 43

Esempio di utilizzo

• import it.unimi.dsi.fastutil.io.BinIO;

• import it.unimi.dsi.fastutil.objects.Object2LongFunction;;

• Object2LongFunction<? extends CharSequence> url2node =

• (Object2LongFunction<? extends CharSequence>)

BinIO.loadObject( "titles.mph" );

• long node = url2node.getLong(“audrey”);

Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 44

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 mycollection-title.terms mycollection-title.dict

Ilaria BordinoMG4J -- Managing GigaBytes for Java Pagina 45

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 46

Esercizio

• Ripetere l'esercitazione utilizzando la collezione

HTMLDIS.

top related