Reparar anomalías derivadas de NLTK en Python

Shikha Chaudhary 21 junio 2023
  1. Arreglar anomalías derivadas NLTK en Python
  2. Correcciones de las anomalías de derivación en el módulo PorterStemmer de NLTK en Python
  3. Uso de lematizadores sobre lematizadores en NLTK en Python
  4. Conclusión
Reparar anomalías derivadas de NLTK en Python

Stemming, como su nombre indica, es el método de reducir las palabras a sus formas de raíz. Por ejemplo, las palabras como felicidad, felizmente y más feliz se descomponen en la raíz de la palabra feliz.

En Python, podemos hacer esto con la ayuda de varios módulos proporcionados por la biblioteca NLTK de Python, pero a veces, es posible que no obtenga los resultados que esperaba. Por ejemplo, el módulo fairly se reduce a fairli y no fair PorterStemmer de la biblioteca NLTK.

Este artículo discutirá por qué ocurren tales diferencias y cómo solucionarlas para obtener la raíz de la palabra que queremos. ¡Así que tómate un café y sigue leyendo!

Arreglar anomalías derivadas NLTK en Python

Aunque la biblioteca NLTK de Python tiene varios lematizadores, el más utilizado es el PorterStemmer. Aquí hay un ejemplo de cómo funciona el PorterStemmer.

Primero entendamos lo que está sucediendo en este código.

Primero importamos PorterStemmer de la biblioteca nltk y luego creamos una instancia de la misma. Ahora, podemos usar esta instancia para derivar la lista de palabras dada con la ayuda de la función stem() provista en la biblioteca nltk.

from nltk.stem import PorterStemmer

p = PorterStemmer()

similar_words = ["act", "acting", "acts"]

for x in similar_words:
    print(x, "comes from", p.stem(x))

Producción :

act comes from act
acting comes from act
acts comes from act

Todas las palabras de esta lista se reducen a la palabra raíz act con la ayuda del módulo PorterStemmer. Pero no es así como este módulo funciona todo el tiempo.

Aquí hay otro ejemplo.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("loudly"))

Producción :

'loudli'

Puede ver que obtenemos la salida como loudli y no loud esta vez.

Me pregunto por qué sucede esto. Y, lo que es más importante, ¿cómo solucionar esto?

Correcciones de las anomalías de derivación en el módulo PorterStemmer de NLTK en Python

El módulo PorterStemmer funciona en cinco fases, cada una con sus propias reglas y procedimientos. Además, los resultados que generalmente da se basan en el idioma inglés.

Esto significa que, aunque la palabra loudi no es lo que queríamos, es la palabra con la raíz correcta según las reglas del módulo PorterStemmer.

Pero hay buenas noticias: no todos los lematizadores del módulo NLTK funcionan de manera similar. Detengamos la palabra en voz alta con la ayuda de SnowballStemmer esta vez.

Tenga en cuenta que aquí, tendremos que pasar un idioma como parámetro a la función SnowballStemmer().

from nltk.stem import SnowballStemmer

s = SnowballStemmer("english")
print(s.stem("loudly"))

Producción :

'loud'

Puede ver que obtenemos el resultado deseado esta vez porque el SnowballStemmer ciertamente usa un conjunto diferente de reglas que el PorterStemmer. Ahora aquí hay algo interesante.

Intenta derivar la palabra actor usando ambos módulos. Esto se hace a continuación.

from nltk.stem import SnowballStemmer
from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("actor"))


s = SnowballStemmer("english")
print(s.stem("actor"))

Producción :

'actor'
'actor'

Puede ver que ambos módulos devuelven el mismo resultado, actor, no la raíz de la palabra act. Ahora intentemos esto con otro stemmer llamado LancasterStemmer.

from nltk.stem import LancasterStemmer

l = LancasterStemmer()
print(l.stem("actor"))

Producción :

'act'

Puede ver que obtenemos la salida deseada act esta vez.

Viste cómo diferentes lematizadores están dando diferentes resultados con diferentes palabras.

Podemos usar otros lematizadores, pero dado que todos ellos se basan en algunos algoritmos, siempre hay posibilidades de no obtener el resultado deseado. Además, estos lematizadores son muy estrictos al cortar las palabras según el algoritmo.

Además, la derivación funciona principalmente en la parte del sufijo y no es lo suficientemente inteligente como para resolver palabras eliminando prefijos o infijos. Los algoritmos de derivación ni siquiera buscan el significado de las palabras y las raíces resultantes.

Mira este ejemplo.

Aquí hay una cadena de letras aleatorias con un ing al final, y el lematizador elimina este sufijo y devuelve el resultado.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("wkhfksafking"))

Producción :

'wkhfksafk'

Por lo tanto, para resolver este problema, una mejor manera sería usar un lematizador. Veamos el funcionamiento de los lematizadores en detalle.

Uso de lematizadores sobre lematizadores en NLTK en Python

A diferencia de los lematizadores, los lematizadores pueden analizar morfológicamente las palabras y encontrar el lema más apropiado según el contexto en el que se usan. Nótese que un lema no es lo mismo que una raíz ya que es la forma base de todas sus formas, a diferencia de una raíz.

Veamos un ejemplo para ver cómo los lematizadores son mejores que los lematizadores.

Aquí, estamos usando el PorterStemmer para derivar varias palabras.

from nltk.stem import PorterStemmer

p = PorterStemmer()

w = ["studies", "studying", "study"]

for i in w:
    print(p.stem(i))

Producción :

studi
studi
studi

Puede ver que la salida que obtenemos no es muy útil. Avancemos y usemos un lematizador en el mismo conjunto de palabras.

Primero importamos el módulo WordNetLemmatizer y creamos una instancia del mismo. Luego, usamos la función lemmatize() con un bucle for para encontrar el lema de cada palabra.

from nltk.stem import WordNetLemmatizer

l = WordNetLemmatizer()

w = ["studies", "studying", "study"]

for i in w:
    print(l.lemmatize(i))

Producción :

study
studying
study

Esta vez no obtenemos resultados absurdos, y todas las palabras tienen sentido.

Así es como usar un lematizador es mejor que usar un lematizador.

Consulte este enlace para obtener más información sobre lematizadores y lematizadores.

Conclusión

Este artículo nos enseñó sobre lematizadores y lematizadores en NLTK en Python. Vimos cómo y por qué los lematizadores a veces dan resultados absurdos y cómo podemos usar lematizadores para obtener mejores resultados.