ユーザー辞書を使うときに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)
フォルダ構成:
- 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をダウンロードして、自環境で問題なくユーザー辞書が使えることを確認できました。
今後ともよろしくお願いします。