Nlp nltk pos标记器的内部实现

Nlp nltk pos标记器的内部实现,nlp,nltk,spacy,Nlp,Nltk,Spacy,我是NLP新手,尝试使用nltk pos tagger,但对其用法有疑问 它通常接受一个单词或一个完整的句子,并给出输入的词性标记,为什么它以两种方式工作 我之所以产生这种怀疑,是因为我尝试删除停止词,并使用了空间词性标记技术,我的同事说我不应该这样做,因为结果会随着检查词的位置而改变 nltk pos标记器是否也一样?如果是,那么既然考虑了定位,为什么它只接受单个单词 这里可以找到nltk中两个用例的示例用法: 一个单词的句子仍然是一个句子,因此从软件工程的角度来看,无论句子的长度如何,我都希

我是NLP新手,尝试使用nltk pos tagger,但对其用法有疑问

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

我之所以产生这种怀疑,是因为我尝试删除停止词,并使用了空间词性标记技术,我的同事说我不应该这样做,因为结果会随着检查词的位置而改变

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

这里可以找到nltk中两个用例的示例用法:


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

定位这个词似乎让你感到困惑。许多PoS标记器基于序列模型,例如or
*
。它们使用上下文特征,例如句子中的上一个/下一个单词是什么。我想这就是你同事的意思。如果你只考虑前一个单词作为上下文,那么句子的长度并不重要。任何句子中的第一个单词都没有前一个单词,因此标记者必须学会处理这个问题。然而,添加上下文可以改变标记器的决定-让我们看一个使用
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-tagger是一个平均感知机,spacy 2.0使用了一个神经模型——关于上下文的争论仍然成立。

NLTK.PoS_-tag()函数将标记列表作为输入。此列表可以包含任意数量的令牌,当然包括1个。有更多的信息在网站上

因此,在您引用的第一个示例中,
nltk.pos_标记([w])
w
被认为是一个单字字符串,
[w]
根据函数的要求将其放入列表中

在第二种情况下,
nltk.pos_-tag(sent)
,列表理解中的
sent
变量是一个已经标记到标记列表中的句子(参见您引用的代码中的第41行-
句子=标记化句子(文档)
),这也是
pos_-tag()
所需的格式


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

这并不反对spacy,而是不删除停止词,然后使用spacy,如果以其他方式传达,请原谅我没有问题。我误解了,但我认为姆巴奇卡罗夫的回答可能回答了你的问题。但我不能理解这一点,因为我没有足够的业力