Introduzione:
Negli articoli predenti abbiamo visto come usare lucene per effettuare delle ricerche semplici e delle ricerche con correzioni ortografiche.
In questo articolo invece voglio mostravi l'uso di wordnet al fine di espandere le proprie ricerche sui sinonimi di una determinata parola.
Se ad esempio viene effettua una ricerca sul nostro indice per la parola "big" e la ricerca non và a buon fine possiamo rieffettuare la ricerca espandendola per tutti i sinonimi di "big", ovvero: "large, prominent, heavy, great" etc.
WordNet
Per far ciò bisogna innanzitutto avere wordnet.
Wordnet non è altro che un insieme di informazioni relative alle parole di un vocabolario (in questo caso inglese) correlate tra loro attraverso il loro significato.(Per affrofondire: http://bit-cafe.blogspot.com/2008/04/wordnet.html)
Tali informazioni sono liberamente scaricabili da:http://wordnet.princeton.edu/
Una volta scaricato l'archivio esistono diversi file, alcuni di questi con estensione .pl.
Tali file sono in formato prolog.
L'unico file che ci interessa ai fini dell'articolo è win_s.pl
NOTA:
Esistono i corrispettivi archivi in altre lingue, ma ognuno ha una sua licenza:http://www.globalwordnet.org/gwa/wordnet_table.htm
Indice Lucene di Wordnet
Al fine di sfruttare le potenzialità di lucene sui dati scaricati da wordnet, è necessario costruire un indice lucene con i dati appena scaricati.
Per far ciò esiste un sorgente java all'interno del pacchetto di libreria di lucene che svolge tale compito
Scarichiamo i sorgenti di lucene e cerchiamo il file Syns2Index.java all'interno del package org.apache.lucene.wordnet situato nella directory contrib
Compiliamo tale file e lo eseguiamo a linea di comando passando 2 valori:
1) path dove memorizzare l'indice contenente la coppia parola - sinonimi
2) la path dove si trova il file win_s.pl
Dopo pochi secondi verrà creato l'indice lucene.
Il field indicizzato è "word"(Equivalente a Syns2Index.F_WORD), syn(Equivalente a Syns2Index.F_SYN) invece è il campo contenente i sinonimi.
Espansione della Query
All'interno dello stesso package in cui è presente Syns2Index, è presente un altra classe chiamata SynExpand.
Tale classe è di grande aiuto per l'espansione della query.
Infatti senza conoscere la struttura dell'indice creato partendo da wordnet, il metodo statico expand della classe SynExpand
riesce a calcolare una nuova query considerando i sinonimi della stringa passata come valore di input.
javadoc di SynExpand: http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/wordnet/SynExpand.html
I parametri di input del metodo statico SynExpand.expand prevedono:
- la stringa da espandere
- Un oggetto Searcher inizializzato a partire dall'indice creato su wordnet
- Un oggetto Analyzer
- La String contenente il field che nella costruzione della query espansa verrà considerato come field di ricerca.
- un float per il boosting dei sinonimi.
Il boast serve per dare un peso ai sinonimi rispetto alla parola principale.
es.
intendo effettuare una ricerca su big.
Prima di verificare se esiste nel mio indice, calcolo la ricerca espansa e indico come fattore di boost 0.5f in modo che la query espansa darà meno importanza ai sinonimi, ottenendo un risultato simile a questo:
contents:big contents:adult^0.5 contents:bad^0.5 contents:bighearted^0.5 contents:boastful^0.5 contents:boastfully^0.5 contents:bounteous^0.5 contents:bountiful^0.5 contents:braggart^0.5 contents:bragging^0.5 contents:braggy^0.5 contents:crowing^0.5 contents:enceinte^0.5
Conclusione
Con pochi e semplici passi è possibile potenziare il proprio motore di ricerca avvalendosi di query che tengono conto dei sinonimi dei termini che costituiscono una query ricerca.
Riferimenti:
http://wordnet.princeton.edu/obtain
http://www.tropo.com/techno/java/lucene/wordnet.html
3 comments:
Post a Comment