[英]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.