Credo che si dovrebbe applicare una combinazione di tecniche.
1) Per le varianti di ortografia comuni, sceglierei un metodo basato sul dizionario. Dal momento che sono comuni, non mi preoccuperei di perdere le parole senza dizionario. Questo dovrebbe risolvere il problema del colore/colore.
2) Per gli errori di battitura e altre varianti di ortografia non standard è possibile applicare l'algoritmo Metaphone (http://en.wikipedia.org/wiki/Metaphone) per convertire i token in una rappresentazione delle loro pronunce inglesi. Le varianti simili suonano in modo simile, quindi è possibile abbinarle tra loro (ad esempio, da Jon a John). È inoltre possibile utilizzare algoritmi di corrispondenza basati sulla modifica della distanza durante la query per associare i token molto simili con solo una coppia di caratteri giustapposti o un carattere scartato (ad esempio, Huseyin versus Housein).
3) Per l'apostrofo e le parole composte con trattino intermedio, è possibile memorizzare entrambe le varianti. Ad esempio, "John's" verrebbe indicizzato sia come "John s" che come "Johns". "spazio vuoto" può essere convertito in (o memorizzato insieme a) "spazio vuoto" e "spazio vuoto".
4) Per le parole composte senza trattini intermedi, è possibile utilizzare una libreria esterna come la classe HyphenationCompoundWordTokenFilterFactory di Solr (http://lucene.apache.org/solr/api/org/apache/solr/analysis/ HyphenationCompoundWordTokenFilterFactory.html). Sebbene possa usare un dizionario, non è necessario. È mirato ad affrontare le parole composte che si incontrano frequentemente in tedesco e lingue simili. Non vedo alcun motivo per cui non è possibile applicarlo in inglese (è necessario fornire un dizionario inglese e file di regole di sillabazione).
In realtà, l'ultimo punto solleva una domanda importante. Non penso che tu voglia creare da zero la tua libreria di ricerca. Se è vero perché non usi Lucene (o Solr, che è basato su Lucene), una libreria di ricerca basata su Java che ha già i metodi e i modi per affrontare questi problemi? Ad esempio, la tecnica di iniezione consente di indicizzare sia il colore che il colore nella stessa posizione in un documento; quindi non importa se cerchi "auto colorate" o "auto colorate" (supponendo che tu abbia cura di arginare). Ci sono filtri che fanno l'indicizzazione fonetica (http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html). Esiste anche un componente di FuzzyQuery che consente di consentire una certa quantità di distanza di modifica per abbinare termini simili (http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/ search/FuzzyQuery.html)
Sarà inoltre necessario decidere a quale punto si desidera affrontare questi problemi: Un approccio estremo è quello di indicizzare tutte le possibili varianti di questi termini durante l'indicizzazione e utilizzare le query così come sono.Ciò manterrà la tua elaborazione delle query leggera, ma ti costerà un indice più grande (a causa di tutte le varianti che devi memorizzare). L'altro estremo è quello di indicizzare i documenti così come sono e di espandere le query durante la ricerca. Ciò ti consentirà di mantenere l'indice al livello di elaborazione delle query più pesante. L'indicizzazione fonetica richiede di elaborare entrambi i documenti durante l'indicizzazione e le query durante la ricerca. La corrispondenza fuzzy sarebbe fattibile solo durante il tempo di ricerca perché, presumibilmente, non sarebbe possibile memorizzare tutte le varianti di modifica di tutti i termini nell'indice.
fonte
2012-02-18 23:51:35
Non è questo ciò che fa un motore di ricerca? non potresti installare Apache Solr e poi eseguirlo sui tuoi file per eseguire il task tbnis? O mi sono perso qualcosa? – PurplePilot
@PurplePilot: ho bisogno di eseguire l'elaborazione manualmente, quindi è possibile suggerire un'API o algoritmi correlati. – phoxis
si potrebbe provare questo http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot