Saltar al contenido principal

Stemming y lematización en Python

En este tutorial se abordan de forma práctica las funciones de stemming y lematización mediante el paquete Python Natural Language ToolKit (NLTK).
3 may 2024  · 12 min de lectura

El inglés moderno se considera una lengua débilmente flexionada. Esto significa que hay muchas palabras en inglés derivadas de otra palabra; por ejemplo, la palabra flexionada "normality" deriva de la palabra "norm", que es la forma raíz. Todas las lenguas flexionadas constan de palabras con raíces comunes, pero el grado de flexión varía según la lengua. 

"En morfología lingüística, la inflexión es un proceso de formación de palabras, en el que una palabra se modifica para expresar diferentes categorías gramaticales como tiempo, caso, voz, aspecto, persona, número, género, modo, animacidad y definitividad".
-(Fuente: Wikipedia)

Cuando se trabaja con texto, a veces es necesario aplicar técnicas de normalización para llevar las palabras a su forma raíz a partir de sus versiones derivadas. Esto ayuda a reducir la aleatoriedad y a acercar las palabras del corpus a la norma predefinida, lo que mejora la eficacia del procesamiento, ya que el ordenador tiene menos características con las que tratar. 

Dos técnicas populares de normalización de textos en el campo del Procesamiento del Lenguaje Natural(PLN), la aplicación de técnicas computacionales para analizar y sintetizar el lenguaje natural y el habla, son la stemming y la lematización. Los investigadores llevan años estudiando estas técnicas; los profesionales de la PNL suelen utilizarlas para preparar palabras, textos y documentos para su posterior procesamiento en una serie de tareas. 

En este tutorial se tratarán de forma práctica las funciones de stemming y lematización mediante el paquete Python Natural Language ToolKit (NLTK).

Echa un vistazo a este libro de trabajo de DataLab para obtener una visión general de todo el código de este tutorial. Para editar y ejecutar el código, cree una copia del libro de trabajo para ejecutar y editar este código.

Stemming 

El "stemming" es una técnica utilizada para reducir una palabra flexionada a su raíz. Por ejemplo, las palabras "programación", "programador" y "programas" pueden reducirse a la raíz común de la palabra "programa". En otras palabras, "programa" puede utilizarse como sinónimo de las tres palabras de inflexión anteriores. 

Esta técnica de tratamiento de textos suele ser útil para tratar la dispersión y/o normalizar el vocabulario. No sólo ayuda a reducir la redundancia, ya que la mayoría de las veces la raíz de la palabra y sus palabras flexionadas tienen el mismo significado, sino que también permite a los modelos de PNL aprender vínculos entre las palabras flexionadas y su raíz, lo que ayuda al modelo a entender su uso en contextos similares. 

Los algoritmos de "stemming" funcionan tomando una lista de prefijos y sufijos frecuentes en las palabras flexionadas y cortando el final o el principio de la palabra. Por tanto, podemos afirmar que este enfoque tiene sus ventajas, pero no está exento de limitaciones. 

Ventajas del despalillado

  • Mejora del rendimiento del modelo: La separación de palabras reduce el número de palabras únicas que debe procesar un algoritmo, lo que puede mejorar su rendimiento. Además, también puede hacer que el algoritmo funcione con mayor rapidez y eficacia.
  • Agrupación de palabras similares: Las palabras con un significado similar pueden agruparse, aunque tengan formas distintas. Puede ser una técnica útil en tareas como la clasificación de documentos, en las que es importante identificar temas clave dentro de un documento. 
  • Más fácil de analizar y comprender: Dado que el stemming suele reducir el tamaño del vocabulario, resulta mucho más fácil analizar, comparar y comprender los textos. Esto resulta útil en tareas como el análisis del sentimiento, cuyo objetivo es determinar el sentimiento de un documento. 

Desventajas del despalillado

  • Sobretemplado / Falsos positivos: Por ejemplo, el algoritmo Porter Stemmer reduce "universal", "university" y "universe" a la misma palabra. Aunque etimológicamente están relacionados, sus significados en la actualidad son de ámbitos muy diferentes. Tratarlos como sinónimos reducirá la relevancia en los resultados de búsqueda. 
  • Falsos negativos: Esto ocurre cuando un algoritmo de stemming reduce las palabras flexionadas a diferentes stems de palabras, pero que deberían ser iguales. Por ejemplo, el algoritmo Porter Stemmer no reduce las palabras "alumnus", "alumnae" y "alumni" a la misma raíz, aunque deberían tratarse como sinónimos. 
  • Retos lingüísticos: A medida que se complican la morfología, la ortografía y la codificación de caracteres de la lengua de destino, se hace más difícil diseñar stemmers. Por ejemplo, un stemmer italiano es más complicado que uno inglés porque hay un mayor número de inflexiones verbales. Un stemmer ruso es aún más complejo debido al mayor número de declinaciones de sustantivos.

Lematización

La lematización es otra técnica utilizada para reducir las palabras flexionadas a su palabra raíz. Describe el proceso algorítmico de identificación del "lema"(forma del diccionario) de una palabra flexionada en función de su significado. 

A diferencia del stemming, la lematización se basa en la determinación precisa de la parte del discurso y el significado de una palabra a partir de su contexto. Esto significa que tiene en cuenta dónde se sitúa la palabra inflexionada dentro de una frase, así como dentro del contexto más amplio que rodea a esa frase, como frases vecinas o incluso un documento entero.

"La lematización suele referirse a hacer las cosas bien con el uso de un vocabulario y el análisis morfológico de las palabras, normalmente con el objetivo de eliminar sólo las terminaciones flexivas y devolver la forma base o de diccionario de una palabra, que se conoce como lema"

- (Fuente: Grupo PNL de Standford)

En otras palabras, lematizar un documento suele significar "hacer las cosas correctamente", ya que implica utilizar un vocabulario y realizar un análisis morfológico de las palabras para eliminar sólo las terminaciones flexivas y devolver la forma base o de diccionario de una palabra, que se conoce como "lema". Por ejemplo, se puede esperar que un algoritmo de lematización asigne "corre", "corriendo" y "corrió" al lema "correr".  

Ventajas de la lematización

  • Precisión: La lematización no se limita a cortar palabras, como ocurre en los algoritmos de stemming. El análisis de las palabras se realiza a partir del POS de la palabra para tener en cuenta el contexto a la hora de producir lemas. Además, la lematización hace que se produzcan verdaderas palabras de diccionario.

Desventajas de la lematización 

  • Lleva mucho tiempo: En comparación con la derivación, la lematización es un proceso lento y laborioso. Esto se debe a que la lematización implica realizar un análisis morfológico y deducir el significado de las palabras a partir de un diccionario. 

Empieza a aprender Python gratis

Introduction to Data Science in Python

BeginnerSkill Level
4 hr
467.1K learners
Dive into data science using Python and learn how to effectively analyze and visualize your data. No coding experience or skills needed.
See DetailsRight Arrow

Ejemplos prácticos de stemming y lematización en Python con NLTK

Ahora ya tiene una visión general de la separación de raíces y la lematización. En esta sección, vamos a ponernos manos a la obra y demostrar ejemplos de ambas técnicas utilizando Python y una biblioteca llamada NLTK. 

Breve introducción al paquete NLTK de Python

Natural Language Tool Kit (NLTK) es una biblioteca de Python que se utiliza para crear programas capaces de procesar el lenguaje natural. La biblioteca puede realizar diferentes operaciones, como tokenización, stemming, clasificación, análisis sintáctico, etiquetado, razonamiento semántico, análisis de sentimiento, etc.

La última versión es NLTK 3.8.1, y requiere las versiones 3.7, 3.8, 3.9, 3.10 o 3.11 de Python, pero no tienes que preocuparte por esto ya que viene preinstalado en el libro de trabajo de DataLab - sólo tienes que importar nltk y listo. 

Python Stemming ejemplo

Uno de los algoritmos de stemming más populares se llama "Porter stemmer". El porter stemmer fue propuesto por primera vez por Martin Porter en un artículo de 1980 titulado "An algorithm for suffix stripping". El papel se ha convertido en uno de los algoritmos más comunes para el stemming en inglés.

Veamos cómo funciona:

import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt")
​
# Initialize Python porter stemmer
ps = PorterStemmer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
   print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
program             program             
programming         program             
programer           program             
programs            program             
programmed          program

"""

Se trata de un ejemplo bastante sencillo; esperábamos estos resultados de nuestro stemmer porter, como se menciona en la sección "Stemming" anterior. 

Intentemos un ejemplo más complicado:

import string
from nltk.tokenize import word_tokenize

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."

# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))

# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)

# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
    print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
Python              python              
programmers         programm            
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             becaus              
its                 it                  
like                like                
english             english             
We                  we                  
call                call                
people              peopl               
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonista
"""

Aquí puede ver que algunas de las palabras de salida no forman parte del diccionario inglés (por ejemplo, "becaus", "people" y "programm"). Otra cosa que hay que tener en cuenta es que no se tiene en cuenta el contexto. Por ejemplo, "programadores" es un sustantivo plural, pero se redujo a "programa", que puede ser un sustantivo o un verbo; en otras palabras, las palabras raíz son ambiguas. 

Ejemplo de lematización en Python

La motivación de los lematizadores sensibles al contexto era mejorar el rendimiento con palabras no vistas y ambiguas. En nuestro ejemplo de lematización, utilizaremos un popular lematizador llamado WordNet lemmatizer. 

Wordnet es una gran base de datos léxica del inglés, gratuita y de acceso público, cuyo objetivo es establecer relaciones semánticas estructuradas entre las palabras.

Veámoslo en acción:

from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
​
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in example_words:
   print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))

"""
--Word--            --Lemma--           
program             program             
programming         program             
programer           programer           
programs            program             
programmed          program
"""   

Las palabras de entrada pasadas a nuestro lematizador no se modificarán si no se encuentran en WordNet. Esto significa que hay que proporcionar el contexto, lo que se hace dando el valor del parámetro de parte de palabra, pos, en wordnet_lemmatizer.lemmatize.

Fíjese en que nuestro lematizador no redujo la palabra "programador" a "programa": esto se debe a que le dijimos a nuestro lematizador que sólo redujera la raíz de los verbos. 

Pasemos a nuestro lematizador algo más complicado para ver cómo le va...

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
​
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
​
word_tokens = word_tokenize(example_sentence_no_punct)
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
   print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word--            --Lemma--           
Python              Python              
programmers         programmers         
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             because             
its                 its                 
like                like                
english             english             
We                  We                  
call                call                
people              people              
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonistas 
"""

Todas las palabras devueltas por el algoritmo de lematización están en el diccionario inglés - menos "pythonistas", que es más bien un término informal utilizado para referirse a los programadores de python. 

Stemming frente a lematización

Ya ha visto cómo aplicar ambas técnicas, pero ¿qué diferencia hay entre ellas? 

La separación de palabras y la lematización son técnicas de tratamiento de textos cuyo objetivo es reducir las palabras flexionadas a una raíz básica común. A pesar de la correlación en el objetivo general, las dos técnicas no son lo mismo. 

Las principales diferencias entre el stemming y la lematización residen en la forma en que cada técnica llega al objetivo de reducir las palabras flexionadas a una raíz base común. 

Los algoritmos de búsqueda de raíces intentan encontrar las raíces comunes de varias inflexiones cortando las terminaciones o comienzos de la palabra. La chuleta se basa en una lista de prefijos y sufijos comunes que suelen encontrarse en las palabras flexionadas. Este acto de naturaleza no discriminatoria de trocear palabras puede llevar ocasionalmente a encontrar tallos de palabras con sentido, pero otras veces no. 

Por otro lado, los algoritmos de lematización intentan encontrar raíces base comunes a partir de palabras flexionadas realizando un análisis morfológico. Para reducir con precisión las inflexiones, debe mantenerse un diccionario detallado en el que el algoritmo pueda buscar para relacionar una palabra inflexionada con su lema.

"Ambas pueden diferir también en que la stemming colapsa más comúnmente las palabras relacionadas derivativamente, mientras que la lematización colapsa comúnmente sólo las diferentes formas flexivas de un lema".

- Fuente: Stanford NLP, IR Book.

Los algoritmos de derivación adoptan un enfoque heurístico rudimentario, lo que significa que son rápidos y eficaces, pero no siempre precisos. Por el contrario, los algoritmos de lematización sacrifican la velocidad y la eficacia en favor de la precisión, con lo que se obtienen raíces base significativas. 

Por ejemplo, un algoritmo de stemming puede reducir "saw" a "s". Un algoritmo de lematización considerará si "sierra" es un sustantivo (la herramienta manual para cortar) o un verbo (ver) basándose en el contexto en el que se utiliza antes de decidir si devuelve un lema: si es un sustantivo devolverá "sierra", y si es un verbo devolverá "ver".

Puede que estos puntos ya te queden bastante claros, así que aquí va la pregunta del millón: "¿debo utilizar stemming o lematización para el preprocesamiento de textos?". 

Como casi todo lo relacionado con el software, depende. 

¿Le importan la velocidad y la eficacia? Si es así, elija el stemming. 

¿Es importante el contexto para su aplicación? Si ha respondido "sí", utilice la lematización. 

La técnica que utilice dependerá por completo de la aplicación en la que esté trabajando y de sus objetivos para el proyecto. Puede que desee realizar experimentos con ambas técnicas y comparar los resultados para ver qué enfoque produjo los resultados más acordes con los objetivos de su proyecto. 

Algo que no hemos tocado mucho en este tutorial es cómo se crean los algoritmos de lematización; esto se debe a que existen varias bibliotecas (como SpaCy, NLTK, etc.) compatibles con diferentes idiomas. Sin embargo, si tuviera que crear su propio lematizador para una lengua no disponible (por ejemplo, el akan), necesitaría un buen conocimiento y comprensión de la lengua de destino para construir un lematizador. Los algoritmos de stemming son mucho más fáciles de construir para este tipo de situaciones.

Envolver

En resumen, el stemming y la lematización son técnicas utilizadas para el tratamiento de textos en PNL. Ambas pretenden reducir las inflexiones a las raíces comunes, pero cada una adopta un enfoque diferente. Este método es mucho más rápido que la lematización, pero es más rudimentario y en ocasiones puede dar lugar a raíces comunes poco significativas. Por otro lado, la lematización es mucho más precisa que el stemming a la hora de encontrar palabras significativas en el diccionario, y tiene en cuenta el contexto. 

Temas

Más información sobre Python y el procesamiento del lenguaje natural

curso

Introduction to Natural Language Processing in Python

4 hr
120.4K
Learn fundamental natural language processing techniques using Python and how to apply them to extract insights from real-world text data.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

tutorial

Tutorial de análisis NLTK del sentimiento para principiantes

Tutorial de análisis del sentimiento NLTK (natural language toolkit) de Python. Aprende a crear y desarrollar análisis del sentimiento utilizando Python. Sigue pasos específicos para extraer y analizar texto para el procesamiento del lenguaje natural.
Moez Ali's photo

Moez Ali

13 min

tutorial

Tutorial de Generación de nubes de palabras en Python

Aprende a realizar Análisis exploratorios de datos para el Procesamiento del lenguaje natural utilizando WordCloud en Python.
Duong Vu's photo

Duong Vu

21 min

tutorial

Aprendizaje automático de datos categóricos con el tutorial de Python

Aprenda los trucos más comunes para manejar datos categóricos y preprocesarlos para construir modelos de aprendizaje automático.
Moez Ali's photo

Moez Ali

28 min

tutorial

Clasificación de textos en Python

Descubra qué es la clasificación de textos, cómo funciona y casos de uso con éxito. Explore ejemplos de principio a fin sobre cómo crear un canal de preprocesamiento de texto seguido de un modelo de clasificación de texto en Python.
Moez Ali's photo

Moez Ali

12 min

tutorial

Comprender la regresión logística en el tutorial de Python

Aprende sobre la regresión logística, sus propiedades básicas, y construye un modelo de machine learning sobre una aplicación del mundo real en Python.
Avinash Navlani's photo

Avinash Navlani

10 min

tutorial

Tutorial de clasificación Naive Bayes con Scikit-learn

Aprende a construir y evaluar un Clasificador Naive Bayes utilizando el paquete Scikit-learn de Python.
Abid Ali Awan's photo

Abid Ali Awan

13 min

Ver másVer más