Stemming es una de varias técnicas de normalización de texto que convierte datos de texto sin procesar en un formato legible para tareas de procesamiento de lenguaje natural.
Stemming es una técnica de preprocesamiento de texto en el procesamiento del lenguaje natural (PLN). En concreto, es el proceso de reducir la forma flexiva de una palabra a una denominada “base” (stem), o forma raíz, también conocida como “lema” en lingüística1. Es uno de los dos métodos principales (el otro es la lematización) que reduce las variantes flexivas dentro de un conjunto de datos de texto a un lexema morfológico. Con ello, el stemming pretende mejorar el procesamiento de texto en los sistemas de aprendizaje automático y de recuperación de información.
Las máquinas, desde las funciones de búsqueda y localización hasta los modelos de aprendizaje profundo, procesan el lenguaje en gran medida según la forma, y muchos investigadores sostienen que las computadoras no pueden entender el significado del lenguaje2. Sin embargo, aunque hay quienes debaten este último punto, es un hecho que los modelos de aprendizaje automático deben ser entrenados para reconocer diferentes palabras como variantes morfológicas de una palabra base. Por ejemplo, en los motores de búsqueda o catálogos de bibliotecas, los usuarios pueden enviar una consulta con una palabra (por ejemplo, invirtiendo), pero esperan resultados que utilicen cualquier forma flexiva de la palabra (por ejemplo, invertir, inversión, inversiones, etc.). Al reducir las formas de palabras derivadas a una palabra raíz, el stemming ayuda a los sistemas de recuperación de información a equiparar palabras morfológicamente relacionadas3.
Para muchas tareas de minería de textos, entre ellas, la clasificación de textos, la agrupación en clústeres, la indexación y otras, el stemming ayuda a mejorar la precisión al reducir la dimensionalidad de los algoritmos de aprendizaje automático y agrupar palabras según el concepto. La reducción de la dimensionalidad del algoritmo puede mejorar la exactitud y precisión de los modelos estadísticos de PLN, como los modelos temáticos y las incrustaciones de palabras4. De este modo, el stemming mejora la precisión al realizar diversas tareas de PLN, como el análisis de sentimiento del etiquetado de categorías gramaticales. De este modo, el stemming sirve como un paso importante en el desarrollo de modelos de lenguaje grandes.
Stemming es una etapa en el pipeline de la minería de textos en la que los datos de texto sin procesar se convierten en un formato estructurado para su procesamiento automático. Esencialmente, el stemming elimina los afijos de las palabras, dejando solo la forma base 5. Esto equivale a eliminar los caracteres del final de los tokens de palabras. Sin embargo, más allá de esta similitud básica, los algoritmos de stemming varían mucho.
Para explorar las diferencias entre las operaciones de los algoritmos de stemming, podemos procesar esta frase de Sueño de una noche de verano de Shakespeare: “El amor no ve con los ojos sino con el alma, y por eso pintan ciego al alado Cupido”. (Para efectos de todo el ejemplo, usaremos la versión en inglés: “Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind.”) Antes de pasar al proceso de stemming, los usuarios deben tokenizar los datos de texto sin procesar. El tokenizador integrado del kit de herramientas de lenguaje natural de Python (NLTK) genera el texto citado de la siguiente manera:
Tokenizado: ['Amor', 'no', 've', 'con', 'los', 'ojos', 'sino', 'con', 'la', 'mente, ',', 'y' , 'por lo tanto', 'es', 'alado', 'Cupido', 'pintado', 'ciego', '.']
Al ejecutar la salida tokenizada a través de múltiples algoritmos de stemming, podemos observar cómo estos se diferencian.
El algoritmo de Lovins es el primer algoritmo de stemming publicado. Básicamente, actúa como una función de búsqueda y reemplazo con una gran cantidad de parámetros. Compara cada token de entrada con una lista de sufijos comunes, y cada sufijo está condicionado por una de 29 reglas. Si uno de los sufijos de la lista se encuentra en un token y su eliminación no viola ninguna de las condiciones del sufijo asociado, el algoritmo elimina ese sufijo del token. Luego, el token derivado se ejecuta a través de otro conjunto de reglas, corrigiendo las malformaciones comunes en las raíces derivadas, como las letras dobles (por ejemplo, en inglés hopping se convierte en hopp y se convierte en hop)6.
Este código utiliza la biblioteca de stemming de Python7para hacer el stemming de la cita tokenizada de Shakespeare:
from stemming.lovins import stem from nltk.tokenize import word_tokenize text = “Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind”. words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
El código arroja las siguientes salidas:
Tokenizado: ['Amor', 'no', 've', 'con', 'los', 'ojos', 'sino', 'con', 'la', 'mente, ',', 'y' , 'por lo tanto', 'es', 'alado', 'Cupido', 'pintado', 'ciego', '.']
Las salidas muestran cómo el algoritmo de Lovins convierte correctamente conjugaciones y tiempos verbales en formas base (por ejemplo, painted se convierte en paint) y elimina la pluralización (por ejemplo, eyes se convierte en eye). Pero el algoritmo de Lovins también devuelve varias raíces mal formadas, como lov, th y ey. Estas palabras raíz mal formadas son el resultado de eliminar demasiados caracteres. Como suele ocurrir en el aprendizaje automático, estos errores ayudan a revelar procesos subyacentes.
Al hacer una comparación con la lista de sufijos del algoritmo de Lovins, el sufijo más largo que se ajusta tanto a love como a the es el carácter único -e. La única condición adjunta a este sufijo es “Sin restricciones en la raíz”, lo que significa que el algoritmo puede eliminar -e sin importar la longitud de la raíz restante. Desafortunadamente, ni la raíz lov ni la raíz th contienen alguna de las características que utiliza el algoritmo de Lovins para identificar palabras mal formadas, como letras dobles o plurales irregulares8.
Cuando estas raíces mal formadas eluden al algoritmo, el algoritmo de Lovins puede reducir palabras no relacionadas semánticamente a la misma raíz: por ejemplo, the, these y this se reducen a th. Por supuesto, estas tres palabras son demostrativas y comparten una función gramatical. Pero otros demostrativos, como that y those, no se reducen a th. Esto significa que las raíces generadas por Lovins no representan correctamente grupos de palabras.
En comparación con el algoritmo de Lovins, el algoritmo de Porter emplea un algoritmo de stemming más matemático. Esencialmente, este algoritmo clasifica cada carácter de un token dado como consonante (c) o vocal (v), agrupando las consonantes posteriores como C y las vocales posteriores como V. Por lo tanto, el algoritmo representa cada token de palabra como una combinación de grupos de consonantes y vocales. Una vez enumerados de esta manera, el algoritmo ejecuta cada token de palabra a través de una lista de reglas que especifican los caracteres finales que se eliminarán según la cantidad de grupos de vocales y consonantes en un token9. Dado que el inglés en sí sigue reglas léxicas generales pero no absolutas, el criterio sistemático del algoritmo de Porter para determinar la eliminación de sufijos puede arrojar errores.
Python NLTK contiene una función de algoritmo de Porter incorporada. Este código despliega el algoritmo de Porter en la cita de Shakespeare tokenizada:
from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize porter_stemmer = PorterStemmer() text = “Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind”. words = word_tokenize(text) stemmed_words = [porter_stemmer.stem(word) por palabra en palabras]
Este código devuelve:
Derivados: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and' , 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
Al igual que con Lovins, Porter cambia correctamente las conjugaciones verbales y las pluralizaciones de los sustantivos. Sin embargo, aunque carece de otras raíces mal formadas de Lovins (por ejemplo, reduce love a lov), el algoritmo de Porter elimina erróneamente la -e de therefore.
De acuerdo con el método de agrupación de consonante-vocal del algoritmo de Porter, therefore se representa como CVCVCVCV, or C(VC)3V, donde el exponente indica las repeticiones de grupos de consonante-vocal.
Uno de los últimos pasos del algoritmo establece que, si una palabra no se ha sometido a stemming y tiene un exponente con un valor mayor que 1, -e se elimina de la terminación de la palabra (si está presente). El exponente de therefore es 3 y no contiene ninguno de los sufijos enumerados en las otras condiciones del algoritmo10. Así pues, therefore se convierte en therefor.
Es cierto que este es el único error del algoritmo de Porter, lo que quizás demuestra por qué es el algoritmo de stemming más adoptado. De hecho, el algoritmo de Porter sirvió como base para algoritmos de stemming posteriores.
El algoritmo de Snowball es una versión actualizada del algoritmo de Porter. Si bien su objetivo es aplicar un conjunto de reglas más robusto para determinar la eliminación de sufijos, sigue siendo propenso a muchos de los mismos errores. Al igual que el algoritmo de Porter, Python NLTK contiene una función de algoritmo de Snowball incorporada:
from nltk.stem.snowball import SnowballStemmer from nltk.tokenize import word_tokenize stemmer = SnowballStemmer("english", True) text = "There is nothing either good or bad but thinking makes it so." words = word_tokenize(text) stemmed_words = [stemmer.stem(word) for word in words]
Produce la misma salida del texto de Shakespeare que el algoritmo de Porter, reduciendo incorrectamente therefore a therefor:
Derivados: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and' , 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
El algoritmo de Snowball difiere del de Porter en dos aspectos principales. En primer lugar, mientras que los algoritmos de Lovins y de Porter solo hacen stemming de palabras en inglés, el de Snowball puede hacer stemming de textos en varios otros idiomas de escritura romana, como holandés, alemán, francés e incluso ruso. En segundo lugar, el algoritmo de Snowball, cuando se implementa a través de la biblioteca Python NLTK, puede ignorar palabras vacías. Las palabras vacías son una colección no universal de palabras que se eliminan de un conjunto de datos durante el preprocesamiento. La lista de palabras vacías predefinidas del algoritmo de Snowball contiene palabras que no tienen una definición conceptual directa y que cumplen más una función gramatical que semántica. Las palabras vacías incluidas en la lista de palabras vacías de Snowball en inglés incluyen the, a, being, y similares11.
Muchas fuentes describen el algoritmo de Lancaster, también conocido como algoritmo de Paice, como el más agresivo de los algoritmos de stemming del idioma inglés. El algoritmo de Lancaster contiene una lista de más de 100 reglas que dictan qué cadenas de caracteres finales, si están presentes, se deben reemplazar con otras cadenas, si las hubiera. El algoritmo itera a través de cada token de palabra, cotejándolo con todas las reglas. Si la cadena final del token coincide con la de una regla, el algoritmo ejecuta la operación descrita en la regla y luego ejecuta la nueva palabra transformada a través de todas las reglas nuevamente. El algoritmo itera a través de todas las reglas hasta que un token determinado las pasa todas sin ser transformado12.
Aunque no está disponible en Python NLTK, el algoritmo de Lancaster está disponible en la biblioteca de stemming13:
from stemming.paicehusk import stem from nltk.tokenize import word_tokenize text = “Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind”. words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
El código hace el stemming del pasaje tokenizado de Shakespeare como:
Stemmed: ['Lov', 'look', 'not', 'with', 'the', 'ey', 'but', 'with', 'the', 'mind', ',', 'and', 'theref', '', 'wing', 'Cupid', 'paint', 'blind', '.']
Claramente, el enfoque iterativo del algoritmo de Lancaster es el más agresivo de los algoritmos, como se muestra con theref. En primer lugar, el algoritmo de Lancaster tiene la regla “e1>”. Esta regla elimina el carácter único -e sin reemplazarlo. Después de que el algoritmo elimina -e de therefore, coteja la nueva palabra therefor con cada regla. La palabra recién transformada se ajusta a la regla “ro2>”. Esta regla elimina el sufijo de dos caracteres -or sin reemplazarlo. La raíz theref resultante no se ajusta a ninguna de las otras reglas de los algoritmos y, por lo tanto, se devuelve como la base que se sometió a stemming. A diferencia del algoritmo de Lovins, el de Lancaster no tiene medios para justificar las palabras mal formadas.
Hay muchos algoritmos de stemming de inglés, así como algoritmos de stemming para otros idiomas de escritura romana. Más recientemente, las investigaciones se han interesado en el desarrollo y evaluación de algoritmos de stemming para idiomas de escritura no romana. El árabe, en particular, puede ser un desafío debido a su compleja morfología y variaciones ortográficas. Un puñado de estudios comparan la eficacia de diferentes algoritmos de stemming arábigos en relación con tareas como la clasificación14. Además, los investigadores examinan la precisión del stemming para mejorar la recuperación de información en támil15 y sánscrito16.
Aunque las investigaciones demuestran cuál es la utilidad del stemming en la mejora de la precisión de las tareas de PLN, el stemming supone dos principales problemas que los usuarios deben tener en cuenta. Se habla de “over-stemming” cuando dos palabras semánticamente distintas se reducen a la misma raíz y se combinan. Por otro lado, cuando dos palabras semánticamente relacionadas no se reducen a la misma raíz, se habla de “under-stemming”17. Un ejemplo de “over-stemming" es la reducción que hace el algoritmo de Lancaster de la palabra wander a wand, dos términos semánticamente distintos en inglés. Sin embargo, ni el algoritmo de Porter ni el de Lovins modifican en absoluto la palabra wander. Un ejemplo de “under-stemming” es la no reducción por parte del algoritmo de Porter de la palabra knavish a knavish y de knave a knave, que comparten la misma raíz semántica. En comparación, el algoritmo de Lovins reduce ambas palabras a knav.
Aunque tienen usos y objetivos similares, el stemming y la lematización difieren en aspectos pequeños pero fundamentales. La literatura suele describir el stemming como algo más heurístico, eliminando esencialmente los sufijos comunes de las palabras para producir una palabra raíz. La lematización, en cambio, realiza un análisis morfológico más detallado de diferentes palabras para determinar una forma base del diccionario, eliminando no solo los sufijos, sino también los prefijos. Si bien es más fácil y rápido implementar el stemming, es posible que muchos desarrolladores de herramientas de aprendizaje profundo pueden prefieran la lematización dado su proceso de eliminación más preciso.
Diseñe asistentes y agentes de IA escalables con facilidad, automatice tareas repetitivas y simplifique procesos complejos con IBM watsonx Orchestrate.
Acelere el valor de negocio de la inteligencia artificial con una cartera potente y flexible de bibliotecas, servicios y aplicaciones.
Reinvente los flujos de trabajo y las operaciones críticas añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.
1 Ruslan Mitkov, Oxford Handbook of Computational Linguistics, 2.a edición. Oxford University Press, 2014.
2 Emily Bender y Alexander Koller, “Climbing towards NLU: On Meaning, Form, and Understanding in the Age of Data”, Actas del 58ª congreso anual de la Asociación para la Lingüística Computacional, 2020 , págs. 5185-5198, https://aclanthology.org/2020.acl-main.463
3 Steven Bird, Ewan Klein y Edward Loper, Natural Language Processing with Python, O’Reilley, 2009.
4 Gary Miner, Dursun Delen, John Elder, Andrew Fast, Thomas Hill y Robert A. Nisbet. Practical Text Mining and Statistical Analysis for Non-Structured Text Data Applications, Academic Press, 2012.
5 Christopher Manning y Hinrich Schütze, Foundations of Statistical Natural Language Processing, MIT Press, 1999.
6 Julie Beth Lovins, “Development of a stemming algorithm”. Mechanical Translation and Computational Linguistics, Vol. 11, núm. 1 y 2, 1968, págs. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
7, 13 https://pypi.org/project/stemming/1.0
8 Julie Beth Lovins, “Development of a stemming algorithm”. Mechanical Translation and Computational Linguistics, Vol. 11, núm. 1 y 2, 1968, págs. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
9 Martin Porter, “An algorithm for suffix stripping”, Program: electronic library and information systems, Vol. 14, núm. 3, 1980, págs. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
10 Martin Porter, "An algorithm for suffix stripping", Program: electronic library and information systems, Vol. 14, núm. 3, 1980, págs. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
11 Martin Porter, “Snowball: A language for stemming algorithms”, 2001, https://snowballstem.org/texts/introduction.html
12 Chris Paice, “Another stemmer," ACM SIGIR Forum, Vol. 24, No. 3, 1990, págs.56-61, https://dl.acm.org/doi/10.1145/101306.101310
14 Y. A. Alhaj, J. Xiang, D. Zhao, M. A. A. Al-Qaness, M. Abd Elaziz y A. Dahou, “A Study of the Effects of Stemming Strategies on Arabic Document Classification”. IEEE Access, Vol. 7, págs. 32664-32671, https://ieeexplore.ieee.org/document/8664087. Janneke van der Zwaan, Maksim Abdul Latif, Dafne van Kuppevelt, Melle Lyklema, Christian Lange, “Are you sure your tool does what it is supposed to do? Validating Arabic root extraction”. Digital Scholarship in the Humanities, Vol.36, 2021, págs.137-150, https://academic.oup.com/dsh/article/36/Supplement_1/i137/5545478
15 Ratnavel Rajalakshmi, Srivarshan Selvaraj, Faerie Mattins, Pavitra Vasudevan, Anand Kumar, “HOTTEST: Hate and Offensive content identification in Tamil using Transformers and Enhanced Stemming”, Computer Speech & Language, Vol. 78, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230822000870?via%3Dihub
16 Siba Sankar Sahu y Sukomal Pal, “Building a text retrieval system for the Sanskrit language: Exploring indexing, stemming, and searching issues”, Computer Speech & Language, Vol. 81, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230823000372?via%3Dihub
17 Chris Paice, “Stemming,” Encyclopedia of Database Systems, Springer, 2020.
IBM web domains
ibm.com, ibm.org, ibm-zcouncil.com, insights-on-business.com, jazz.net, mobilebusinessinsights.com, promontory.com, proveit.com, ptech.org, s81c.com, securityintelligence.com, skillsbuild.org, softlayer.com, storagecommunity.org, think-exchange.com, thoughtsoncloud.com, alphaevents.webcasts.com, ibm-cloud.github.io, ibmbigdatahub.com, bluemix.net, mybluemix.net, ibm.net, ibmcloud.com, galasa.dev, blueworkslive.com, swiss-quantum.ch, blueworkslive.com, cloudant.com, ibm.ie, ibm.fr, ibm.com.br, ibm.co, ibm.ca, community.watsonanalytics.com, datapower.com, skills.yourlearning.ibm.com, bluewolf.com, carbondesignsystem.com, openliberty.io