如何在NLTK中检查两个POS标签属于同一类别?

时间:2016-09-21 00:46:26

标签: python nltk pos-tagger

如标题所示,我如何检查两个POS标签属于同一类别?

例如,

go -> VB
goes -> VBZ

这两个词都是动词。或者,

bag -> NN
bags -> NNS

这两个都是名词。 所以我的问题是NLTK中是否存在任何函数来检查两个给定的标签是否属于同一类别?

2 个答案:

答案 0 :(得分:1)

让我们先看一下这个简单的案例:你的语料库用Brown标签集标记(它看起来像什么),你对nltk&中定义的简单标签感到满意。 #39; s "universal" tagset., ADJ, ADP, ADV, CONJ, DET, NOUN, NUM, PRON, PRT, VERB, X,其中代表"标点符号"。在这种情况下,只需加载nltk的地图并将其与您的数据一起使用:

tagmap = nltk.tag.mapping.tagset_mapping("en-brown", "universal")
if tagmap[tag1] == tagmap[tag2]:
    print("The two words have the same part of speech")

如果那不是您的使用案例,则您需要手动决定从每个单独的代码到您要分配给它的简化类别的映射。如果你正在使用Brown语料库标记集,你可以看到标记及其含义here,或者在python中看到这样的标记:

print(nltk.help.brown_tagset())

研究您的标签并定义一个字典,将每个POS标签映射到您选择的类别;人们有时会发现只用前两个字母对布朗语料库标签进行分组就很有用,把它们放在一起" NN"," NN $"," NNS-HL"你可以像这样自动创建这个特定的映射:

from nltk.corpus import brown
alltags = set(t for w, t in brown.tagged_words())
tagmap = dict(t[:2] for t in alltags)

然后您可以根据需要自定义此地图;例如,将所有标点符号放在类别"。":

for tag in tagmap:
    if not tag.isalpha():
        tagmap[tag] = "."

根据您的tagmap,您可以像我从nltk导入的那样使用它。

最后,您可能会发现一次性重新整理语料库很方便,因此您只需比较分配的标签即可。如果corpus是nltk <corpus>.tagged_sents()命令格式的标记语句列表(因此不是语料库阅读器对象),您可以重置这样的所有内容:

newcorpus = []
for sent in corpus:
    newcorpus.append( [ (w, tagmap[t]) for w, t in sent ] )

答案 1 :(得分:0)

不确定这是否是您要找的,但您可以使用universal tagset进行标记:

from pprint import pprint
from collections import defaultdict

from nltk import pos_tag
from nltk.tokenize import sent_tokenize, word_tokenize

s = "I go. He goes. This bag is brown. These bags are brown."

d = defaultdict(list)
for sent in sent_tokenize(s):
    text = word_tokenize(sent)
    for value, tag in pos_tag(text, tagset='universal'):
        d[tag].append(value)

pprint(dict(d))

打印:

{'.': ['.', '.', '.', '.'],
 'ADJ': ['brown'],
 'DET': ['This', 'These'],
 'NOUN': ['bag', 'bags'],
 'PRON': ['I', 'He'],
 'VERB': ['go', 'goes', 'is', 'brown', 'are']}

请注意bagbags属于NOUN类别,gogoes属于VERB的方式。