我是 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
一个单词的句子仍然是一个句子,因此从软件工程的角度来看,我希望无论句子的长度如何,标记器模块都能以相同的方式工作。从语言学的角度来看,事实并非如此。
这个词positioning似乎让你感到困惑。许多 PoS 标注器基于序列模型,例如HMM或CRF*。这些使用上下文特征,例如句子中的前一个/下一个单词是什么。我想这就是你同事的意思。如果你只考虑前一个词作为上下文,那么句子有多长并不重要。任何句子中的第一个单词都没有前面的单词,因此标记者必须学会处理这个问题。然而,添加上下文可以改变标记者的决定 - 让我们看一个使用的示例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 使用神经模型 - 但关于上下文的争论仍然成立。