@johtaniの日記 2nd

@johtani ‘s blog 2nd edition

Apache LuceneのKuromojiのUniDicビルド対応パッチについて

これは、情報検索・検索エンジン Advent Calendar 2019 の 4 日目の記事です。

1日目から、質の高いエントリーが続いていましたが、一旦休憩して頂く感じの記事になってます。気軽に読んでくださいw。Advent Calendarつくらないの?と煽ったのもあり、穴を埋めようかなと。 

発端

「Lucene 版 #Kuromoji のコードを読む会(辞書ビルダー編)」という勉強会があり、参加したところ、UniDicの辞書のビルドがコケるという話を聞いたんで、ちょっとやってみるかと。

ちなみに、Kuromojiとは、Apache Luceneに入っている、日本語向けの形態素解析ライブラリです。IPAdicの辞書を内包しており、SolrやElasticsearchといった、Apache Luceneを利用している検索エンジンで手軽に使える形態素解析ライブラリになっています。が、対応している辞書がデフォルトだとIPAdicなのです。

問題点

LUCENE-4056というIssueが上がっています。

build.xmlには記載はないけど、辞書のビルダーは対応していそうな雰囲気を醸し出しているので、試してみたというのが発端?かと。で、実際に動かしてみると動かない点がありましたと。

また、Issueの会話で出ていたUniDicの辞書のライセンスの話もありました。 ただ、UniDicがライセンスを変更したので、このあたりはクリアできそうかなと。

パッチ

ということで、動かしてみていくつか修正してパッチを作りました。

https://github.com/apache/lucene-solr/pull/935

最近のLuceneはGitHubでプルリク遅れるのが便利ですね。 そんなに大したことはやってないです。以下の点が問題だったので直しています。

  • IPAdicとUniDicで語彙定義ファイルのCSVの形式(カラムの数)が異なる
  • unk.defのカラム数も異なる

あとは、辞書のダウンロードの部分やbuild.xmlでの処理を追加した形です。 このプルリクを適用したlucene-solrのソースディレクトリを持ってきて、手元でjarをビルドすれば普通はIPAdicの辞書を内包したkuromojiのjarファイルが出来上がります。

lucene/analysis/kuromoji/build.xmlファイルを、このGistにあるように変更して、ant build-dictとやれば辞書のビルドが可能です。 また、cd lucene/;ant jarとすれば、UniDicの辞書を内包したjarファイルもビルドできます(lucene/build/analysis/kuromojiの下にjarファイルができあがります)。

確認?

一応、パッチは動くのですが、パッチ自体はUniDicの辞書をビルドする仕組みはオフのままです。なので、テストをどうやろう?というところでやなんで止まっています。。。

ただ、実際に作ったパッチできちんとIPAdicとUniDicがそれぞれビルドできているかの確認はしないとなと。

ということで、2つのjarファイルを読み込んで、それぞれトークナイズして、その出力を表示するツールを作ってみました

上記パッチを適用したlucene-solrのソースを持ってきて、IPAdicの辞書を内包したkuromojiのjarファイルと、UniDicの辞書を内包したjarファイルを用意し、ツールの支持に従って、ファイルをディレクトリに配置して、実行すれば以下のような出力がされるようになっています(とりあえず作ったものなので、Javaファイルにトークナイズしたいテキストを書かないといけないのですが)。

たとえば、「自転車と自動車の違いはなんでしょう?」という文字列を入力すると、以下のような出力になりました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+++ ipadic ++++++++++++++
token[0] is [自転車]
token[1] is [と]
token[2] is [自動車]
token[3] is [の]
token[4] is [違い]
token[5] is [は]
token[6] is [なん]
token[7] is [でしょ]
token[8] is [う]
+++ unidic ++++++++++++++
token[0] is [自転]
token[1] is [車]
token[2] is [と]
token[3] is [自動]
token[4] is [車]
token[5] is [の]
token[6] is [違い]
token[7] is [は]
token[8] is [なん]
token[9] is [でしょう]

UniDicは[短単位]で語彙が扱われるため、「自転車」や「自動車」がそれぞれ「自転」「車」、「自動」「車」という形でトークナイズされていることがわかります。

どちらがより便利なのか?というのは用途によっても変わってくるかと思いますが、検索の転置インデックスとしては、より短い単語で区切られている方が、より多くの文書にヒットする可能性が高くなるので、便利な可能性が高いです。

まとめ

ということで、パッチを作ってみたものの、まだ取り込まれていない状況です。 着地点をどうするかって話かなと思っています。興味があれば遊んでみていただければと。

将来的には、辞書をjarから切り離して別のディレクトリやjarとして使えるようにしようというIssueも作られています。こちらがすすめば、UniDicだけでなく、その他の辞書を切り替えながら使えるようになる日が来るのではないでしょうか?

Comments