[英]NLTK Wordnet Synset for word phrase
我正在使用Python NLTK Wordnet API。 我正在尝试找到代表一组单词的最佳synset。
如果我需要为“学校和办公用品”找到最好的同义词,我不知道如何解决这个问题。 到目前为止,我已经尝试找到单个单词的同义词,然后计算最好的最低常见上限,如下所示:
def find_best_synset(category_name):
text = word_tokenize(category_name)
tags = pos_tag(text)
node_synsets = []
for word, tag in tags:
pos = get_wordnet_pos(tag)
if not pos:
continue
node_synsets.append(wordnet.synsets(word, pos=pos))
max_score = 0
max_synset = None
max_combination = None
for combination in itertools.product(*node_synsets):
for test in itertools.combinations(combination, 2):
score = wordnet.path_similarity(test[0], test[1])
if score > max_score:
max_score = score
max_combination = test
max_synset = test[0].lowest_common_hypernyms(test[1])
return max_synset
然而,这不是很好,而且成本很高。 有没有办法找出哪个synset最能代表多个单词?
谢谢你的帮助!
除了我在评论中已经说过的内容,我认为你选择最好的超级用户的方式可能有缺陷。 您最终得到的同义词不是所有单词的最低常见超字,而只是其中两个单词的最低位。
让我们坚持你的“学校和办公用品”的例子。 对于表达式中的每个单词,您将获得许多同义词。 所以变量node_synsets
看起来如下所示:
[[school_1, school_2], [office_1, office_2, office_3], [supply_1]]
在此示例中,有6种方法可以将每个synset与任何其他synset组合在一起:
[(school_1, office_1, supply_1),
(school_1, office_2, supply_1),
(school_1, office_3, supply_1),
(school_2, office_1, supply_1),
(school_2, office_2, supply_1),
(school_2, office_3, supply_1)]
这些三元组是你在外部for
循环中迭代的东西(使用itertools.product
)。 如果表达式有4个单词,你将迭代四倍,其中5个是五元组等。
现在,使用内部for
循环,您可以配对每个三元组。 第一个是:
[(school_1, office_1),
(school_1, supply_1),
(office_1, supply_1)]
...并确定每对中最低的超名称。 所以最后你会得到最低的superonym,比如, school_2
和office_1
,这可能是某种机构。 这可能不是很有意义,因为它不考虑最后一个单词的任何synset。
也许你应该尝试在他们的同义词的每个组合中找到所有三个单词的最低常见超量名,并在其中获得最佳得分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.