Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

概念辞書について

梅雨明けに差し掛かり、徐々に日差しが強くなりうだるような暑さになってまいりました。うっちーです。前回、自然言語処理における辞書の話をしたので、今回は概念辞書というものについて話していきたいと思います。

概念辞書とは

概念辞書とは意味辞書とも呼ばれ、単語の分類や他の単語との関係などを付与したものです。 概念辞書を使うことで、ある単語に対する鵜様々な単語との関連や想起する語などを見つけ出すことができます。 以下の画像は、概念辞書の一例です。 この画像は、のちの参考文献にあるNICT NEWSのものを引用させていただきました。

f:id:ucchi_in:20160712214132p:plain

概念辞書の意義

概念辞書は、自然言語処理においてコンピューターが意味を理解するために利用されています。 意味を理解するというのは、例えば哺乳類といったような一般的な語に対して、人間やイルカなどといった特定の下位語が存在しているなどのことを、コンピュータが分かるようになるといったような感じです。

そしてコンピュータによる意味理解は、上位語や下位語、関連語などを見つけることができるため、情報検索のキーワードを選択するために使われることが多いです。 また、機械翻訳などの際にも使われることがあります。 これは機械翻訳において、翻訳前の単語の意味に相当するものを翻訳先の言語における概念辞書で探すといったアプローチがあるからです。

概念辞書の関連

概念辞書に近いものにシソーラスや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

gist.github.com

ただ、そのままだと使えないので、以下の部分を修正してください。 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

参考文献

概念辞書について

概念辞書を用いたプログラムについて

さいごに

自然言語処理において、こういった特殊な用語が数多くあるので少しづつ覚えていきましょう。