Use Synset1._shortest_path_distance(Synset2)
to find the hypernyms and their distances:
>>> 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}
Now find the minimum path:
>>> paths = alaska._shortest_hypernym_paths(california)
>>> min(paths, key=paths.get)
Synset('alaska.n.01')
Now, this is boring because california
and alaska
are sister nodes on the WordNet hierarchy. Let's filter out all sisters nodes:
>>> paths = {k:v for k,v in paths.items() if v > 0}
>>> min(paths, key=paths.get)
Synset('american_state.n.01')
To get the children nodes of the american_state
(I supposed this is the "something awesome" you need...):
>>> 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')]
This might look shocking but actually, there's no hypernyms indicated for alaska
or california
:
>>> alaska.hypernyms()
[]
>>> california.hypernyms()
[]
And the connection made using the _shortest_hypernym_paths
is by means of a dummy root, take a look at Is wordnet path similarity commutative?