1

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


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

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

4

2 回答 2

1

你可能想看看这个例子:

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

(来自这个 SO answer)看看它是否会向您发送正确的方向。

于 2013-06-13T15:26:00.083 回答
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)
于 2013-06-26T10:00:31.450 回答