词干的概念是一种规范化方法。除涉及时态之外,许多词语的变体都具有相同的含义。
我们提取词干的原因是为了缩短查找的时间,使句子正常化。
考虑:
这两句话意味着同样的事情。 in the car
(在车上)是一样的。 I
(我)是一样的。
在这两种情况下,ing
都明确表示过去式,所以在试图弄清这个过去式活动的含义的情况下,
是否真的有必要区分riding
和taking a ride
?
不,并没有。
这只是一个小例子,但想象英语中的每个单词,可以放在单词上的每个可能的时态和词缀。 每个版本有单独的字典条目,将非常冗余和低效,特别是因为一旦我们转换为数字,“价值”将是相同的。
最流行的词干提取算法之一是 Porter,1979 年就存在了。
首先,我们要抓取并定义我们的词干:
from nltk.stem import PorterStemmer
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk import data
data.path.append("/data/nltk_data/packages")
ps = PorterStemmer()
现在让我们选择一些带有相似词干的单词,例如:
example_words = ["python","pythoner","pythoning","pythoned","pythonly"]
下面,我们可以这样做来轻易提取词干:
for w in example_words:
print(ps.stem(w))
python python python python pythonli
现在让我们尝试对一个典型的句子,而不是一些单词提取词干:
new_text = "It is important to by very pythonly while you are pythoning with python. All pythoners have pythoned poorly at least once."
words = word_tokenize(new_text)
for w in words:
print(ps.stem(w))
it is import to by veri pythonli while you are python with python . all python have python poorli at least onc .
下一章,我们将讨论 NLTK 模块中一些更高级的内容,词性标注,其中我们可以使用 NLTK 模块来识别句子中每个单词的词性。