Hatena::ブログ(Diary)

エメラルドアオキロック

2011-05-25

lucene-gosenの辞書編集方法

lucene-gosenとは

lucene-gosen?とは、全文検索エンジンのLucene/Solr3.1及び4.0で動作する、日本語の形態素解析用のJavaライブラリで、ここで公開されています。なお、ここで扱うlucene-gosen?のバージョンは1.0.1とします。

一般的に日本語を扱う場合には、英語のように空白で文章を単語に区切れない為、n文字ずつ格納するN-GramのCJKAnalyzer(Bi-Gram)や、形態素解析を用いるJapaneseAnalyzer(lucene-gosenに含まれる)を主に用います。それぞれメリットとデメリットがあって、N-Gramは検索もれが少ない分ノイズが多く、形態素解析を用いるとノイズは少なくなるが検索もれが多くなるという特徴があります。どちらも一長一短なので、日本語を扱う場合二つのAnalyzerを併用したりします。(例として、形態素解析を用いた検索でヒットしたものをN-Gramでヒットしたものより下に表示するように、などを行います。)これでもノイズが多くなることは避けられないのですが、ユーザの望むものが先に見つかりやすく、なおかつ検索漏れを防ぐことが出来ます。

でも、出来れば検索漏れとして後ろの方で表示されるのではなく、流行語や造語など(辞書に無い単語)も上に来るようにしたい!という時に、形態素解析用の辞書の編集を行います。そこで辞書のカスタマイズが必要となるのですが、lucene-gosenの辞書の編集を行うためには
 1.辞書の編集
 2.辞書のコンパイル
 3.jarにパッケージ

の作業が必要となります。

lucene-gosenで使える辞書にはIPAdicとNAIST-jdicがありますが、ここでは後発でIPAdicのライセンスの問題を解決したNAIST-jdicを使う事とします。

辞書の編集

辞書の編集の前にまず、この作業にはantとJDKが必要となりますので、必要に応じてインストールを行って下さい。環境が揃ったらここからソースコードをcheckoutします。Windowsな方はEclipseやCygwinを使ってSVNからcheckoutして下さい。
また、より詳細なビルド方法はjohtaniさんのページにあります。

辞書はcheckoutした中には含まれていないため、antを用いてDLします。
コマンドプロンプト(ターミナル)で<lucene-gosenディレクトリ>/dictionaryに移動して、

>ant -Ddictype=naist-chasen

とすればダウンロードが始まります。
(-Ddictype=naist-chasenを省略すればipadicになります)
インターネット経由でダウンロードするので、proxyの設定が必要な場合は下記のようにproxy設定を追加して下さい。(以下同様)

>ant -Ddictype=naist-chasen -Dproxy.host=proxy.hoge.com -Dproxy.port=9999

完了すればnaist-chasenディレクトリが出来てその中にdictionary.csvというファイルがあり、これが辞書のファイルとなります。このファイルに新たに解析したい単語を追加すれば良いのですが、なにぶん50MB近くありますし、ちょくちょく編集するのには向いていません。なので、単純な追加の場合は別ファイルで管理する事をオススメします。ファイル名は何でもいいですが、ここではbeer.csvというファイル名で進めます。dictionary.csvと同じディレクトリに作ります。また、文字コードはUTF-8なのでWindowsな人は気をつけて下さい。

f:id:shinobu_aoki:20110526002505p:image

辞書の各項目については「辞書への単語の追加」も参考にして下さい。大抵は名詞の追加となると思いますので、この例と同じように追加できると思います。重要なのは見出し語とコストと品詞です。まずはdictionary.csvから似たような単語を探しましょう。今回は「スーパードライ」を参考にしました。

"スーパードライ",3999,名詞,一般,*,*,*,*,"スーパードライ","スーパードライ","スーパードライ"

「スーパードライ」がなぜ固有名詞でないのかはさておき、これをコピーしてbeer.csvに貼り付けます。品詞はそのまま使えるので、見出し語と原形と発音を修正します。最後にコストですが、これは低いほど出現しづらい値となります。通常は似た単語と同じにしておけばいいらしいのですが、例えば「エビス」と「シルクエビス」が同一のコストだと、「シルクエビス」は「シルク」と「エビス」に分解されてしまいます。それを調整する為に、長い単語はコストを下げるといいようです。

という事で、追加辞書はこんな感じにしました。

f:id:shinobu_aoki:20110526002506p:image

さて、編集が終わればもう一度antでビルドします。最初のビルドで既に辞書がコンパイルされているので、先にそれらを削除します。

>ant -Ddictype=naist-chasen clean-sen

次に新しく作成した辞書ファイルを指定して、辞書のコンパイルを行います。

>ant -Ddictype=naist-chasen -Dcustom.dics=beer.csv

なお、複数辞書を作成した場合は次のようにスペース区切りで指定します。

>ant -Ddictype=naist-chasen -Dcustom.dics="beer1.csv beer2.csv"

辞書のサイズや環境によりますが、ビルドには1分程度かかると思います。
最後にlucene-gosenとして利用出来るようにjarファイルにします。checkoutしたディレクトリ直下に移動してビルドを行います。

>ant -Ddictype=naist-chasen

これで登録した単語を思う存分使えるようになりました。

動作確認

さて、早速動作確認してみましょう。サンプルの文は「ホップ畑の香りは発泡酒です。」とし、確認環境にはSolrの機能を使って確認する事にします。まずは新しいのを試す前に、辞書追加前の解析結果を見てみます。

f:id:shinobu_aoki:20110526002507p:image

・・・とっても残念な分かち書きですね。・・・特にハッポーザケのあたりが・・・orz
さて、気を取り直して、新しいので試してみます。

f:id:shinobu_aoki:20110526002508p:image

うまくいきましたね(発泡酒以外)

lucene-gosenを使う時の参考となれば幸いです。

matakatsumatakatsu 2011/05/28 02:04 いやぁ〜さっぱり解らんわぁ(笑)でも楽しませてもらうわぁ♪

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/shinobu_aoki/20110525/1306342970