2012-02-15 14 views
5

Necesito segmentar palabras de un texto. Algunas veces, las palabras con guiones se escriben sin guiones y las palabras con apóstrofo se escriben sin apóstrofo. También hay problemas similares, como problemas de ortografía diferentes de las mismas palabras (por ejemplo, color, color) o una sola palabra que se escriben con espacios entre ellos (por ejemplo: hasta, hasta, espacio en blanco, espacio en blanco). Necesito agrupar estas variantes como una sola representación e insertarla en un conjunto/hashmap o en otro lugar. También puede haber problemas con palabras de caracteres acentuados escritos sin caracteres de acento (aunque todavía no los he enfrentado). Actualmente, corta las palabras en cualquier carácter del espacio en blanco y todas las no alfanuméricas, y luego las detiene, y omite las palabras de alto.Segmentar palabras y agrupar palabras con guiones y apóstrofos del texto

Estos índices se usarán más adelante para comprobar la similitud de documentos y buscarlos, etc. ¿Alguna sugerencia de cómo puedo combatir estos problemas? He pensado en una idea para unir la palabra escaneada con una lista de palabras, pero el problema es que se omitirán los nombres propios y las palabras que no sean del diccionario.

Info: Mi código es en Java

+0

¿no es esto lo que hace un motor de búsqueda? ¿No podrías instalar say Apache Solr y luego ejecutarlo sobre tus archivos para realizar esta tarea? O perdí algo? – PurplePilot

+0

@PurplePilot: Necesito hacer el procesamiento de forma manual, por lo que puede sugerir una API o algoritmos relacionados. – phoxis

+0

se podía probar este http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot

Respuesta

3

Creo que se debe aplicar una combinación de técnicas.

1) Para las variantes de ortografía comunes iría con un método basado en el diccionario. Como son comunes, no me preocuparía perder palabras que no sean del diccionario. Eso debería resolver el problema de color/color.

2) Para los errores tipográficos y otras variantes de ortografía no estándar, puede aplicar el algoritmo Metaphone (http://en.wikipedia.org/wiki/Metaphone) para convertir los tokens en una representación de sus pronunciaciones en inglés. Las variantes similares suenan de forma similar, por lo que puedes unirlas entre sí (por ejemplo, Jon a John). También puede usar algoritmos de coincidencia de edición de distancia durante la consulta para hacer coincidir tokens muy similares con solo un par de caracteres yuxtapuestos o un carácter descartado (por ejemplo, Huseyin versus Housein).

3) Para palabras de apóstrofo y compuesto con guión intermedio, puede almacenar ambas variantes. Por ejemplo, "John's" se indexaría como "John s" y "Johns". "espacio en blanco" puede convertirse a (o almacenado junto con) "espacio en blanco" y "espacio en blanco".

4) Para palabras compuestas sin ningún guion intermedio, puede usar una biblioteca externa como la clase HyphenationCompoundWordTokenFilterFactory de Solr (http://lucene.apache.org/solr/api/org/apache/solr/analysis/ HyphenationCompoundWordTokenFilterFactory.html). Aunque puede usar un diccionario, no tiene por qué. Está dirigido a tratar con palabras compuestas que se encuentran con frecuencia en alemán y otros idiomas similares. No veo ninguna razón por la cual no puedas aplicarlo al inglés (necesitarás proporcionar un diccionario de inglés y archivos de reglas de separación por sílabas).

En realidad, el último punto plantea una pregunta importante. No creo que estés preparado para construir tu propia biblioteca de búsqueda desde cero. Si eso es cierto, ¿por qué no utilizas Lucene (o Solr, que se basa en Lucene), una biblioteca de búsqueda basada en Java que ya tiene los métodos y las formas de lidiar con estos problemas? Por ejemplo, la técnica de inyección le permite indexar el color y el color en el mismo lugar en un documento; por lo tanto, no importa si busca "coches de colores" o "autos de colores" (suponiendo que se ocupa de la derivación). Hay filtros que hacen la indexación fonética (http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html). Incluso hay un componente FuzzyQuery que le permite permitir una cierta cantidad de distancia de edición para que coincida con términos similares (http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/ search/FuzzyQuery.html)

También deberá decidir en qué punto desea tratar estos problemas: Un enfoque extremo es indexar todas las variantes posibles de estos términos durante la indexación y usar las consultas tal como están.Esto mantendrá el procesamiento de consultas ligero, pero le costará un índice más grande (debido a todas las variantes que necesita almacenar). El otro extremo es indexar los documentos tal como están y expandir las consultas durante la búsqueda. Eso le permitirá mantener su índice pobre al costo de un procesamiento de consultas más pesado. La indexación fonética requerirá que procese sus dos documentos durante la indexación y las consultas durante la búsqueda. La coincidencia difusa solo sería factible durante el tiempo de búsqueda porque, presumiblemente, no podría almacenar todas las variantes de edición de todos los términos en el índice.

Cuestiones relacionadas