辞書の外部化とLucene/Solr3.4対応(Jugemより移植)

Posted by johtani on Wednesday, October 26, 2011

目次

すぐやりますと言いつつ、はや1ヶ月。。。 腰が重い、ダメエンジニアですね。。。

すみませんでした。。。 ようやくtrunkにコミットしました。 すぐにリリース版を用意すると思います。

1ヶ月もあいてしまったので、追加した機能に関するまとめと、 用途別の利用方法を記載しておきます。 (lucene-gosenのWikiにもそろそろ書かないとなぁ。日本語でもいいから。)

追加した機能


これまでのlucene-gosenはjarに辞書を含む形でライブラリを提供していました。 ただ、この場合、カスタム辞書を利用している環境ではカスタム辞書を修正し、ビルドしなおすたびに、 jarファイルを作成しなければなりません。 また、jarファイルをSolrなどに配布する必要も出てきます。 この手間を考慮して、辞書を外部ディレクトリで指定することができるようにしたものが 今回の修正になります。 また、修正の過程で同一VM内で異なる辞書を使えるようにする機能も副産物として生まれました。 今回追加した機能は次のようなものになります。
  • 辞書を含まないjarのビルドおよび提供
  • ディレクトリ指定による辞書の指定
  • 同一VM内での複数辞書の利用
  • 辞書リビルド用のAntターゲットの追加
  • Lucene/Solr jarファイルの最新化(3.4.0対応)

ディレクトリ指定による辞書の指定ですが、以下のような形になります。 まずは、LuceneのTokenizerでの指定方法です。 「辞書のディレクトリ」という引数が追加になっています。 ここに、辞書ディレクトリ(*.senファイルが存在するディレクトリ)を相対/絶対パスで指定します。


...
Tokenizer tokenizer = new JapaneseTokenizer(reader, null, "辞書のディレクトリ");
...

つぎは、Solrでの設定の方法です。 schema.xmlにて次のような設定を行います。


...
<fieldType name="text_ja" ...>
  <analyzer>
    ...
    <tokenizer class="solr.JapaneseTokenizerFactory" compositePOS="compositePOS.txt" dictionaryDir="辞書のディレクトリ"/&gt;
    ...
  </analyzer>
</fieldType>
...  

schema.xmlの設定については、example/schema.xml.snippetにも説明がありますので、こちらもあわせて参考に。 なお、Solrの設定については、先ほどのLuceneでの辞書のディレクトリの指定方法(絶対/相対パス)に加えて、 $SOLR_HOME/conf からの相対パスでの指定も可能になっています。

Antのターゲットについて


辞書なしjarファイルを作成するターゲットなどを追加しています。 実際に追加したターゲットは以下のとおりです。
ターゲット名 説明
nodic-jar 辞書なしのjarファイルを生成するためのターゲット。辞書のダウンロード、コンパイルは行いません。
rebuild-dic lucene-gosenのビルド済み辞書(.senファイル)を削除してから辞書のコンパイル(ビルド)を行います。-Ddictypeにより辞書のタイプ(ipadic|naist-chasen)の指定が必要です。また、-Dcustom.dicsによりカスタム辞書の指定もあわせて可能です。
build-dic-ipadic テスト用に追加。-Ddictype=ipadicを指定してbuild-dicを実行。
build-dic-naist-chasen ついでに追加。-Ddictype=naist-chasenを指定してbuild-dicを実行。

最後の2つはあまり関係ありません。内部的に有ると便利だったため、作りました。 重要なのは最初の2つです。 ひとつめの「nodic-jar」は辞書を含まないjarファイルをビルドします。 このjarファイル+辞書の入ったディレクトリを利用することで、辞書の外部化が可能となります。

そして、「rebuild-dic」です。こちらは、以前記事に書きましたが、カスタム辞書のコンパイルが思いの外面倒だったので、ターゲットを追加しました。 次のように指定することで、辞書のリビルドが可能です。


$ ant -Ddictype=naist-chasen -Dcustom.dcs="custom1.csv custom2.csv" rebuild-dic

提供されるjarファイルについて


提供されるjarファイルは次のようになる予定です。 1番目のjarファイルが今回追加になる、辞書なしのjarファイルになります。

  • lucene-gosen-1.x.x.jar
  • lucene-gosen-1.x.x-ipadic.jar
  • lucene-gosen-1.x.x-naist-chasen.jar

用途別の利用方法


利用用途別に利用するjarファイルやantのターゲットを利用シーンを交えて想定を書いてみます。 Solrでの利用シーンを想定します。

**お手軽に使う。辞書ありjarファイルで一発インストール。** これまでどおりの使い方になります。 辞書込みのjarファイルを利用すれば、すぐに利用可能になります。

**カスタム辞書を使い倒す。定期的に辞書をメンテナンス。** 定期的にシステム固有の単語が増える(例:製品名、新語など)場合です。

  • 利用するjar:lucene-gosen-1.x.x.jar
  • 辞書のコンパイル+配置:ant -Ddictype=naist-chasen -Dcustom.dics="custom1.csv” rebuild-dir
  • Solrの該当コアのRELOAD

Solrのマルチコア環境を利用します。なお、sharedLib設定にlucene-gosen-1.x.x.jarを配置すると、辞書の再読み込みができないので注意してください。 設定は、上記のようにTokenizerFactoryの設定でdictionaryDirにて辞書のディレクトリを設定しておきます。 カスタム辞書に単語を追加後、antにて、辞書のリビルドを行います。 リビルドした辞書ファイルを必要に応じて対象の辞書ディレクトリにコピーします。(ビルド後のディレクトリをそのまま利用している場合はコピーの必要はないです。) 最後に、Solrの該当コアのリロードを行います。(リロードの仕方はこちらを参考に。) コアのリロードにより、辞書の再読み込みが行われるので、リロード後から新しい辞書が適用されます。

異なる辞書を使い倒す。TokenizerごとにdictionaryDir設定するぞ 1つのSolrで異なる辞書を使ったフィールドを使いたい場合です。 ipadicとnaist-chasenといった異なる場合はあまり想定できないですが、カスタム辞書の部分が異なるという形が想定できるでしょうか。(例:製品名のフィールド、企業名のフィールド。。。など)

  • 利用するjar:lucene-gosen-1.x.x.jar
  • 設定:schema.xmlに異なるdictionaryDirを設定したTokenizerFactoryを設定

上記、カスタム辞書の定期更新も一緒に行うことも可能です。コアをリロードすれば、リロードしたコアで利用している 辞書がすべてリロードされます。

最後に


遅くなってしまいましたが、ようやく、trunkにコミットしました。 できるだけ速く、リリースしますので、もう少々お待ちを。

Solrのconfディレクトリからの指定については、@shinobu_aokiさんにパッチを提供してもらいました。 また、trunkにコミットしていないパッチを適用して記事を書いてくれた方もいらっしゃいました。こちらもあわせて参考に。私より説明が上手です。 Java製形態素解析ライブラリ「lucene-gosen」を試してみる


comments powered by Disqus