JWNLを使ってJavaからWordNetにアクセスする方法のメモ
OpenNLPに続いて、NativeChecker関連ネタを書いてみます。
NativeCheckerでは、WordNetをオンメモリ展開して、スペルミスチェックと類義語検索に使っています。ここで利用しているのがJWNLです。僕がJavaのWordNetライブラリをいくつか試した中では、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の何倍も面白い英語学習サイトができると思っています。