思いつくままに経緯を記す
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フォルダを配置
- ビルドはできるが動かない
- UniDic公式から最新の「unidic-cwj-202302_full.zip」をDLしてビルドしてみた
-
OSDN IPAdic legacy
- 比較対照としてipadic-2.7.0.tar.gzをDLしてきてビルドしてみた
lucene-cli.exe analysis kuromoji-build-dictionary ipadic <input dir> <output dir>
- IPAdicの場合ビルドできるしちゃんと動作した
- 比較対照としてipadic-2.7.0.tar.gzをDLしてきてビルドしてみた
-
Apache LuceneのKuromojiのUniDicビルド対応パッチについて
- いろいろググってる(死語)うちにたどり着く。多謝
- こちらの情報を参考に、forkしたlucenenetリポジトリに対してほぼ同じコード修正を行った
- lucene-cli.exeをビルドし、生成された*.defファイル一式をkuromoji-dataフォルダへコピーして動作させてみたが動かない
なお、xUnitのテストケースにおけるエラーは次のようなもの。
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してビルドしてみたがやはり動作しなかった
-
Lucene Kuromoji のコードを読む会 (辞書ビルダー編)
- なおこちらのスライドも非常に参考になった。多謝その2
- Kuromojiの実装もさることながら、そもそもIPAdicもUniDicもエントリの意味がわからなかったのでこのスライドに書かれていることを手掛かりにデータの具体例を引きながら確認した
ちなみにこれを書きながらUniDicのデータをUTF-8からEUC-JPへ変換してからビルドしたりもしてみたが、何も変わらなかった……。
なかなか一筋縄ではいかないですね~は~、短単位でTokenizeしてぇなぁ~。