日本語 WordNet の Java API を公開しました
今月、日本語 WordNet が独立行政法人情報通信研究機構(NICT)より一般公開されました。プリンストン大学の英語版 WordNet を元に3年かけて構築したそうで、数万語の単語が登録されており、同義語、上位語、下位語、メロニム、ホロニム、関連語、定義、訳などの多種多様な言語知識(詳細はwikipediaがわかりやすい)を無料で利用できるという、とても貴重なシソーラスです。ちなみにいままでは、この規模の日本語シソーラスは無料では手に入りませんでした。NICTのサイトで公示されている入札情報から見積もると構築コストは数千万円かかっていると思いますが、そんな成果物が無料なんですから、太っ腹です。
さて、公開された日本語 WordNet のデータベースを自然言語処理アプリケーションに応用するには、API がいると思い、Java API を作成・公開しました。プログラム側がデータベースを意識しなくてもデータにアクセスできるようになります。
一般的な Java プログラマー用のシンプルな API を使うと、こんな感じになります。
サンプルコード:
出力結果:
このように簡単に同義語(まだパッケージに入れていませんが次のリリースに入れます)、上位語などにアクセスできる一方、多義語を一緒くたに扱っているのでノイズが目立つ場合もあります。
もうちょっと細かい制御ができる、自然言語処理アプリケーション開発者用の API として、以下のドメインモデル図のそれぞれのクラスに対し DAO を提供しています。こちらは多義語を区別します。

興味がある方は、こちらにもっと詳しいサンプルや解説やコードを載せましたので、ご利用ください。将来的にはウェブUIや単語間の意味の近さを測る指標を実装したいと思います。
おまけ:
wnjpn-0.9.db はインデックスを張り直すと、探索が劇的に速くなります。
追加インデックスによって、word と sense テーブルを wordid で JOIN する時間は、70倍ぐらい早くなりました。Synset テーブルも加えると、500倍ぐらい変わってきます。
謝辞:
NICTの方々、有用なリソースの無料公開ありがとうございます。
ライブラリ は斉藤先生の SQLite JDBC Driver を利用しました。
関連:
英語版 WordNet
Wikipedia (JA) の WordNet のページ
Python 版日本語 WordNet フロントエンド
Ruby 版日本語 WordNet フロントエンド
Perl版は日本語ワードネットのサイト上から入手できます。
さて、公開された日本語 WordNet のデータベースを自然言語処理アプリケーションに応用するには、API がいると思い、Java API を作成・公開しました。プログラム側がデータベースを意識しなくてもデータにアクセスできるようになります。
一般的な Java プログラマー用のシンプルな API を使うと、こんな感じになります。
サンプルコード:
String word = "真空管";
POS pos = POS.n; // 品詞は名詞と指定
//辞書から言語知識にアクセス
Set synonyms = JAWJAW.findSynonyms(word, pos);
Set hypernyms = JAWJAW.findHypernyms(word, pos);
Set hyponyms = JAWJAW.findHyponyms(word, pos);
Set meronyms = JAWJAW.findMeronyms(word, pos);
Set holonyms = JAWJAW.findHolonyms(word, pos);
Set translations = JAWJAW.findTranslations(word, pos);
Set definitions = JAWJAW.findDefinitions(word, pos);
//結果表示
System.out.println( "synonyms of "+word+" : \t"+ synonyms );
System.out.println( "hypernyms of "+word+" : \t"+ hypernyms );
System.out.println( "hyponyms of "+word+" : \t"+ hyponyms );
System.out.println( "meronyms of "+word+" : \t"+ meronyms );
System.out.println( "holonyms of "+word+" : \t"+ holonyms );
System.out.println( "translations of "+word+" : \t"+ translations );
System.out.println( "definitions of "+word+" : \t"+ definitions );
出力結果:
このように簡単に同義語(まだパッケージに入れていませんが次のリリースに入れます)、上位語などにアクセスできる一方、多義語を一緒くたに扱っているのでノイズが目立つ場合もあります。
もうちょっと細かい制御ができる、自然言語処理アプリケーション開発者用の API として、以下のドメインモデル図のそれぞれのクラスに対し DAO を提供しています。こちらは多義語を区別します。

興味がある方は、こちらにもっと詳しいサンプルや解説やコードを載せましたので、ご利用ください。将来的にはウェブUIや単語間の意味の近さを測る指標を実装したいと思います。
おまけ:
wnjpn-0.9.db はインデックスを張り直すと、探索が劇的に速くなります。
DROP INDEX sense_idx;
CREATE INDEX sense_synset_idx ON sense (synset);
CREATE INDEX sense_wordid_idx ON sense (wordid);
CREATE INDEX synset_id_idx ON synset (synset);
CREATE INDEX synset_def_id_idx ON synset_def (synset);
謝辞:
NICTの方々、有用なリソースの無料公開ありがとうございます。
ライブラリ は斉藤先生の SQLite JDBC Driver を利用しました。
関連:
英語版 WordNet
Wikipedia (JA) の WordNet のページ
Python 版日本語 WordNet フロントエンド
Ruby 版日本語 WordNet フロントエンド
Perl版は日本語ワードネットのサイト上から入手できます。