2016-09-21 70 views
1

就像标题所说,我该如何检查两个POS标签是否属于同一类别?如何检查NLTK中的两个POS标签是否属于同一类别?

例如,

go -> VB 
goes -> VBZ 

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

bag -> NN 
bags -> NNS 

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

回答

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

+0

非常感谢!这是一个好方法,但是我的情况有点不同。我得到的信息是一组标签。我需要将它们聚类到不同的集合中。 –

1

让我们先来简单的例子:你的阴茎被打上了布朗标记集(这就是它的样子),而且你会很高兴与中定义的简单标签NLTK的"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") 

,你需要手动上的映射决定从各个变量的简单范畴你想分配给它。如果你与布朗语料库标记集工作,你可以看到蟒蛇中的标记及其含义here,或者是这样的:

print(nltk.help.brown_tagset()) 

研究你的标记,并定义每个POS标签你选择的类别映射字典;人们有时会发现将Brown语料库标签按其前两个字母分组在一起,将“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 ]) 
+0

非常感谢您的详细解释。这正是我需要的。 –

相关问题