kuromojiとユーザ辞書
Javaで形態素解析を行うライブラリに「kuromoji」があります。そのままでもかなり使えるんですが、辞書が割りと貧弱です。例えば「欧州中央銀行」だと
欧州 中央 銀行
となります。
一般的な単語でも分割されてしまいます。検索では良いかもしれませんが一つの単語として扱いたい場合は困ります。
そこでユーザ辞書を設定することでこの問題を解決できます。
まず、ユーザ辞書ですがフォーマットはcsv形式のようです。こちらを参考にさせていただきました。ありがとうございます。
ユーザ辞書のデータは手で作っても良いんですが、サクッと大量に単語を登録するのは結構骨が折れます。今回はWikipediaの見出しデータを使ってユーザ辞書を設定します。
手順はLinux を前提とします。
wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz gunzip jawiki-latest-all-titles-in-ns0.gz
ここでいくつか除外します。
除外対象は以下とします。
- 記号
- 先頭が数字
- ひらがな2文字
- ~「の一覧」
- ~「曖昧さ回避」
- 文字長1の単語
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,\1,a,wiki/g' > user_dic.csv
あとは、こちらにあるようにBuilderに読み込ませます。
Builder builder = Tokenizer.builder(); builder.userDictionary("user_dic.csv"); Tokenizer tokenizer = builder.build();
すると「欧州中央銀行」は
欧州中央銀行
となります。
ユーザ辞書にはこのように登録されています。
フォーマットは以下の通りです。
単語,単語の分割,ヨミ,品詞(?)
ただし、ユーザ辞書の容量が大きいためTokenizerの生成に時間がかかります。