从词干中获取最接近的名词

时间:2013-06-13 09:19:04

标签: python nltk wordnet stemming pos-tagger

简短版本:
如果我有一个词干:
Say 'comput' for 'computing', or 'sugari' for 'sugary'
有没有办法构建它最接近的名词形式?
That is 'computer', or 'sugar' respectively


更长的版本:
我正在使用python和NLTK,Wordnet在一堆单词上执行一些语义相似性任务 我注意到大多数sem-sim分数仅适用于名词,而形容词和动词不会产生任何结果。
理解所涉及的不准确性,我想将一个单词从其动词/形容词形式转换为它的名词形式,所以我可以估计它们的相似性(而不是通常用形容词返回的'NONE')。

我认为这样做的一种方法是使用词干分析器获取根词,然后尝试构造该词根的最接近的名词形式。
来自here的George-Bogdan Ivanov的算法效果非常好。我想尝试其他方法。有没有更好的方法将单词从形容词/动词形式转换为名词形式?

2 个答案:

答案 0 :(得分:1)

您可能需要查看此示例:

>>> from nltk.stem.wordnet import WordNetLemmatizer
>>> WordNetLemmatizer().lemmatize('having','v')
'have'

(来自this SO answer),看它是否向您发送正确的方向。

答案 1 :(得分:1)

首先从wordnet个同义词中提取所有可能的候选者。 然后使用difflib将字符串与目标词干进行比较。

>>> from nltk.corpus import wordnet as wn
>>> from itertools import chain
>>> from difflib import get_close_matches as gcm
>>> target = "comput"
>>> candidates = set(chain(*[ss.lemma_names for ss in wn.all_synsets('n') if len([i for i in ss.lemma_names if target in i]) > 0]))
>>> gcm(target,candidates)[0]

计算候选人的更易读的方法是:

candidates = set()
for ss in wn.all_synsets('n'):
  for ln in ss.lemma_names: # get all possible lemmas for this synset.
    for lemma in ln:
      if target in lemma:
        candidates.add(target)