path_similarityの利用

path_similarityを利用して単語間の類似度を求めてみよう。 path_similarityは共通の上位階層経由のパスの長さに基づく 同義語集合synset)間の類似度であった(path_similarityの項目を参照)。 単語間の類似度を求めるにはどうしたらいいだろうか。

同義語集合間の類似度から単語間の類似度を計算する

例として2つの単語「apple」と「grape」の類似度を求めたいケースを考えてみよう。path_similarityを利用するためには、 同義語集合同士を比較しなければならないから、まずはそれぞれの単語の同義語集合にどのようなものがあるかを調べよう。

>>> wn.synsets('apple')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>>
>>> wn.synsets('grape')
[Synset('grape.n.01'), Synset('grape.n.02'), Synset('grapeshot.n.01')]
>>>

「apple」には2種類、「grape」には3種類の同義語集合があることがわかった。それぞれの定義を調べてみよう。

>>> cnt=0
>>> for syn in wn.synsets('apple'):
...    cnt+=1
...    print cnt,
...    print ': ' + syn.definition
...
1 : fruit with red or yellow or green skin and sweet to tart crisp whitish flesh
2 : native Eurasian tree widely cultivated in many varieties
    for its firm rounded edible fruits
>>>
>>> cnt=0
>>> for syn in wn.synsets('grape'):
...    cnt+=1
...    print cnt,
...    print ': ' + syn.definition
...
1 : any of various juicy fruit of the genus Vitis with green or purple skins;
    grow in clusters
2 : any of numerous woody vines of genus Vitis bearing clusters of edible berries
3 : a cluster of small projectiles fired together from a cannon to produce a hail 
    of shot
>>>

「apple」の2つの同義語集合、「grape」の3つの同義語集合それぞれの類似度を求めてみよう。

>>> cnt1=0
>>> for s1 in wn.synsets('apple'):
...    cnt1+=1
...    cnt2=0
...    for s2 in wn.synsets('grape'):
...       cnt2+=1
...       print cnt1,
...       print ': ',
...       print cnt2,
...       print ': ',
...       print s1.path_similarity(s2)
...
1 :  1 :  0.333333333333
1 :  2 :  0.0714285714286
1 :  3 :  0.0625
2 :  1 :  0.0555555555556
2 :  2 :  0.111111111111
2 :  3 :  0.0526315789474
>>>

「apple」の1つ目の同義語集合(フルーツとしてのリンゴ)と「grape」の1つ目の同義語集合(フルーツとしてのブドウ)との 類似度が一番高く(0.333333333333)、指標としてわるくはなさそうだ。

場合によっては、次のようなルールでもよいだろう。