В области обработки естественного языка мы сталкиваемся с ситуацией, когда два или более слова имеют общий корень. Например, три слова — «согласен», «согласен» и «согласен» имеют одно и то же корневое слово «согласен». Поиск, включающий любое из этих слов, должен рассматривать их как то же самое слово, которое является корневым словом. Поэтому становится необходимым связать все слова в их коренные слова. В библиотеке 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))
Когда мы выполняем приведенный выше код, он дает следующий результат.