就像标题所说,我该如何检查两个POS标签是否属于同一类别?如何检查NLTK中的两个POS标签是否属于同一类别?
例如,
go -> VB
goes -> VBZ
这两个词都是动词。或者,
bag -> NN
bags -> NNS
这两个都是名词。 所以我的问题是,NLTK中是否存在任何函数来检查两个给定标签是否在同一类别中?
就像标题所说,我该如何检查两个POS标签是否属于同一类别?如何检查NLTK中的两个POS标签是否属于同一类别?
例如,
go -> VB
goes -> VBZ
这两个词都是动词。或者,
bag -> NN
bags -> NNS
这两个都是名词。 所以我的问题是,NLTK中是否存在任何函数来检查两个给定标签是否在同一类别中?
不知道这是你在找什么,但你可以用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']}
注意如何bag
和bags
落入NOUN
类别和go
和goes
属于VERB
。
让我们先来简单的例子:你的阴茎被打上了布朗标记集(这就是它的样子),而且你会很高兴与中定义的简单标签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 ])
非常感谢您的详细解释。这正是我需要的。 –
非常感谢!这是一个好方法,但是我的情况有点不同。我得到的信息是一组标签。我需要将它们聚类到不同的集合中。 –