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')`

Помимо ответа, я обнаружил, что это также работает.

Другие вопросы по тегам