Python - Stemming y lematización
En las áreas de procesamiento del lenguaje natural nos encontramos con situaciones en las que dos o más palabras tienen una raíz común. Por ejemplo, las tres palabras - de acuerdo, de acuerdo y de acuerdo tienen la misma raíz de acuerdo. Una búsqueda que incluya cualquiera de estas palabras debe tratarlas como la misma palabra que es la raíz. Por tanto, es fundamental vincular todas las palabras a su raíz. La biblioteca NLTK tiene métodos para hacer este enlace y dar el resultado que muestra la palabra raíz.
El siguiente programa utiliza el algoritmo de derivación de Porter para la derivación.
import nltk
from nltk.stem.porter import PorterStemmer
porter_stemmer = PorterStemmer()
word_data = "It originated from the idea that there are readers who prefer learning new skills from the comforts of their drawing rooms"
# First Word tokenization
nltk_tokens = nltk.word_tokenize(word_data)
#Next find the roots of the word
for w in nltk_tokens:
print "Actual: %s Stem: %s" % (w,porter_stemmer.stem(w))
Cuando ejecutamos el código anterior, produce el siguiente resultado.
Actual: It Stem: It
Actual: originated Stem: origin
Actual: from Stem: from
Actual: the Stem: the
Actual: idea Stem: idea
Actual: that Stem: that
Actual: there Stem: there
Actual: are Stem: are
Actual: readers Stem: reader
Actual: who Stem: who
Actual: prefer Stem: prefer
Actual: learning Stem: learn
Actual: new Stem: new
Actual: skills Stem: skill
Actual: from Stem: from
Actual: the Stem: the
Actual: comforts Stem: comfort
Actual: of Stem: of
Actual: their Stem: their
Actual: drawing Stem: draw
Actual: rooms Stem: room
La lematización es similar a la derivación, pero aporta contexto a las palabras, así que va un paso más allá al vincular palabras con un significado similar a una palabra. Por ejemplo, si un párrafo tiene palabras como automóviles, trenes y automóvil, entonces los vinculará a todos con automóvil. En el programa siguiente usamos la base de datos léxica de WordNet para lematización.
import nltk
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
word_data = "It originated from the idea that there are readers who prefer learning new skills from the comforts of their drawing rooms"
nltk_tokens = nltk.word_tokenize(word_data)
for w in nltk_tokens:
print "Actual: %s Lemma: %s" % (w,wordnet_lemmatizer.lemmatize(w))
Cuando ejecutamos el código anterior, produce el siguiente resultado.
Actual: It Lemma: It
Actual: originated Lemma: originated
Actual: from Lemma: from
Actual: the Lemma: the
Actual: idea Lemma: idea
Actual: that Lemma: that
Actual: there Lemma: there
Actual: are Lemma: are
Actual: readers Lemma: reader
Actual: who Lemma: who
Actual: prefer Lemma: prefer
Actual: learning Lemma: learning
Actual: new Lemma: new
Actual: skills Lemma: skill
Actual: from Lemma: from
Actual: the Lemma: the
Actual: comforts Lemma: comfort
Actual: of Lemma: of
Actual: their Lemma: their
Actual: drawing Lemma: drawing
Actual: rooms Lemma: room