使用wordnet获得句子中单词的最佳同义词

时间:2017-05-25 10:46:34

标签: python nlp nltk wordnet

我已经完成了从wordnet获取同义词的代码,它提供了每个单词的同义词的完整列表。 所以,我希望我的代码根据句子从同义词列表中选择适当的同义词。

例如: 句子是:“我是他的哥哥”,我必须根据这句话找出每个单词的最佳同义词。

让我们选择“较旧”。 Wordnet将为“较旧”提供同义词列表:

['elder','onetime','former','sr。','one-time','erstwhile','honest-to-god','old','Old', '以前','肯定够','老','高级','老','有时','诚实到善','quondam','老人']

从列表中,基于这句话的最佳同义词是'elder',所以应该选择它。

我该怎么做?

获取同义词的代码:

from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag
from nltk.corpus import wordnet as wn

def tag(sentence):
 words = word_tokenize(sentence)
 words = pos_tag(words)
 return words

def paraphraseable(tag):
 return tag.startswith('NN') or tag == 'VB' or tag.startswith('JJ')

def pos(tag):
 if tag.startswith('NN'):
  return wn.NOUN
 elif tag.startswith('V'):
  return wn.VERB

def synonyms(word, tag):
    lemma_lists = [ss.lemmas() for ss in wn.synsets(word, pos(tag))]
    lemmas = [lemma.name() for lemma in sum(lemma_lists, [])]
    return set(lemmas)

def synonymIfExists(sentence):
 for (word, t) in tag(sentence):
   if paraphraseable(t):
    syns = synonyms(word, t)
    if syns:
     if len(syns) > 1:
      yield [word, list(syns)]
      continue
   yield [word, []]

def paraphrase(sentence):
 return [x for x in synonymIfExists(sentence)]
get=[]
get=paraphrase("I am his older brother")
print("paraphrase",get)

1 个答案:

答案 0 :(得分:2)

列出了synsets中的同义词,无论它们在自然语言和给定上下文中的出现频率如何。 为了更好地探索这两个缺失区域,我会选择双向预测模型,并检查synset中的哪些单词出现在您想要替换它的话语左侧上下文旁边。同样,您可以探索正确的上下文好的和/或更长的背景。

另一种(更简单的)方法是基于来自足够大的语料库的词频将频率顺序引入WordNet。假设语料库中出现的频率是对同义词的感知适用性的正确暗示。