stemmer spanish porter español algoritmo php nlp stemming snowball porter-stemmer

php - spanish - Algoritmo de Stemming que produce palabras reales



stemming español python (3)

Oye, no sé si es demasiado tarde, pero solo hay un script de PHP que produce palabras reales: http://phpmorphy.sourceforge.net/ - me llevó años encontrarlo. Todos los otros stemmers deben ser compilados e incluso después de eso solo funcionan de acuerdo con el algoritmo Porter, que produce tallos, no lemas (es decir, community = communiti). PhpMorphy one funciona perfectamente, 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 de Google translate y debería ser fácil.

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

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

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

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

He intentado con "Bola de nieve" (sugerido en otro hilo de desbordamiento de pila).

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

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

Pregunta

¿Hay algún otro algoritmo de derivación 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 ser la palabra real que se mostrará.


Si entiendo correctamente, entonces lo que necesita no es un lematizador sino un lematizador. Lemmatizer es una herramienta con conocimiento sobre terminaciones como -ies , -ed , etc., y palabras excepcionales como escrito , etc. Lemmatizer mapea la palabra de entrada a su lema, que se garantiza que es una palabra "real".

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


El problema central aquí es que los algoritmos de derivación operan sobre una base fonética puramente basada en las reglas de deletreo 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 tallo con alguna forma de función de búsqueda para convertir los tallos en palabras reales. Básicamente, puedo ver dos formas posibles de hacer esto:

  1. Ubique o cree un gran diccionario que asigne cada vástago posible a una palabra real. (p. ej., communiti -> comunidad)
  2. Cree una función que compare cada raíz con una lista de las palabras que se redujeron a esa raíz e intenta determinar cuál es la más similar. (por ej., comparando "communiti" contra "comunidad" y "comunidades" de tal manera que la "comunidad" será reconocida 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 su origen y asumiendo que la palabra más común es la que debería ser usado. (Por ejemplo, si mi cuerpo de texto fuente usa "comunidades" más a menudo que "comunidad", entonces mapee communiti -> comunidades.) Un enfoque basado en diccionario será más preciso en general y construirlo en base a la entrada del generador proporcionará resultados personalizado para sus textos, con el principal inconveniente es el espacio requerido, que generalmente no es un problema en estos días.