Los algoritmos de stemming difieren ampliamente, aunque comparten algunos modos generales de funcionamiento. Los stemmers eliminan los sufijos de las palabras ejecutando tokens de palabras de entrada contra una lista predefinida de sufijos comunes. Luego, el stemming elimina cualquier cadena de caracteres de sufijo encontrada en la palabra, siempre que esta no desafíe ninguna regla o condición asociada a ese sufijo. Algunos stemmers (por ejemplo, el stemmer Lovins) ejecutan los bits resultantes a través de un conjunto adicional de reglas para corregir raíces malformadas.
El algoritmo más utilizado es el algoritmo de Porter, y su versión actualizada el stemmer Snowball. Para entender mejor el stemming, podemos usar el siguiente pasaje de Hamlet de Shakespeare a través del stemmer de Snowball: “No hay nada ni bueno ni malo, sino que pensar lo hace así”.
El kit de herramientas de lenguaje natural de Python (NLTK) contiene funciones integradas para los stemmers Snowball y Porter. Luego de tokenizar la cita de Hamlet usando NLTK, podemos pasar el texto tokenizado a través del stemmer Snowball usando este código:
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."
palabras = word_tokenize(text) stemmed_words = [stemmer.stem(word) for word inwords] print("Original:", text) print("Tokenized:",words) print("Stemmed:", stemmed_words)
El código da como resultado:
Original: There is nothing either good or bad but thinking makes it so.
Tokenizado: ['There', 'is', 'nothing', 'either', 'good', 'or', 'bad', 'but', 'thinking', 'makes', 'it', 'so', '.']
Stemmed: ['there', 'is', 'noth', 'either', 'good', 'or', 'bad', 'but', 'think', 'make', 'it', 'so', '.']
Los algoritmos stemmer de Snowball y Porter tienen un método más matemático para eliminar sufijos que otros stemmers. Baste decir que el stemmer ejecuta cada token de palabra contra una lista de reglas que especifican cadenas de sufijos para eliminar de acuerdo con la cantidad de grupos de vocales y consonantes en un token.5 Por supuesto, debido a que el idioma inglés sigue reglas léxicas generales pero no absolutas, el criterio sistemático del algoritmo de stemming devuelve errores, como noth.
El stemmer elimina -ing, ya que es una terminación común que significa el presente progresivo. En la cita de Hamlet , sin embargo, eliminar -ing erróneamente produce la raíz noth. Esto puede impedir que el análisis lingüístico posterior asocie nothing a sustantivos similares, como anything y something. Además, el stemmer deja el verbo irregular sin cambios. De manera similar, el stemmer Snowball deja otras conjugaciones de to be, como was y are, sin derivación. Esto puede impedir que los modelos asocien correctamente las conjugaciones irregulares de un verbo determinado.