Pregunta

Necesito tomar un párrafo de texto y extraer de él una lista de "etiquetas". La mayor parte de esto es bastante sencillo. Sin embargo, ahora necesito ayuda para detener la lista de palabras resultante para evitar duplicados. Ejemplo: Comunidad / Comunidades

He usado una implementación del algoritmo Porter Stemmer (por cierto, estoy escribiendo en PHP):

http://tartarus.org/~martin/PorterStemmer/php.txt

Esto funciona, hasta cierto punto, pero no devuelve "real" palabras. El ejemplo anterior se deriva de "commun".

He intentado " Snowball " (sugerido dentro de otro hilo de desbordamiento de pila).

http://snowball.tartarus.org/demo.php

Para mi ejemplo (comunidad / comunidades), Snowball se deriva de "communiti".

Pregunta

¿Hay algún otro algoritmo derivado que haga esto? ¿Alguien más ha resuelto este problema?

Mi pensamiento actual es que podría usar un algoritmo de derivación para evitar duplicados y luego elegir la palabra más corta que encuentre para que sea la palabra real para mostrar.

¿Fue útil?

Solución

El problema central aquí es que los algoritmos de derivación funcionan sobre una base fonética puramente basada en las reglas de ortografía del idioma sin una comprensión real del idioma con el que están trabajando. Para producir palabras reales, probablemente tendrá que fusionar la salida del stemmer con alguna forma de función de búsqueda para convertir los tallos de nuevo en palabras reales. Básicamente puedo ver dos formas potenciales de hacer esto:

  1. Localice o cree un diccionario grande que mapee cada posible raíz de nuevo a una palabra real. (p. ej., communiti - > community)
  2. Cree una función que compare cada raíz con una lista de las palabras que se redujeron a esa raíz e intente determinar cuál es la más similar. (por ejemplo, comparar "communiti" con "comunidad" y "comunidades" de tal manera que "comunidad" se reconozca como la opción más similar)

Personalmente, creo que la forma en que lo haría sería una forma dinámica de # 1, construyendo una base de datos de diccionario personalizada al registrar cada palabra examinada junto con lo que se deriva y luego asumir que la palabra más común es la eso debería ser usado. (p. ej., si mi cuerpo de texto fuente usa '' comunidades '' más a menudo que '' comunidad '', entonces mapee comunidades - > comunidades). Un enfoque basado en el diccionario será más preciso en general y se construirá en función de la información de entrada proporcionará resultados personalizados a sus textos, con el inconveniente principal de ser el espacio requerido, que generalmente no es un problema en estos días.

Otros consejos

Si entiendo correctamente, entonces lo que necesita no es un stemmer sino un lemmatizer. Lemmatizer es una herramienta con conocimiento sobre finales como -ies , -ed , etc., y formas de palabras excepcionales como escrito , etc. Lemmatizer asigna el ingrese la forma de palabra a su lema, que se garantiza que es un "real" palabra.

Hay muchos lematizadores para inglés, aunque solo he usado morpha . Morpha es solo un gran archivo lex que puedes compilar en un ejecutable. Ejemplo de uso:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

Puede obtener morpha de http: // www .informatics.sussex.ac.uk / research / groups / nlp / carroll / morph.html

Oye, no sé si tal vez sea demasiado tarde, pero solo hay un script derivado de PHP que produce palabras reales: http: // phpmorphy .sourceforge.net / & # 8211; & nbsp; me llevó mucho tiempo encontrarlo. Todos los demás stemmers deben compilarse e incluso después de eso solo funcionan de acuerdo con el algoritmo de Porter, que produce tallos, no lemas (es decir, comunidad = comunidad). PhpMorphy one funciona perfectamente bien, es fácil de instalar e inicializar, y tiene diccionarios de inglés, ruso, alemán, ucraniano y estonio. También viene con un script que puede usar para compilar otros diccionarios. La documentación está en ruso, pero póngala a través del traductor de Google y debería ser fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top