nltk pos tagger的内部实现



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

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

我有这个疑问,因为我尝试删除停用词并使用 Spacy POS 标记技术,我的同事说我不应该那样做,因为结果会发生变化,因为它也会检查单词的位置,

nltk pos 标记器也会一样吗? 如果是,那么为什么它接受单个单词,因为考虑了定位?

此处可以找到 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')]

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

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

nltk.pos_tag()函数将标记列表作为输入。此列表可以包含任意数量的令牌,当然包括 1。API 文档中提供了更多信息。

因此,在第一个示例中,您引用了 nltk.pos_tag([w])w 应该是单个单词字符串,[w]根据函数的要求将其放入列表中。

在第二种情况下,nltk.pos_tag(sent) ,列表推导中的sent变量是一个已经被标记化为标记列表的句子(参见您引用的代码中的第 41 行 - sentences = tokenize_sentences(document) (,这也是 pos_tag() 要求的格式。

我不确定为什么你的同事建议不要使用 spaCy。这取决于你想做什么。与NLTK相反,spaCy在每个令牌上存储了一组丰富的功能,包括令牌在文档中的索引(位置(和原始文本中的字符偏移量。据我所知,NLTK 默认情况下不存储令牌索引和字符偏移量,因此您必须尝试自己检索它(也许是这样的(。

最新更新