将单个单词标记为nltk pos标记会标记每个字母而不是整个单词

7

我正在尝试使用nltk词性标注器对单词进行标记:

word = "going"
pos = nltk.pos_tag(word)
print pos

但是输出结果是这样的:
[('g', 'NN'), ('o', 'VBD'), ('i', 'PRP'), ('n', 'VBP'), ('g', 'JJ')]

它标记的是每个字母而不仅仅是一个单词。

我该怎么做才能标记整个单词?


请注意,仅标记单个单词无法给您带来令人满意的结果。想一想:如果仅查看单个单词就足够了,我们就不需要标注器了--我们只需在字典中查找POS即可。 - alexis
4个回答

14

nltk.tag.pos_tag 接受一个标记列表,将其元素分开并加上词性标注。因此,您需要将您的单词放入可迭代对象(如列表)中:

>>> nltk.tag.pos_tag(['going'])
[('going', 'VBG')]

请注意,这将整个句子标记为一个标签(我知道原帖问的是一个单词,但这可能会令人困惑)。 - Alaa M.
@AlaaM. 你所说的整体标记句子是什么意思?pos 标记旨在根据单词的初始字符和其在句子中的位置对其进行标记。这就是为什么标记由多个字符组成的原因。 - Mazdak
1
我只是想说,如果你有多个单词,那么请使用nltk.tag.pos_tag('a sentence'.split())而不是nltk.tag.pos_tag(['a sentence']),因为后者会产生一个单一的标签。 - Alaa M.
@AlaaM。确实,这就是为什么我喜欢文档的原因。此外,由于答案已经过去很长时间并且充满了混乱,我已经更新了答案;))。 - Mazdak
这只是一个技术上(可能过于追求细节)的澄清。问题在于 pos_tag 接受任何可迭代对象,而不仅仅是列表。它会遍历该可迭代对象中的项(字符串中的字符,列表中的项),并尝试标记这些项。我相信您已经意识到了这一点,但我想为那些想知道输出原因的人提供更多的澄清。 - JoeF

4
>>> word = 'going'
>>> word = nltk.word_tokenize(word)
>>> l1 = nltk.pos_tag(word)
>>> l1
[('going', 'VBG')]

2

返回一个单词的 POS 标签

nltk.pos_tag(["going"])
----->[('going', 'VBG')]

此解决方案已在此答案中提供。 - Jonathan

0
标记器适用于单词列表。要将字符串转换为列表,只需使用类似的方法。
word_list = [word]

然后在 word_list 上使用 pos 标注器。请注意,如果你有多个单词,应该先在字符串上运行 nltk.word_tokenize

至于标记单个词语的成功,你应该查看第 4.3 节中提到的查找标记器 here。nltk 使用的 pos_tag 比一个单词的查找标记器更复杂,但它确实在过程中使用了一个单词作为其中的一部分,因此你应该看到不错的结果。


我知道它是为列表设计的,但它能在单个单词上工作吗? - jksnw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接