<p>使用<code>Synset1._shortest_path_distance(Synset2)</code>来查找其上位词及其距离:</p>
<pre><code>>>> 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}
</code></pre>
<p>现在找到最小路径:</p>
^{pr2}$
<p>现在,这很无聊,因为<code>california</code>和{<cd3>}是WordNet层次结构中的姊妹节点。让我们过滤掉所有姐妹节点:</p>
<pre><code>>>> paths = {k:v for k,v in paths.items() if v > 0}
>>> min(paths, key=paths.get)
Synset('american_state.n.01')
</code></pre>
<p>要获取<code>american_state</code>的子节点(我想这就是您需要的“something awesome”了…):</p>
<pre><code>>>> 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')]
</code></pre>
<p>这看起来可能令人震惊,但实际上,<code>alaska</code>或<code>california</code>没有指定的上下位词:</p>
<pre><code>>>> alaska.hypernyms()
[]
>>> california.hypernyms()
[]
</code></pre>
<p>使用<code>_shortest_hypernym_paths</code>建立的连接是通过一个虚拟根来实现的,看一下<a href="https://stackoverflow.com/questions/20075335/is-wordnet-path-similarity-commutative">Is wordnet path similarity commutative?</a></p>