Python:将 NLTK 斯坦福 POS 标签映射到 WordNet POS 标签

use*_*467 5 python nlp nltk wordnet part-of-speech

我正在阅读一个句子列表,并使用 NLTK 的斯坦福 POS 标记器标记每个单词。我得到这样的输出:

wordnet_sense = []

for o in output:
    a = st.tag(o)
    wordnet_sense.append(a)
Run Code Online (Sandbox Code Playgroud)

输出:[[(u'feel', u'VB'), (u'great', u'JJ')], [(u'good', u'JJ')]]

我想将这些单词与其词性进行映射,以便在 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
Run Code Online (Sandbox Code Playgroud)

输出:[Synset('feel.v.01'), '[great, JJ]'], ['[good, JJ]']]

sofeel被识别为动词,但greatandgood不被识别为形容词。我还检查了是否great和good实际上属于 Wordnet,因为我认为如果它们不存在,它们就不会被映射,但它们确实存在。有人可以帮忙吗?

alv*_*vas 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 ''
Run Code Online (Sandbox Code Playgroud)