2.3. NLTK 英文词干提取¶
词干的概念是一种规范化方法。除涉及时态之外,许多词语的变体都具有相同的含义。
我们提取词干的原因是为了缩短查找的时间,使句子正常化。
考虑:
I was taking a ride in the car. I was riding in the car.
这两句话意味着同样的事情。 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("/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 模块来识别句子中每个单词的词性。