概念辞書について
梅雨明けに差し掛かり、徐々に日差しが強くなりうだるような暑さになってまいりました。うっちーです。前回、自然言語処理における辞書の話をしたので、今回は概念辞書というものについて話していきたいと思います。
概念辞書とは
概念辞書とは意味辞書とも呼ばれ、単語の分類や他の単語との関係などを付与したものです。 概念辞書を使うことで、ある単語に対する鵜様々な単語との関連や想起する語などを見つけ出すことができます。 以下の画像は、概念辞書の一例です。 この画像は、のちの参考文献にあるNICT NEWSのものを引用させていただきました。
概念辞書の意義
概念辞書は、自然言語処理においてコンピューターが意味を理解するために利用されています。 意味を理解するというのは、例えば哺乳類といったような一般的な語に対して、人間やイルカなどといった特定の下位語が存在しているなどのことを、コンピュータが分かるようになるといったような感じです。
そしてコンピュータによる意味理解は、上位語や下位語、関連語などを見つけることができるため、情報検索のキーワードを選択するために使われることが多いです。 また、機械翻訳などの際にも使われることがあります。 これは機械翻訳において、翻訳前の単語の意味に相当するものを翻訳先の言語における概念辞書で探すといったアプローチがあるからです。
概念辞書の関連
概念辞書に近いものにシソーラスやWordNetなどがあります。
シソーラス
シソーラスとは単語を様々な関係ごとに分類・体系づけした類語辞書であり、概念辞書とほぼ同じものです。
WordNet
WordNetそのものはプリンストン大学が開発している英語の概念辞書のことを指しますが、日本語の概念辞書のことが日本語WordNeと呼ばれることもあります。
概念辞書・シソーラスの例
- 分類語彙表(国立国語研究所)
- 日本語語彙大系(岩波書店)
- 角川類語国語辞典(角川書店)
- 日本語大シソーラス(大修館書店)
- EDR概念体系辞書(EDRプロジェクト)
- デジタル類語辞典(ジャングル)
- JST科学技術用語シソーラス(JST科学技術振興機構)
- 日本語WordNet (NICT)
実際に使用してみる
それでは、実際に概念辞書を使ってみましょう。 無料で使えるNICTの概念辞書を利用します。 プログラムで使ってみる前に、公式サイトにあるWordNet検索で、 概念辞書のイメージをつかんでみるといいかもしれません。
準備
今回も環境は、Ubuntu上でpython2を使ってやっていきます。
まず、概念辞書を以下のサイトからダウンロードして解凍します。
ダウンロードするのは、Japanese Wordnet and English WordNet in an sqlite3 database
と書かれているものです。
http://nlpwww.nict.go.jp/wn-ja/jpn/downloads.html
使用する概念辞書は見ての通りsqlite3を使ったものです。 なので、いちいちクエリを投げていってもいいのですが、それだと少し面倒なので簡単なラッパーを使います。 以下のyanbeさんの作成したものを利用します。wn.pyという名前で以下のコードを保存するか、gitでとってきてください。
http://subtech.g.hatena.ne.jp/y_yanbe/20090314/p2
ただ、そのままだと使えないので、以下の部分を修正してください。 2行目は、utf-8の文字コードでリクエストを投げる際に必要な処理です。
conn = sqlite3.connect("wnjpn-0.9.db")
↓
conn = sqlite3.connect("wnjpn.db")conn.text_factory = str
実践
今回は、類義語を求めるプログラムを書いてみました。 keyに好きな単語を入れると、その類義語を語義ごとに出力します。 コードについて簡単に説明すると、まず検索する語を見出し語(lemma)として辞書に登録された語を探します。 次に、その辞書に登録された語から、その語が持つ意味(sense)を見つけます。 そして、その意味を持つ同意語の組(synset)を見つけ、出力していくといった流れになっています。
コード
cat find_synonym.py #!/usr/bin/env python # -*- coding: utf-8 -*- import sys, sqlite3 import wn conn = sqlite3.connect("wnjpn.db") conn.text_factory = str def getSynonyms (lemma): synonyms = [] for word in wn.getWords(lemma): for sense in wn.getSenses(word): if sense.lang != 'jpn': continue synset = wn.getSynset(sense.synset) print synset.name res = conn.execute("select * from sense where synset=? and lang=?", (synset.synset, 'jpn')) for sense_include_word in res.fetchall(): if word.wordid == sense_include_word[1]: continue print "\t", wn.getWord(sense_include_word[1]).lemma if __name__ == '__main__': key = '犬' getSynonyms (key)
実行結果
spy 廻者 間諜 工作員 間者 探 諜報員 諜者 密偵 スパイ 秘密捜査員 いぬ まわし者 隠密 探り 廻し者 回し者 回者 canis_familiaris 飼い犬 ドッグ 飼犬 洋犬 イヌ
今回は、類義語を出力しましたが、先ほどの説明の通り概念辞書の特徴は語の意味をコンピュータが理解できるということです。 他にも類似度の計算や上位(下位)の語の検索、ある語に対する原因や構成などできることは無数にあります。 ぜひ、試してみてください。
追記
あとで調べたら、同じようなことをやっている記事がありました。 Python3でやってるようなので、Python3でやりたいって人は以下を参考にしてみてください。
[自然言語] Wordnet × Pythonで類義語を抽出する - YoheiM .NET
参考文献
概念辞書について
NICT NEWS http://www.nict.go.jp/publication/NICT-News/0912/02.html
自然言語処理 第13回: 連想概念辞書の応用 http://gc.sfc.keio.ac.jp/class/2005_14463/slides/13/
概念辞書を用いたプログラムについて
NICTの日本語WordNet http://nlpwww.nict.go.jp/wn-ja/jpn/detail.html
Wordnetの中をのぞいてみた Wordnetの中をのぞいてみた - 唯物是真 @Scaled_Wurm
さいごに
自然言語処理において、こういった特殊な用語が数多くあるので少しづつ覚えていきましょう。