我在 Python 使用 Lesk 算法进行词义消歧时遇到问题
I am having problems doing Word Sense Disambiguation in Python using Lesk algorithm
我是 Python 和 NLTK 的新手,所以请多多包涵。我希望在句子的上下文中找到单词的含义。我正在使用 Lesk WSD 算法,但每次我 运行 它都会给出不同的输出。我知道 Lesk 有一定程度的不准确性。但是,我认为 POS 标签会提高准确性。
Lesk 算法以 POS 标签作为参数,但它以 'n'、's'、'v' 作为输入而不是 'NN'、'VBP' 或其他由 pos_tag() 函数输出的词性标记。我想知道如何以 'n'、's'、'v' 的形式标记单词,或者是否有一种方法可以将 'NN'、'VBP' 和其他标签到 'n'、's'、'v',所以我可以将它们作为 lesk(context_sentence、word、[=31= 的输入]) 功能。
之后我正在使用 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()
nltk.wsd.lesk
没有 return 得分,它 return 是预测的 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 tag
转换为WN POS
,您可以简单地尝试:Converting POS tags from TextBlob into Wordnet compatible inputs
我是 Python 和 NLTK 的新手,所以请多多包涵。我希望在句子的上下文中找到单词的含义。我正在使用 Lesk WSD 算法,但每次我 运行 它都会给出不同的输出。我知道 Lesk 有一定程度的不准确性。但是,我认为 POS 标签会提高准确性。
Lesk 算法以 POS 标签作为参数,但它以 'n'、's'、'v' 作为输入而不是 'NN'、'VBP' 或其他由 pos_tag() 函数输出的词性标记。我想知道如何以 'n'、's'、'v' 的形式标记单词,或者是否有一种方法可以将 'NN'、'VBP' 和其他标签到 'n'、's'、'v',所以我可以将它们作为 lesk(context_sentence、word、[=31= 的输入]) 功能。
之后我正在使用 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()
nltk.wsd.lesk
没有 return 得分,它 return 是预测的 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 tag
转换为WN POS
,您可以简单地尝试:Converting POS tags from TextBlob into Wordnet compatible inputs