[Python] NLTKを使ってみる (3) /WordNet

以下の続きです。

こちらのほぼ写経です。 NTLK Natural Language Toolkit NTLK(Natural Language Toolkit)とは、英語の自然言語のためのPythonのライブラリです。 公式サイト NTLKのインストール 公式の...
以下の続きです。 nltkeのモジュールと不思議の国のアリスを読み込みます。 >>> import nltk >>> from nltk.text import Text >>> alice = Text(nltk.corpus.gutenberg....

WordNet

nltk.corpusでは、WordNetという英語の辞書を利用することができます。


WordNet(ワードネット)は英語概念辞書意味辞書)である。WordNetでは英単語がsynsetと呼ばれる同義語のグループに分類され、簡単な定義や、他の同義語のグループとの関係が記述されている。 WordNetの目的は直感的に使うことのできる辞書シソーラスが組み合わされた成果物を作ること、および自動的文書解析や人工知能のアプリケーションの実現を支援することにある。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

NLTKでのWordNetの使い方は以下にまとまっています。

WordNet Interface

NLTKでWordNetを使うために、まずimport します。

>>> from nltk.corpus import wordnet as wn

synsets/類義語の集合 lemma/辞書に載っている形の単語

Synonymとは類義語のことです。

synsetsというメソッドで、その単語の類義語の集合(synonym sets)にアクセスできます。

‘inernet’という単語のsynsetsを見てみます。

>>> print(wn.synsets('internet'))
[Synset('internet.n.01')]

synsetsに含まれているそれぞれの類義語は、lemmaとして定義されています。

英語のlemmaは、その単語が辞書に載っている形という意味です。

>>> print(wn.synset('internet.n.01').lemma_names())
['internet', 'net', 'cyberspace']

WordNetでは、’internet’の類義語は、’internet’, ‘net’, ‘cyberspace’であることがわかりました。

synsetの定義は、definitionというメソッドで確認できます。

>>> print(wn.synset('internet.n.01').definition())
a computer network consisting of a worldwide network of computer networks that use the TCP/IP network protocols to facilitate data transmission and exchange

また、synsetの例文を、exampleというメソッドで確認できます。’internet’には例文はありません。

>>> print(wn.synset('internet.n.01').examples())
[]

‘car’という単語のsynsetsを見てみます。

>>> print(wn.synsets('car'))
[Synset('car.n.01'), Synset('car.n.02'), Synset('car.n.03'), Synset('car.n.04'), Synset('cable_car.n.01')]

‘car.n.01’の定義と用例を確認します。

>>> print(wn.synset('car.n.01').definition())
a motor vehicle with four wheels; usually propelled by an internal combustion engine
>>> print(wn.synset('car.n.01').examples())
['he needs a car to get to work']

‘car’に含まれる全てのsynsetの定義を確認します。

>>> for i, synset in enumerate(wn.synsets('car')):
...     print(i, synset.definition())
...
0 a motor vehicle with four wheels; usually propelled by an internal combustion engine
1 a wheeled vehicle adapted to the rails of railroad
2 the compartment that is suspended from an airship and that carries personnel and the cargo and the power plant
3 where passengers ride up and down
4 a conveyance for passengers or freight on a cable railway

lemmasというメソッドで、synsetのlemmaを取得できます。

>>> print(wn.synset('internet.n.01').lemmas())
[Lemma('internet.n.01.internet'), Lemma('internet.n.01.net'), Lemma('internet.n.01.cyberspace')]

逆に、lemmaからsynsetを取得することもできます。

>>> print(wn.lemma('internet.n.01.net').synset())
Synset('internet.n.01')

Hyponym/下位概念 Hypernym/上位概念

‘cat’という単語を使って、Hyponym/下位概念とHypernym/上位概念を確認します。

まず、’cat’のsynsetsを確認します。

>>> print(wn.synsets('cat'))
[Synset('cat.n.01'), Synset('guy.n.01'), Synset('cat.n.03'), Synset('kat.n.01'), Synset('cat-o'-nine-tails.n.01'), Synset('caterpillar.n.02'), Synset('big_cat.n.01'), Synset('computerized_tomography.n.01'), Synset('cat.v.01'), Synset('vomit.v.01')]

Synset(‘cat.n.01’)の定義を確認すると、これが普通の哺乳類のネコであることがわります。

>>> print(wn.synset('cat.n.01').definition())
feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats

Synset(‘cat.n.01’)のHyponym/下位概念を確認します。

>>> cat = wn.synset('cat.n.01')
>>> types_of_cats = cat.hyponyms()
>>> for synset in types_of_cats:
...     for lemma in synset.lemmas():
...         print(lemma.name())
...
domestic_cat
house_cat
Felis_domesticus
Felis_catus
wildcat

逆に、Synset(‘house_cat’)のHypernym/上位概念を確認します。

>>> print(wn.synset('house_cat.n.01').hypernyms())
[Synset('cat.n.01'), Synset('domestic_animal.n.01')]

2つの単語の類似性

path_similarity

ある2つの単語の類似性を、Hyponym/下位概念とHypernym/上位概念の距離と考えることができます。

nltk.corpus.wordnetでは、’path_similarity’ というメソッドを使って簡単にこの類似性を計算できます。

‘car’ と ‘automoble’ で確認してみます。

まず、’car’ と ‘automoble’ をWordNet上で見ると、どちらも同じものであることがわかります。

>>> car = wn.synset('car.n.01')
>>> automobile = wn.synset(('automobile.n.01'))
>>>
>>> print(car.definition())
a motor vehicle with four wheels; usually propelled by an internal combustion engine
>>> print(automobile.definition())
a motor vehicle with four wheels; usually propelled by an internal combustion engine
>>>
>>> print(car.lemma_names())
['car', 'auto', 'automobile', 'machine', 'motorcar']
>>> print(automobile.lemma_names())
['car', 'auto', 'automobile', 'machine', 'motorcar']

‘path_similarity’で’car’ と ‘automoble’の類似性を計算します。1になるはずです。

>>> print(car.path_similarity(automobile))
1.0

今度は’car’と’boat’の類似性を確認します。1よりは低くなるはずです。

>>> boat = wn.synset('boat.n.01')
>>> print(car.path_similarity(boat))
0.125

その他のsimilarityメソッド

’path_similarity’だけではなく、単語の類似性を計算するほかのアルゴリズムも実装されています。 

こちらのSimilarityにそれぞれの使い方が載っています。

  • Leacock-Chodorow Similarity
  • Wu-Palmer Similarity
  • Resnik Similarity
  • Jiang-Conrath Similarity
  • Lin Similarity

ここでは、’Wu-Palmer Similarity’を使ってみます。

>>> print(car.wup_similarity(boat))
0.6956521739130435
>>> cat = wn.synset('cat.n.01')
>>> print(car.wup_similarity(cat))
0.32

当然ですが、‘path_similarity’とは異なる結果となりました。