Учебники

Python — Стемминг и лемматизация

В области обработки естественного языка мы сталкиваемся с ситуацией, когда два или более слова имеют общий корень. Например, три слова — «согласен», «согласен» и «согласен» имеют одно и то же корневое слово «согласен». Поиск, включающий любое из этих слов, должен рассматривать их как то же самое слово, которое является корневым словом. Поэтому становится необходимым связать все слова в их коренные слова. В библиотеке NLTK есть методы для выполнения этой связи и выдачи вывода, показывающего корневое слово.

Приведенная ниже программа использует алгоритм стемминга Портера.

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))

Когда мы выполняем приведенный выше код, он дает следующий результат.

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

Лемматизация аналогична, но она приносит контекст в слова. Так что это идет дальше, связывая слова с похожим значением в одном слове. Например, если в абзаце есть такие слова, как автомобили, поезда и автомобиль, то он свяжет их все с автомобилем. В приведенной ниже программе мы используем лексическую базу данных WordNet для лемматизации.

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))

Когда мы выполняем приведенный выше код, он дает следующий результат.