El Stemming es una pieza fundamental en la búsqueda y recuperación de información, de hecho, prácticamente cualquier buscador hace uso de esta técnica.
Uno de los algoritmos más conocidos es el de Martin Porter. Hoy les traigo mi implementación en javascript del algoritmo de Porter en español. En esta página pueden encontrar la explicación completa junto con el algoritmo en Snowball.
Ejemplo de uso:
var stem =Stemmer_es.stem('asombrosamente'); //retorna asombr
Pero… ¿Que es el stem de una palabra?
No existe en el español un término lingüístico que exprese lo que significa stem en computación. Lo que si puedo decir es que el método Stemer_es.stem generalmente devuelve el lexema de la palabra junto con su prefijo si es que lo tiene. Por ejemplo, el stem de la palabras deportivo, deportista o deporte es deport. Para todas estas palabras el stem coincide con el lexema de la palabra. Ahora, para la palabra antideportivo, el stem devuelto sera antideport, mientras que el lexema sigue siendo deport. En este caso nos devolvió el lexema con el prefijo.
¿Y por qué no se remueve el prefijo?
Bueno, como explica Porter en su paper original, el remover el prefijo puede causar errores, además de agregarle una complejidad innecesaria al algoritmo. Y si nos ponemos a pensar, remover sufijos generalmente no tiene mayor inconveniente puesto que generalmente son morfemas que indican tiempo, persona, genero o número. Podemos decir que estamos eliminando la declinación de la palabra.
Ahora, si pensamos en los prefijos, ya es otra cosa. Imaginen un buscador que le quita el prefijo anti a antideportivo. Nos devolvería un montón de resultados erróneos ya que el prefijo le cambia totalmente el significado a la palabra.
Entonces alguien podría pensar, ‘Hagamos una lista de prefijos removibles’. En esta lista pone el prefijo archi, total el significado de ‘archienemigo de Sherlock’ es practicamente el mismo que ‘enemigo de Sherlock'(obviamente nosotros sabemos que dependiendo el contexto el enemigo puede variar pero el archienemigo es uno solo, pero para el caso es lo mismo ;). Ok, el buscador parece funcionar. El tema es que viene uno y busca la palabra archivar. Y si, el buscador le devuelve cualquier cosa.
Probablemente se podrían hallar reglas que determinen cuando remover los prefijos. Pero para Porter no vale la pena hacerlo.
Por último quiero mencionar que cuando dije «generalmente devuelve el lexema con su prefijo si es que lo tiene», el «generalmente» no estaba ahí para alargar la entrada. Pensemos que el español es un lenguaje natural y está colmado de excepciones. El algoritmo de Porter sirve para evitar tener que usar un diccionario palabra-lexema(que sería inmenso). En lugar de eso con unas pocas reglas trata de hallar algo similar.
Enlace al sitio del proyecto
Enlace al repositorio.
Verdaderamente Interezante!