以下の続きです。
WordNet
nltk.corpusでは、WordNetという英語の辞書を利用することができます。
WordNet(ワードネット)は英語の概念辞書(意味辞書)である。WordNetでは英単語がsynsetと呼ばれる同義語のグループに分類され、簡単な定義や、他の同義語のグループとの関係が記述されている。 WordNetの目的は直感的に使うことのできる辞書とシソーラスが組み合わされた成果物を作ること、および自動的文書解析や人工知能のアプリケーションの実現を支援することにある。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
NLTKでのWordNetの使い方は以下にまとまっています。
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’とは異なる結果となりました。