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)