简短版本:
如果我有一个词干:
Say 'comput' for 'computing', or 'sugari' for 'sugary'
有没有办法构建它最接近的名词形式?
That is 'computer', or 'sugar' respectively
更长的版本:
我正在使用python和NLTK,Wordnet在一堆单词上执行一些语义相似性任务
我注意到大多数sem-sim分数仅适用于名词,而形容词和动词不会产生任何结果。
理解所涉及的不准确性,我想将一个单词从其动词/形容词形式转换为它的名词形式,所以我可以估计它们的相似性(而不是通常用形容词返回的'NONE')。
我认为这样做的一种方法是使用词干分析器获取根词,然后尝试构造该词根的最接近的名词形式。
来自here的George-Bogdan Ivanov的算法效果非常好。我想尝试其他方法。有没有更好的方法将单词从形容词/动词形式转换为名词形式?
答案 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)