Unidic等はpipでどう管理するか?
結論
私は、読み仮名しか取らないから、unidic_liteで十分。(少し古いけど)unidicはpipで入れない。
TTSの解析なので、より高い精度が必要でunidicが必要なら、unidicを直接ダウンロードして(https://clrd.ninjal.ac.jp/unidic/) 引数で渡そう。
mecab = MeCab.Tagger("-d D:/models/dictionary/unidic-csj-202302/ -r D:/models/dictionary/unidic-csj-202302/mecabrc")
理由
数年後にすっかり忘れてて、
unidicとunidic_liteを切り替えてたら、pipでアンインストールできないのが原因で、Mecabの謎のエラーでハマる。(AttributeError)
さらに、unidic_liteのプログラムは、unidicに入れ変わってても、エラーが出ず最後まで動いている風なので、問題の発見が遅れる。
unidic_liteの方を使うモジュールが多い
私の環境だと、TTS を始め、unidic_liteが必要なモジュールが多い。
phonemyze.py - text2kata
parts = line.split(",")
word, yomi = parts[0].split("\t")[0], parts[9]
liteからのコードは、カンマをタブに、インデックスを1から9に変えるだけでいいけど
unidic_liteのプログラムはunidicでもエラーは出ない。
具体的には、unidic_liteは、タブ区切りでCSV2ついるけど、
unidicは、基本カンマ区切りだけど、最初だけタブで2つに区切れる。
そのため、indexエラーにならず、プログラムが最後まで動いている風になる。
例えば、conquiのTTSとか、ある日突然、日本語をしゃべらず、唸り声になってしまったりする。
unidicはpipだけで済まない。
インストール
pip install unidic
python -m download
アンインストール(辞書が残るので手動で消す)
pip install unidic
rm -rf {unidicのフォルダー}
忘れたことろに、pipだけでアンインストールした気になって、以下のようなエラーで悩むことになる。(ちなみに、Mecabがunidicフォルダーが残っているので、unidicはあると見なされて、でも、dicdirを出力するスクリプトがないのでエラーになる。)
AttributeError: module 'unidic' has no attribute 'DICDIR'
その他 マイFAQ?
-Oyomiとかは使えない理由
マクロみたいな機能なのです。pipでインストールしただけでは、使えない。
これは、普通だとCSVが出てくるのを、定義分でフォーマットする機能
unidicとunidic_liteのmecabrc(pipインストール後は空)に、以下のように書くとどっちのコードが来ても大丈夫
; yomi
node-format-yomi = %pS%f[7]
unk-format-yomi = %M
eos-format-yomi = \n
Mecabがunidic_liteかどうか調べる?
try_import_unidicで辞書のパスがわかるので、それで判断
def is_unidic_lite():
path = MeCab.try_import_unidic()
return path.find("unidic_lite")!=-1
unidicの環境でunidic_liteを使いたい
結論とは逆なことになるが、unidic_liteのモジュールの場所から取れる。
それを引数でMecabを起動すると良い。
def get_unidic_lite_arg():
import unidic_lite
path = unidic_lite.__path__[0]
path = path.replace("\\","/")
return f"-r {path}/dicdir/mecabrc -d {path}/dicdir"
unidicとunidic_liteの違いは?
最初、フォーマットが同じで、収録単語数の違いだと思っていたが、どうも違うみたいだ。
CSVのデーター項目の違いのようだ。フォーマットも違う。日本語の解析をせず、読みしか必要ないならliteで問題ない。
ただ、発話辞書とか、ほんの少しだが、TTSの精度が上がるので使ってみるのもいい。
Discussion