我是Python和NLTK的新手,所以请耐心等待。我希望在一个句子的语境中找到一个词的意义。我使用的是Lesk WSD算法,但每次运行时它都会提供不同的输出。我知道莱斯克有一定程度的不准确。但是,我认为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()
答案 0 :(得分: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']
获取synset标识符更简单:
>>> lesk(sent, 'be', 'v').name()
u'equal.v.01'
然后你可以这样做:
>>> swn.senti_synset(lesk(sent, 'be', 'v').name())
SentiSynset('equal.v.01')
要将POS tag
转换为WN POS
,您只需尝试:Converting POS tags from TextBlob into Wordnet compatible inputs