Los algoritmos de stemming difieren ampliamente, aunque comparten algunos modos generales de funcionamiento. Los stemmers eliminan los sufijos de las palabras cotejando los tokens de las palabras de entrada con una lista predefinida de sufijos comunes. A continuación, el stemmer elimina de la palabra las cadenas de caracteres sufijo encontradas, en caso de que estas no desafíen ninguna regla o condición asociada a dicho sufijo. Algunos stemmers (por ejemplo, el stemmer de Lovins) pasan los pedacitos resultantes por un conjunto adicional de reglas para corregir las raíces malformadas.
El algoritmo más utilizado es el algoritmo stemming de Porter, y su versión actualizada, el stemmer Snowball. Para entender mejor la lematización, podemos repasar el siguiente pasaje del Hamlet de Shakespeare a través de la lematización Snowball: “No hay nada bueno o malo, pero el pensamiento lo hace así”.
El kit de herramientas de lenguaje natural de Python (NLTK) contiene funciones integradas para los stemmers Snowball y Porter. Después de tokenizar la cita de Hamlet utilizando NLTK, podemos pasar el texto tokenizado a través del lematizador Snowball utilizando 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."
words = word_tokenize(text)
stemmed_words = [stemmer.stem(word) for word in words]
print("Original:", text)
print("Tokenized:", words)
print("Stemmed:", stemmed_words)
El código genera:
Original: There is nothing either good or bad but thinking makes it so.
Tokenized: ['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 de Snowball y Porter tienen un método más matemático para eliminar sufijos que otros stemmers. Basta decir que el stemmer compara cada token de palabra con una lista de reglas que especifican las cadenas de sufijos que se deben eliminar en función del número de grupos de vocales y consonantes en un token5. Por supuesto, como la lengua inglesa sigue reglas léxicas generales pero no absolutas, el criterio sistemático del algoritmo de stemming devuelve errores, como noth.
La raíz elimina -ing, siendo una terminación común que indica el presente progresivo. En la cita de Hamlet, sin embargo, al eliminar -ing se obtiene erróneamente 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 is sin cambios. Del mismo modo, el stemmer Snowball deja otras conjugaciones de to be, como was y are, sin raíz. Esto puede impedir que los modelos asocien correctamente las conjugaciones irregulares de un verbo determinado.