👋

Unidic等はpipでどう管理するか?

2024/03/28に公開

結論

私は、読み仮名しか取らないから、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