2.3. NLTK 英文词干提取

词干的概念是一种规范化方法。除涉及时态之外,许多词语的变体都具有相同的含义。

我们提取词干的原因是为了缩短查找的时间,使句子正常化。

考虑:

I was taking a ride in the car. I was riding in the car.

这两句话意味着同样的事情。 in the car(在车上)是一样的。 I(我)是一样的。 在这两种情况下,ing都明确表示过去式,所以在试图弄清这个过去式活动的含义的情况下, 是否真的有必要区分ridingtaking a ride

不,并没有。

这只是一个小例子,但想象英语中的每个单词,可以放在单词上的每个可能的时态和词缀。 每个版本有单独的字典条目,将非常冗余和低效,特别是因为一旦我们转换为数字,“价值”将是相同的。

最流行的词干提取算法之一是 Porter,1979 年就存在了。

首先,我们要抓取并定义我们的词干:

>>> from nltk.stem import PorterStemmer
>>> from nltk.tokenize import sent_tokenize, word_tokenize
>>> from nltk import data
>>>
>>> data.path.append("/home/bk/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 模块来识别句子中每个单词的词性。