0

我是 Python 和 NLTK 的新手,所以请多多包涵。我希望在句子的上下文中找到一个词的意义。我正在使用 Lesk WSD 算法,但每次运行它都会给出不同的输出。我知道 Lesk 有一定程度的不准确。但是,我认为 POS 标签会提高准确性。

Lesk 算法将 POS 标记作为参数,但它以 'n'、's'、'v' 作为输入,而不是 'NN'、'VBP' 或 pos_tag() 函数输出的其他 POS 标记. 我想知道如何以'n','s','v'的形式标记单词,或者是否有一种方法可以将'NN','VBP'和其他标签转换为'n ','s','v',所以我可以将它们作为 lesk(context_sentence,word,pos_tag) 函数的输入。

之后我正在使用 SentiWordNet 计算每个单词的情感分数。

    from nltk.wsd import lesk
    from nltk import word_tokenize
    import nltk, re, pprint
    from nltk.corpus import sentiwordnet as swn

    def word_sense():

        sent = word_tokenize("He should be happy.")
        word = "be"
        pos = "v"
        score = lesk(sent,word,pos)
        print(score)
        print (str(score),type(score))
        set1 = re.findall("'([^']*)'",str(score))[0]
        print (set1)
        bank = swn.senti_synset(str(set1))
        print (bank)

    word_sense()
4

1 回答 1

1

nltk.wsd.lesk不返回分数,它返回预测的Synset

>>> from nltk.corpus import wordnet as wn
>>> from nltk.corpus import sentiwordnet as swn
>>> from nltk import word_tokenize
>>> from nltk.wsd import lesk
>>> sent = word_tokenize("He should be happy".lower())
>>> lesk(sent, 'be', 'v')
Synset('equal.v.01')

lesk并不完美,它应该只用作 WSD 的基线系统。

虽然这很好:

>>> ss = str(lesk(sent, 'be', 'v'))
>>> re.findall("'([^']*)'",ss)
['equal.v.01']

有一个更简单的获取同义词集标识符:

>>> lesk(sent, 'be', 'v').name()
u'equal.v.01'

然后你可以这样做:

>>> swn.senti_synset(lesk(sent, 'be', 'v').name())
SentiSynset('equal.v.01')

要转换POS tagWN POS,您可以简单地尝试:Converting POS tags from TextBlob into Wordnet compatible inputs

于 2015-04-19T23:23:50.373 回答