komutan/NMeCab

ユーザー辞書を使うときにincompatible dictionaryエラー

Closed this issue · 4 comments

@komutan さん

お世話になります。

下記のコードでユーザー辞書user.dicを呼び出そうとすると、

            var mecabPath = Path.Combine(executionContext.FunctionAppDirectory, "Function", "ExtractContent", "MecabDic");
            using (var tagger = MeCabTagger.Create(mecabPath, new string[] { "user.dic" }))

LibNMeCab: incompatible dictionary. というエラーが発生します。

ソリューション: .Net Core 3.1 Azure Function
Nugetバージョン:LibNMeCab 0.10.0 Sunday, September 6, 2020 (9/6/2020)
フォルダ構成:

image

  • user.dicを外せば動けます。
  • user.dicはmecab-dict-indexで、-f -t utf-8, UTF-8, utf8など、色んな組み合わせでコンバインしてみたが、NGでした。
  • sys.dicはneologd辞書を使っています。
  • 上記の辞書一式をPyhthon Azure Functionでそのまま使う場合は問題なくできています。

辞書のコンバインではなく、NMecab自体の問題の可能性はございませんか?

同じ辞書と、ほぼ同じコードで、下記のNugetを使っていけました。
https://github.com/kekyo/MeCab.DotNet

なので、高い確率でご作成のライブラリーに何らかの問題があると思われます。
お時間ある時に確認頂ければ幸いです。

@yuanweilei
ご報告ありがとうございます。

まだちゃんと確認できていませんが、ほぼ間違いなく仰る通りで、NMeCab 0.10.0 の問題です。私が NMeCab 0.7.0 からデグレードさせてしまったようです。(報告いただいた MeCab.DotNet にも0.7.0のソースコードが使われています)

  • neologd辞書のバイナリ内には文字コード名が"utf8"と書き込まれていますが、多くのシステムで使用される文字コード名は"utf-8"です。
  • 作成されたユーザー辞書も、様々試して頂いたものの、恐らくは"utf-8"とバイナリ内に書き込まれています。
  • 0.10.0では、システム辞書とユーザー辞書とが同じ文字コードで無ければ incompatible dictionary エラーになるようにしました。これは実行パフォーマンスを向上させる改修の必要上です。(オリジナルのMeCabでも同じようにエラーになると思います)
  • “utf8”と”utf-8”という文字コード名を、0.10.0では正直にそのまま比較して不一致としているため、今回の問題が起きたと考えられます。

近日中に修正版をリリースしますので、お待ち頂けたら幸いです。

@yuanweilei さん
v0.10.1をリリースしました。これで解決したはずと思いますが、@yuanweilei さんの環境で確認して頂ければ幸いです。

@komutan さん
早速のご確認と対応ありがとうございます。
v0.10.1をダウンロードして、自環境で問題なくユーザー辞書が使えることを確認できました。

今後ともよろしくお願いします。