Python NLTK:如何用简化的词性标注集标记句子?

29 投票
3 回答
21312 浏览
提问于 2025-04-16 16:25

Python的NLTK书的第五章给出了一个给句子中的单词加标签的例子:

>>> text = nltk.word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]

nltk.pos_tag这个函数会调用默认的标签器,它使用了一整套标签。章节后面还介绍了一种简化的标签集

我该如何用这个简化的词性标签来给句子加标签呢?

另外,我对标签器的理解是否正确?也就是说,我能否像我问的那样更改标签器使用的标签集,还是应该把它返回的标签映射到简化的标签集上,或者我应该从一个新的、简单标记的语料库创建一个新的标签器?

3 个回答

9

你只需要在pos_tag方法中把tagset属性设置为'universal'就可以了。

In [39]: from nltk import word_tokenize, pos_tag
...: 
...: text = word_tokenize("Here is a simple way of doing this")
...: tags = pos_tag(text, tagset='universal')
...: print(tags)
...: 
[('Here', 'ADV'), ('is', 'VERB'), ('a', 'DET'), ('simple', 'ADJ'), ('way', 'NOUN'), ('of', 'ADP'), ('doing', 'VERB'), ('this', 'DET')]
29

更新一下,以防有人遇到同样的问题。NLTK现在已经升级到了一个“通用”的标签集,具体信息可以在这里找到。给你的文本打完标签后,可以使用map_tag来简化这些标签。

import nltk
from nltk.tag import pos_tag, map_tag

text = nltk.word_tokenize("And now for something completely different")
posTagged = pos_tag(text)
simplifiedTags = [(word, map_tag('en-ptb', 'universal', tag)) for word, tag in posTagged]
print(simplifiedTags)
# [('And', u'CONJ'), ('now', u'ADV'), ('for', u'ADP'), ('something', u'NOUN'), ('completely', u'ADV'), ('different', u'ADJ')]
21

为了简化默认的标签,你可以使用 nltk.tag.simplify.simplify_wsj_tag 这个功能,方法如下:

>>> import nltk
>>> from nltk.tag.simplify import simplify_wsj_tag
>>> tagged_sent = nltk.pos_tag(tokens)
>>> simplified = [(word, simplify_wsj_tag(tag)) for word, tag in tagged_sent]

撰写回答