0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【覚書】Lucene.NETのKuromojiでUniDic辞書を使うのは無理そう

Posted at

思いつくままに経緯を記す

Lucene.NETのKuromojiを使って形態素解析を行い応用的なことをやっていたのだが、使用している辞書がIPAdicであることに気づき、比較した結果UniDicが用途的にも良さそうということで切り替えてみようとした。

  • Lucene.Net Namespace Lucene.Net.Analysis.Ja.Dict
    • マニュアルに lucene-cli.exe analysis kuromoji-build-dictionary unidic によってUniDic辞書をKuromoji用にビルドすれば良いという記述あり
  • UniDic
    • UniDic公式から最新の「unidic-cwj-202302_full.zip」をDLしてビルドしてみた
      • lucene-cli.exe analysis kuromoji-build-dictionary unidic <input dir> <output dir> -e UTF-8
    • kuromoji-dataフォルダ内に*.datファイル一式をコピーして動作確認
      • まだCLIも無いクラスライブラリだったためxUnitによるテストケースフォルダにkuromoji-dataフォルダを配置
    • ビルドはできるが動かない
  • OSDN IPAdic legacy
    • 比較対照としてipadic-2.7.0.tar.gzをDLしてきてビルドしてみた
      • lucene-cli.exe analysis kuromoji-build-dictionary ipadic <input dir> <output dir>
    • IPAdicの場合ビルドできるしちゃんと動作した
  • Apache LuceneのKuromojiのUniDicビルド対応パッチについて
    • いろいろググってる(死語)うちにたどり着く。多謝
    • こちらの情報を参考に、forkしたlucenenetリポジトリに対してほぼ同じコード修正を行った
    • lucene-cli.exeをビルドし、生成された*.defファイル一式をkuromoji-dataフォルダへコピーして動作させてみたが動かない

なお、xUnitのテストケースにおけるエラーは次のようなもの。

image.png

IncrementTokneメソッド実行時にSystem.IndexOutOfRangeExceptionが投げられるが一体これがどこからのものなのか不明。

ちなみに、IPAdicとUniDicのcsvファイルを比較してみると、IPAdicはWordCostが負の値になることは無いようだったが、UniDicの場合負の値を取るようだ。
これが原因かと思いコードを追ってみたがどうもよくわからない。Kuromojiの内部でdefファイル生成・読み込み時にByteBufferを使っているが、WordCostはshortまたはInt16で読み書きされているので負の値でも良さそうだ。
ということはKuromojiの形態素解析ロジック部分がすでにUniDicに対応できていない可能性がある。

SudachiはUniDicをベースにした辞書を使っているということなので、SudachiをC#で非公式実装して使うという方法もあるかもしれない。思いつきだが、まあやってやれないこともないか……。

  • Solr9のkuromojiでUniDic2.1.2を使う
    • なお、JAVA版のLuceneのKuromojiではUniDicのビルドも可能らしい。しかしこの記事で用いられているUniDic2.1.2はすでにUniDic公式が配布をやめてしまったようで、入手できなかった
    • 仕方ないので最も古い2.2.0をDLしてビルドしてみたがやはり動作しなかった

image.png

  • Lucene Kuromoji のコードを読む会 (辞書ビルダー編)
    • なおこちらのスライドも非常に参考になった。多謝その2
    • Kuromojiの実装もさることながら、そもそもIPAdicもUniDicもエントリの意味がわからなかったのでこのスライドに書かれていることを手掛かりにデータの具体例を引きながら確認した

ちなみにこれを書きながらUniDicのデータをUTF-8からEUC-JPへ変換してからビルドしたりもしてみたが、何も変わらなかった……。

なかなか一筋縄ではいかないですね~は~、短単位でTokenizeしてぇなぁ~。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?