Reparar anomalías derivadas de NLTK en Python
-
Arreglar anomalías derivadas
NLTK
en Python -
Correcciones de las anomalías de derivación en el módulo
PorterStemmer
deNLTK
en Python -
Uso de lematizadores sobre lematizadores en
NLTK
en Python - Conclusión
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.