nltk pos tagger的内部实现

Sat*_*tya 2 nlp nltk spacy

我是 NLP 新手,尝试使用 nltk pos 标记器,但对用法有疑问,

它通常接受一个单词或一个完整的句子,并给出输入的 pos 标签,为什么它以两种方式工作?

我有这个疑问,因为我尝试删除停用词并使用 spacy pos 标记技术,我的同事说我不应该这样做,因为结果会随着它检查单词的位置而改变,

nltk pos tagger 也会一样吗?如果是,那么既然考虑了定位,为什么它接受单个单词?

这里找到了 nltk 中两个用例的示例用法:https://github.com/acrosson/nlp/blob/master/subject_extraction/subject_extraction.py#L61

https://github.com/acrosson/nlp/blob/master/subject_extraction/subject_extraction.py#L44

mba*_*rov 5

一个单词的句子仍然是一个句子,因此从软件工程的角度来看,我希望无论句子的长度如何,标记器模块都能以相同的方式工作。从语言学的角度来看,事实并非如此。

这个词positioning似乎让你感到困惑。许多 PoS 标注器基于序列模型,例如HMMCRF*。这些使用上下文特征,例如句子中的前一个/下一个单词是什么。我想这就是你同事的意思。如果你只考虑前一个词作为上下文,那么句子有多长并不重要。任何句子中的第一个单词都没有前面的单词,因此标记者必须学会处理这个问题。然而,添加上下文可以改变标记者的决定 - 让我们看一个使用的示例nltk

In [4]: import nltk

In [5]: nltk.pos_tag(['fly'])
Out[5]: [('fly', 'NN')]

In [6]: nltk.pos_tag(['I', 'fly'])
Out[6]: [('I', 'PRP'), ('fly', 'VBP')]

In [7]: nltk.pos_tag(['Large', 'fly'])
Out[7]: [('Large', 'JJ'), ('fly', 'NN')]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,更改第一个单词会影响标记器对第二个单词的输出。因此,在将文本输入 PoS 标注器之前,您不应该删除停用词。

*尽管这并不总是正确的。NLTK 3.3 的 PoS 标注器是一个平均感知器,而 spacy 2.0 使用神经模型 - 但关于上下文的争论仍然成立。