JWNLを使ってJavaからWordNetにアクセスする方法のメモ

OpenNLPに続いて、NativeChecker関連ネタを書いてみます。

NativeCheckerでは、WordNetをオンメモリ展開して、スペルミスチェックと類義語検索に使っています。ここで利用しているのがJWNLです。僕がJavaWordNetライブラリをいくつか試した中では、JWNLの出来がダントツでした。JWNLの日本語情報もこれまた少ないので、簡単な使用方法をメモします。

1. WordNetのダウンロード

以下のサイトからWordNet最新版ではなく、バージョン2.0をダウンロードします。JWNLは最近メンテナンスされておらず、WordNet 2.1以降に非対応だからです(これは厳密には嘘なんだけど、ひとまず2.0を選んでおくのが無難)。

WordNet | A Lexical Database for English

2. JWNLのダウンロード

次にJWNLをダウンロードして、jwnl.jarとcommons-logging.jarをビルドパスに追加します。

3. プロパティファイルの編集

JWNLでは、辞書の置き場所としてファイル/メモリ/DBを選べるようになってるんですが、ここでは一番手軽なファイルを使うことにします。JWNLディレクトリ中のfile_properties.xmlを開いて、dictionary_pathパラメータがWordNetの辞書ディレクトリを指すように書き換えます。

<param name="dictionary_path" value="C:\Program Files\WordNet\2.0\dict"/>

4. サンプルプログラム

以下は、advocateという動詞の意味と同義語を表示するサンプルプログラムです。

package test;

import java.io.FileInputStream;

import net.didion.jwnl.JWNL;
import net.didion.jwnl.data.IndexWord;
import net.didion.jwnl.data.POS;
import net.didion.jwnl.data.Synset;
import net.didion.jwnl.data.Word;
import net.didion.jwnl.dictionary.Dictionary;

public class Test {
    public static void main(String[] args) {
        try {
            JWNL.initialize(new FileInputStream("C:\\jwnl\\file_properties.xml"));
            Dictionary dic = Dictionary.getInstance();
            IndexWord word = dic.lookupIndexWord(POS.VERB, "advocate");
            for(Synset synset : word.getSenses()) {
                System.out.println("[gloss] " + synset.getGloss());
                for(Word w: synset.getWords()) {
                    System.out.println("  [word] " + w.getLemma());
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

これを実行すると、次のように出力されます。

[gloss] push for something; "The travel agent recommended strongly that we not travel on Thanksgiving Day"
  [word] recommend
  [word] urge
  [word] advocate
[gloss] speak, plead, or argue in favour of; "The doctor advocated a smoking ban in the entire house"
  [word] preach
  [word] advocate

advocateという動詞から2つの意味を取り出すことができ、それぞれの同義語も取得することができました。

ここで出てきた{ recommend, urge, advocate }や{ preach, advocate }のような同義語グループをsynsetといいます。synset間には上位/下位をはじめとする様々な関係が定義されていて、関係のリンクを次から次へと辿っていくことができます。

今のところ、WordNetを使ったWebサービスがあまり見当たらないのが残念です。個人的には、WordNetをフルに活用すれば、iKnowの何倍も面白い英語学習サイトができると思っています。