Probé PorterStemmer y Snowball, pero ninguno de los dos funciona con todas las palabras y faltan algunas muy comunes.
Mis palabras de prueba son: " gatos corriendo corrieron cactus cactus comunidades comunitarias de cactus ", y ambos aciertan menos de la mitad.
Ver también:
nlp
stemming
lemmatization
manixrock
fuente
fuente
Respuestas:
Si conoce Python, The Natural Language Toolkit (NLTK) tiene un lematizador muy poderoso que hace uso de WordNet .
Tenga en cuenta que si está utilizando este lematizador por primera vez, debe descargar el corpus antes de utilizarlo. Esto se puede hacer mediante:
Sólo tienes que hacerlo una vez. Suponiendo que ya ha descargado el corpus, funciona así:
Hay otros lematizadores en el módulo nltk.stem , pero no los he probado yo mismo.
fuente
dies
, te da endy
lugar dedie
. ¿No existe algún tipo de diccionario lematizador codificado?WordNetLemmatizer
lematizan incorrectamente?Utilizo Stanford nlp para realizar la lematización. Me he enfrentado a un problema similar en los últimos días. Todo gracias a stackoverflow por ayudarme a resolver el problema.
También puede ser una buena idea usar palabras vacías para minimizar los lemas de salida si se usan más adelante en el clasificador. Eche un vistazo a la extensión coreNlp escrita por John Conwell.
fuente
Probé su lista de términos en este sitio de demostración de bola de nieve y los resultados se ven bien ...
Se supone que un lematizador convierte las formas flexionadas de las palabras en una raíz común. No es realmente el trabajo de un lematizador hacer de esa raíz una palabra de diccionario "adecuada". Para eso necesitas mirar analizadores morfológicos / ortográficos .
Creo que esta pregunta se trata más o menos de lo mismo, y la respuesta de Kaarel a esa pregunta es de dónde tomé el segundo enlace.
fuente
Continúan los debates sobre el lematizador y el lematizador. Es cuestión de preferir la precisión a la eficiencia. Debe lematizar para lograr unidades lingüísticamente significativas y la raíz para usar un mínimo de jugo de computación y aún indexar una palabra y sus variaciones bajo la misma clave.
Ver Stemmers vs Lematizadores
Aquí hay un ejemplo con python NLTK:
fuente
WordNetLemmatizer
'lemmatize()
pueden tener una etiqueta POS. Entonces, de su ejemplo:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
da'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? Por cierto: mucho tiempo sin vernos, con suerte nos veremos en la conferencia pronto =)pos=VERB
solo haces lematización en verbos. Los sustantivos siguen siendo los mismos. Solo tuve que escribir algo de mi propio código para girar alrededor de las etiquetas POS de Penn Treebank reales para aplicar la lematización correcta a cada token. Además,WordNetLemmatizer
apesta a lematizar el tokenizador predeterminado de nltk. Así que ejemplos comodoes n't
no lematizar ado not
.port.stem("this")
producethi
yport.stem("was")
wa
, incluso cuando se proporciona la posición correcta para cada uno.La página oficial de Martin Porter contiene un Porter Stemmer en PHP , así como en otros idiomas .
Si realmente te tomas en serio la buena derivación, necesitarás comenzar con algo como el algoritmo de Porter, refinarlo agregando reglas para corregir los casos incorrectos comunes a tu conjunto de datos y, finalmente, agregar muchas excepciones a las reglas. . Esto se puede implementar fácilmente con pares clave / valor (dbm / hash / diccionarios) donde la clave es la palabra a buscar y el valor es la palabra derivada para reemplazar el original. Un motor de búsqueda comercial en el que trabajé una vez terminó con 800 excepciones a un algoritmo de Porter modificado.
fuente
http://wordnet.princeton.edu/man/morph.3WN
Para muchos de mis proyectos, prefiero el lematizador WordNet basado en léxicos sobre la derivación porter más agresiva.
http://wordnet.princeton.edu/links#PHP tiene un enlace a una interfaz PHP para las API de WN.
fuente
Basado en varias respuestas en Stack Overflow y blogs con los que me he encontrado, este es el método que estoy usando, y parece devolver palabras reales bastante bien. La idea es dividir el texto entrante en una serie de palabras (use el método que desee) y luego encontrar las partes del discurso (POS) para esas palabras y usarlas para ayudar a derivar y lematizar las palabras.
Su muestra anterior no funciona muy bien porque no se puede determinar el POS. Sin embargo, si usamos una oración real, las cosas funcionan mucho mejor.
fuente
Busque en WordNet, una gran base de datos léxica para el idioma inglés:
http://wordnet.princeton.edu/
Hay API para acceder a él en varios idiomas.
fuente
Esto parece interesante: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
fuente
Eche un vistazo a LemmaGen : biblioteca de código abierto escrita en C # 3.0.
Resultados de sus palabras de prueba ( http://lemmatise.ijs.si/Services )
fuente
Los paquetes de la parte superior del pitón (en ningún orden específico) para lematización son:
spacy
,nltk
,gensim
,pattern
,CoreNLP
yTextBlob
. Prefiero la implementación de spaCy y gensim (según el patrón) porque identifican la etiqueta POS de la palabra y asignan el lema apropiado automáticamente. El da lemas más relevantes, manteniendo intacto el significado.Si planea usar nltk o TextBlob, debe encargarse de encontrar la etiqueta POS correcta manualmente y encontrar el lema correcto.
Ejemplo de lematización con spaCy:
Ejemplo de lematización con Gensim:
Los ejemplos anteriores fueron tomados de esta página de lematización .
fuente
Haga una búsqueda de Lucene, no estoy seguro de si hay un puerto PHP, pero sé que Lucene está disponible para muchas plataformas. Lucene es una biblioteca de indexación y búsqueda de OSS (de Apache). Naturalmente, los extras de la comunidad y él pueden tener algo interesante que ver. Como mínimo, puede aprender cómo se hace en un idioma para poder traducir la "idea" a PHP.
fuente
Si puedo citar mi respuesta a la pregunta que StompChicken mencionó:
Como no entienden el idioma y no se ejecutan en un diccionario de términos, no tienen forma de reconocer y responder adecuadamente a los casos irregulares, como "ejecutar" / "ejecutar".
Si necesita manejar casos irregulares, deberá elegir un enfoque diferente o aumentar su lematización con su propio diccionario personalizado de correcciones para ejecutar después de que el lematizador haya hecho lo suyo.
fuente
La versión más actual del lematizador en NLTK es Snowball.
Puede encontrar ejemplos sobre cómo usarlo aquí:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
fuente
Podrías usar la lectora Morpha. UW ha subido el lematizador morpha a Maven central si planeas usarlo desde una aplicación Java. Hay una envoltura que lo hace mucho más fácil de usar. Solo necesita agregarlo como una dependencia y usar la
edu.washington.cs.knowitall.morpha.MorphaStemmer
clase. Las instancias son seguras para subprocesos (el JFlex original tenía campos de clase para variables locales innecesariamente). Cree una instancia de una clase y ejecutemorpha
la palabra que desea derivar.fuente
.Net lucene tiene una lectora porter incorporada. Puedes probar eso. Pero tenga en cuenta que la derivación de porter no considera el contexto de la palabra al derivar el lema. (Repasa el algoritmo y su implementación y verás cómo funciona)
fuente
Martin Porter escribió Snowball (un lenguaje para derivar algoritmos) y reescribió el "inglés Stemmer" en Snowball. Hay un Stemmer en inglés para C y Java.
Afirma explícitamente que el Porter Stemmer se ha vuelto a implementar solo por razones históricas, por lo que probar la corrección de la derivación contra el Porter Stemmer le dará resultados que (debería) ya conocer.
El Dr. Porter sugiere utilizar los lematizadores en inglés o Porter2 en lugar del lematizador Porter. El lematizador en inglés es lo que realmente se usa en el sitio de demostración, como @StompChicken respondió anteriormente.
fuente
En Java, uso tartargus-snowball para derivar palabras
Maven:
Código de muestra:
fuente
Pruebe este aquí: http://www.twinword.com/lemmatizer.php
Ingresé su consulta en la demostración
"cats running ran cactus cactuses cacti community communities"
y obtuve["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
la bandera opcionalALL_TOKENS
.Código de muestra
Esta es una API para que pueda conectarse a ella desde cualquier entorno. Así es como puede verse la llamada PHP REST.
fuente
Recomiendo encarecidamente usar Spacy (análisis y etiquetado de texto base) y Textacy (procesamiento de texto de nivel superior construido sobre Spacy).
Las palabras lematizadas están disponibles de forma predeterminada en Spacy como
.lemma_
atributo de un token y el texto se puede lematizar mientras se procesa mucho otro texto con texttacy. Por ejemplo, al crear una bolsa de términos o palabras o, en general, justo antes de realizar algún procesamiento que lo requiera.Te animo a que revises ambos antes de escribir cualquier código, ¡ya que esto te puede ahorrar mucho tiempo!
fuente
fuente