我正在阅读一系列句子并用NLTK的Stanford POS标签器标记每个单词。我得到这样的输出:
wordnet_sense = []
for o in output:
a = st.tag(o)
wordnet_sense.append(a)
输出:[[(u'feel', u'VB'), (u'great', u'JJ')], [(u'good', u'JJ')]]
我想用他们的POS映射这些单词,以便在WordNet中识别它们。
我试过这个:
sense = []
for i in wordnet_sense:
tmp = []
for tok, pos in i:
lower_pos = pos[0].lower()
if lower_pos in ['a', 'n', 'v', 'r', 's']:
res = wn.synsets(tok, lower_pos)
if len(res) > 0:
a = res[0]
else:
a = "[{0}, {1}]".format(tok, pos)
tmp.append(a)
sense.append(tmp)
print sense
输出:[Synset('feel.v.01'), '[great, JJ]'], ['[good, JJ]']]
因此feel
被识别为动词,但great
和good
不被视为形容词。我还检查过great
和good
是否真正属于Wordnet,因为我认为如果他们不在那里就不会被映射,但他们是。有人可以帮忙吗?
答案 0 :(得分:3)
这是来自pywsd
的可爱功能:
from nltk.corpus import wordnet as wn
def penn2morphy(penntag, returnNone=False):
morphy_tag = {'NN':wn.NOUN, 'JJ':wn.ADJ,
'VB':wn.VERB, 'RB':wn.ADV}
try:
return morphy_tag[penntag[:2]]
except:
return None if returnNone else ''
答案 1 :(得分:1)
def wordnet_pos_code(tag):
if tag.startswith('NN'):
return wn.NOUN
elif tag.startswith('VB'):
return wn.VERB
elif tag.startswith('JJ'):
return wn.ADJ
elif tag.startswith('RB'):
return wn.ADV
else:
return ''
print wordnet_pos_code('NN')`
除了提供的答案,我发现这也有效。