Python:将NLTK Stanford POS标签映射到WordNet POS标签

5
我正在阅读一组句子,并使用NLTK的Stanford POS标注器为每个单词打上标记。我得到的输出如下:
wordnet_sense = []

for o in output:
    a = st.tag(o)
    wordnet_sense.append(a)

输出: [[(u'感觉', u'动词原形'), (u'伟大', u'形容词')], [(u'好', u'形容词')]]

我想将这些单词与它们的词性进行映射,以便在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被识别为动词,但是greatgood没有被识别为形容词。我还检查了一下greatgood是否真的属于Wordnet,因为我认为如果它们不在那里,它们就不会被映射,但实际上它们是存在的。有人能帮忙吗?

2个回答

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

参见:https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html - alvas

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

除了提供的答案外,我还发现这个也可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接