2012-02-15 12 views
5

Devo segmentare le parole da un testo. Alcune volte le parole trattate con trattino sono scritte senza trattini e le parole apostrofo sono scritte senza apostrofo. Ci sono anche problemi simili come problemi di ortografia di parole diverse (es: colore, colore) o parola singola che sono scritti con spazi tra loro (es: fino a, fino a, spazio vuoto, spazio vuoto). Devo raggruppare queste varianti come un'unica rappresentazione e inserirla in un set/hashmap o in un altro posto. Ci possono essere anche problemi con parole accentate di caratteri scritte senza caratteri di accento (anche se non li ho ancora affrontati). Attualmente e tagliando le parole a qualsiasi carattere di spazio vuoto e ogni non alfanumerico, quindi li interrompono e omettono le parole di fine.Segmentare le parole e raggruppare le parole sillabate e apostrofare dal testo

Questi indici verranno in seguito utilizzati per il controllo della somiglianza dei documenti e la ricerca ecc. Qualche suggerimento come posso combattere questi problemi? Ho pensato ad un'idea per abbinare la parola scansionata con una lista di parole, ma il problema è che i nomi propri e le parole senza dizionario saranno omessi.

Info: Il mio codice è in Java

+0

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

+0

@PurplePilot: ho bisogno di eseguire l'elaborazione manualmente, quindi è possibile suggerire un'API o algoritmi correlati. – phoxis

+0

si potrebbe provare questo http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot

risposta

3

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.

Problemi correlati