Python: сопоставление POS-тегов NLTK Stanford с POS-тегами WordNet
Я читаю список предложений и помечаю каждое слово тегом Stanford POS от NLTK. Я получаю вывод, как так:
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, потому что я думал, что они не отображаются, если их там нет, но они есть. Кто-нибудь может помочь?
2 ответа
Решение
Вот милая функция от 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 ''
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')`
Помимо ответа, я обнаружил, что это также работает.