kuromojiとユーザ辞書(IPADIC)

前にkuromojiのユーザ辞書を作成して取り込ませるというのをやったのですが、今回は、ユーザ辞書をjarに含めた状態にしたものを作成してみます。

katsu-tech.hatenablog.com
でやったこととほぼ同じですが、csvのフォーマットと文字コードが異なるので変更します。http://katsu-tech.hatenablog.com/entry/2015/03/24/072848
(IPADICはEUC-JPなので文字コードを変換する必要があります。)

nkf -w jawiki-latest-all-titles-in-ns0 | grep -v '[!-/:-@≠\[-`{-~]' | grep -v '^[0-9]' | egrep -v '^[ぁ-ん]{2}' | grep -v 'の一覧' | grep -v '曖昧さ回避' | awk '{ print length($1),$1; }' | grep -v '1[[:space:]]' | sed -r 's/.*[[:space:]](.*)/\1,1285,1285,6583,名詞,一般,*,*,*,*,\1,a,a/g' > user_dic.csv.utf8
nkf -e user_dic.csv.utf8 | grep -v '^,' > user_dic.csv

文字コードの変換時にEUC-JPに変換できない文字があったのでそれは除外しています。
これで取り込ませる辞書の作成は完了です。

次は、jarファイルに含めるためにGitHubからソースを落としてきます。
/kuromoji/kuromoji-ipadic の下に「ref」ディレクトリを作ってそこに上記で作成したユーザ辞書を置きます。

/kuromoji/kuromoji-ipadic/pom.xml に追記します。
profiles > profile > build > plugins > plugin > executions > execution > configuration > target > untar の下に以下の通り追記します。

<copy todir="${kuromoji.dict.dir}">
	<fileset dir="${project.basedir}/ref" includes="*.csv" />
</copy>

こうすることで、このあと作成される辞書の中にユーザ辞書を含めることができます。対象を全てのcsvに指定しているのでcsvを置いておけば複数の辞書を取り込んでくれます。ジャンルごととかにすると管理しやすいかもですね。
最後にjarファイルを作成するためにMavenを実行します。
/kuromoji/kuromoji-ipadic/pom.xml を右クリックし実行→実行の構成から新規作成しゴール「install」で実行します。このとき、ヒープが足りないとエラーが起きるのでヒープサイズを指定します。メモリ4GBのPCでは「-Xmx3000m」で実行可能になりました。(キリが悪い…)
終了すると「/kuromoji/kuromoji-ipadic/target/kuromoji-ipadic-0.9.0.jar」が作成されているはずなのでこれをビルドパスに追加すればユーザ辞書を含んだkuromojiを利用することができます。
ちなみにkuromojiの0.9.0では本体と辞書機能が分離したようです。なので本体を別途取り込む必要があります。

<dependency>
	<groupId>com.atilika.kuromoji</groupId>
	<artifactId>kuromoji-core</artifactId>
	<version>0.9.0</version>
</dependency>

最新版はこちらから確認してください。
あと、0.9.0にすると0.7とは書き方が変わります。
0.7

Tokenizer tokenizer = Tokenizer.builder().build();
for (Token token : tokenizer.tokenize("寿司が食べたい。")) {
	System.out.println(token.getSurfaceForm() + "\t" + token.getAllFeatures());
}

0.9.0

Tokenizer tokenizer = new Tokenizer();
for (Token token : tokenizer.tokenize("寿司が食べたい。")) {
	System.out.println(token.getSurface() + "\t" + token.getAllFeatures());
}

Tokenizerの生成方法とgetSurfaceForm()がgetSurface()に変わったみたいです。他にも相違点がありそうです。