Pythonから利用するWordnet

Wordnetとは...プリンストン大学が開発している語データーベースっていう説明でいいのかなあ, 一応,wikipediaの記事を載せておくWordNet

日本語版wordnetNICTが開発している)だと,日本語で解説されているページがけっこうある.例えばこんなの

けど,英語版wordnetの使い方を日本語で解説した記事.というのはほとんど見つからない.ましてや,Python言語から英語版wordnetの使い方を解説した記事なんて見つからなかった.

仕方がないので,英語で探して,英語で読む. すると,こんな解説スライドがあった.どこかの大学の授業スライド?なのかな?

どうも,Pythonからwordnetを利用する時には,nltkライブラリで簡単に扱えるらしい.

スライドと同じ内容を,ちょっとだけ覚書を残しておく.

クエリ語の同義語を得る

>>> from nltk.corpus import wordnet
>>> honeySynsets = wordnet.synsets("honey", pos="n")

wordnet.synsetsメソッドから同義語を得ることができる.第一引数にクエリ語を,第二引数にその品詞を与える.で戻り値は同義語集合(型はリスト).

同義語集合を確認したいときは

>>> print honeySynsets
[Synset('honey.n.01'), Synset('beloved.n.01')]

大体の場合,同義語集合の要素数は1より多い.

ちなみに,要素である同義語に型はnltk.corpus.reader.wordnetクラスのインスタンスである.

>>> for s in honeySynsets:
...     type(s)
... 
<class 'nltk.corpus.reader.wordnet.Synset'>
<class 'nltk.corpus.reader.wordnet.Synset'>

クエリ語の上位概念を得る

語の上位概念を得たい時は,同義語インスタンスの,hypernymsメソッドを利用する.引数は空.

>>> for s in honeySynsets:
...     s.hypernyms()
... 
[Synset('sweetening.n.01')]
[Synset('lover.n.01')]

語honey(はちみつ)の上位語は「甘いもの」,で,語beloved(愛する人)の上位語は「恋人」になっている.

インスタンスオブジェクトでなく,文字を得る

基本的に,同義語や上位概念語はnltk.corpus.reader.wordnetクラスのインスタンスで返される.けど,インスタンスでなく,文字型で結果が欲しい時もあるはずだ.

lemma_namesメソッドを利用すればいいらしい.ここを参考にしてみた.

lemma_namesということで,lemma語が余計に増えてしまっている気がするが...まあ,当初の目的は達成できているからよしとするか...

下のサンプルコードで,lemma_namesを利用すると文字型のオブジェクトが返されているのがわかる.

In [14]: for s in honeySynsets:
    hy=s.hypernyms();
    for h in hy:
        for tmp in h.lemma_names:
   ....:             print tmp
   ....:             print type(tmp)
   ....:             
sweetening
<type 'str'>
sweetener
<type 'str'>
lover
<type 'str'>