使用Synset1._shortest_path_distance(Synset2)
找到上位詞的下義詞和他們的距離:
>>> from nltk.corpus import wordnet as wn
>>> alaska = wn.synset('Alaska.n.1')
>>> california = wn.synset('California.n.1')
>>> alaska._shortest_hypernym_paths(california)
{Synset('district.n.01'): 4, Synset('location.n.01'): 6, Synset('region.n.03'): 5, Synset('physical_entity.n.01'): 8, Synset('entity.n.01'): 9, Synset('state.n.01'): 2, Synset('administrative_district.n.01'): 3, Synset('object.n.01'): 7, Synset('alaska.n.01'): 0, Synset('*ROOT*'): 10, Synset('american_state.n.01'): 1}
現在找到最小路徑:
>>> paths = alaska._shortest_hypernym_paths(california)
>>> min(paths, key=paths.get)
Synset('alaska.n.01')
現在,這是無聊,因爲california
和alaska
是WordNet層次結構中的姐妹節點。讓我們過濾掉所有的姐妹節點:
>>> paths = {k:v for k,v in paths.items() if v > 0}
>>> min(paths, key=paths.get)
Synset('american_state.n.01')
爲了得到american_state
的子節點(我認爲這是「東西真棒」你需要...):
>>> min(paths, key=paths.get).hyponyms()
[Synset('free_state.n.02'), Synset('slave_state.n.01')]
>>> list(min(paths, key=paths.get).closure(lambda s:s.hyponyms()))
[Synset('free_state.n.02'), Synset('slave_state.n.01')]
這可能看起來令人震驚但實際上,有沒有爲alaska
或california
表示上位:
>>> alaska.hypernyms()
[]
>>> california.hypernyms()
[]
並採用_shortest_hypernym_paths
是連接製成由我ans虛擬根,看看Is wordnet path similarity commutative?
你能解釋一下你需要更詳細嗎?這是有點不清楚你想要達到什麼。 – alvas
查看'do_something_awesome()的結果,在這種情況下,它將是所有美國州,比如美國和加拿大可能是所有國家。對於大西洋和太平洋來說,它可能是所有的海洋。 –
然後我不認爲'wordnet',嘗試嵌入'word2vec'或其他字。 Wordnet是手動創建的,在本體知識中存在(令人尷尬的)很多「漏洞」。 – alvas