G.Morreale
"Forse Cercavi: Java"
- Minimum Edit distance: Calcolare il numero di inserimenti, cancellazioni e sostituzioni necessarie a trasformare una stringa(Quella presupposta erronea) in un'altra(quella presupposta corretta)
- Similiarity Key: Basato su un dizionario dove sotto la stessa chiave ci sono le stringhe similiari.
- Letter n-gram: n indica il numero di lettere all'interno di una sotto-sequenza di una parola. Es. 3-grams per la parola lucene "luc", "uce", "cen","ene". Confrontare due n-gram può dare con buona approssimazione un suggerimento. Per approfondimenti (http://en.wikipedia.org/wiki/N-gram)
- Scrittura del dizionario
- Ricerca all'interno del dizionario
- IndexMaker
- BaseIndexMaker
- SpellIndexMaker
- SearchResult
- SearchEngine
- SimpleSearchEngine
- SuggestAndSeachEngine
List<Query> suggested = se.suggest(sentence, 2);
//stampa query suggerite
System.out.println(suggested);
//Se esiste almento un suggerimento..
if (suggested != null && suggested.size() > 0)
{
//effettuiamo una nuova ricerca con la prima query suggerita
res = se.search(suggested.get(0));
i = 1;
//stampa risultati con la nuova query.
for (SearchResult s : res)
{
System.out.println(i++ + "° " + s.getDoc().get("descrizione") + " - " + s.getScore());
}
}
public String[] suggestSimilar(String arg0, int arg1, IndexReader arg2, String arg3, boolean arg4) throws IOException
Questo overloading è possibile avvalersi di due criteri per l'ottenimento dei risultati.
- La distanza di editing tra l'input e il suggerimento
- La popolarità del suggerimento all'interno dell'indice originale (ribadisco: non nel dizionario).
public abstract TokenStream tokenStream(String arg0, Reader arg1)
Ci consente di navigare tra i token ottenuti.
Bene, visto però che il metodo suggest realizzato nella classe SuggestAndSearchEngine ritorna diverse Query(diversi suggerimenti), è opportuno creare un metodo suggest in grado di ottenere un solo suggerimento per input.
Tale metodo sarà di supporto al metodo finale suggestComposite la cui realizzazione è obiettivo del paragrafo.
Ne incollo l'implementazione (Da inserire nella classe SuggestAndSearchEngine )
/** * Data una singola parola è in grado di generare il suggerimento * @param word - input su cui generare il suggerimento * @return - Il suggerimento, esso viene proposto sottoforma di Term in modo * da permettere la costruzione di Query composte da più termini */ public Term suggest(String word) { Term term = null; try { //Inizializzazione oggetto chiave del metodo! SpellChecker spellChecker = new SpellChecker(spellDictionaryDir); //Se la query string esiste nel dizionario vuol dire che non ha //senso cercare un suggerimento! if (!spellChecker.exist(word)) { //ricerca di parole similiari all'interno del dizionario IndexReader indexReader = IndexReader.open(indexDirectory); String[] similiarWords = spellChecker.suggestSimilar(word, 1,indexReader,defaultField,true); //String[] similiarWords = spellChecker.suggestSimilar(word, 1); if (similiarWords.length != 0) { //data la parole similiari si procede alla costruzione del Term term = new Term(defaultField, similiarWords[0]); } } } catch (IOException ex) { Logger.getLogger(SuggestAndSeachEngine.class.getName()).log(Level.SEVERE, null, ex); } finally { return term; } }
Anche il metodo suggestComposite per semplicità fornisce un solo suggerimento per input.
Ecco la firma del metodo
public Query suggestComposite(String queryString)
- Suddivide in token l'input
- Per ogni token richiede un suggerimento
- Concatena i vari suggerimenti all'interno di una query (tale query è una PhraseQuery, addatta alla composizione con più termini)
5 comments:
La ringrazio per Blog intiresny
molto intiresno, grazie
Fieldname è il nome del campo su cui vuoi operare.
i campi sono all'interno del document
Corrisponde al particolare campo che vuoi indicizzare
Se non ricordo male (è passato tanto tempo dall'ultima volta che ho usato lucene)
dovrebbe generare una sorta di secondo indice(il dizionario) necessario allo spell checking.
questa generazione viene fatta su un campo ben preciso che è quello che indichi nel parametro fieldname.
serve appunto a generare il dizionario su quel particolare campo.
quale campo utilizzare lo devi stabilire tu in base alla struttura del tuo particolare documento.
Se il tuo documento ha i seguenti campi:
comune, provincia, stato
e devi proporre i suggerimenti su comune (es. su input mil4no suggerisci milano) devi usare il campo comune.
---
lascia la tua mail su un commento e ti contatto ormai penso domani.
Post a Comment