polm/fugashi

ユーザー定義辞書を使って文章をparseしようとするとカーネルがDeadになる。

s0nzvv opened this issue · 6 comments

今、fugashi-build-dictを使ってユーザー定義辞書を作りました。その辞書を使ってtagger を以下の通り作り、

from fugashi import Tagger
import unidic_lite

tagger = Tagger(r"-u /path to usrdic /user.dic")

以下の通りコードを実行するとカーネルがDeadになってしまいます。ここで、「薬価改定」を仮にユーザー辞書に登録しています。

text = "薬価改定は、麩を主材料とした日本の菓子。"
tagger.parse(text)
for word in tagger(text):
    print(word, word.feature.lemma, word.pos, sep='\t')
    # "feature" is the Unidic feature data as a named tuple

ちなみにユーザー辞書ではなくunidic_liteを使ったときに、こちらのコードを実行するとうまくいきます。

text = "麩菓子は、麩を主材料とした日本の菓子。"
tagger.parse(text)
for word in tagger(text):
    print(word, word.feature.lemma, word.pos, sep='\t')

上記は会社のRstudio SeverからJupyterNotebookを使って実施している作業になります。
もし、解決策があれば教えて頂ければと思います。よろしくお願いします。

polm commented

Kernelが落ちるということはなんらかのエラーが起きていることが原因ですね。ユーザ辞書関係だと、ユーザ辞書の作成で別のシステム辞書が使われたか、もしくはシステム辞書とフィールドが異なるためfugashi内のパースが失敗しています。Exceptionにならないことを考えると前者の可能性が高いと思います。

ユーザ辞書のデータはどんな形式ですか。どのように辞書を作成していますか。

Jupyter以外からスクリプトを実行するとなにか参考になる出力があるかもしれません。

ご回答ありがとうございます。辞書は以下の通り作成してます。ちなみにMecabではユーザー辞書を同様に作って同じ環境で使えてました。

fugashi-build-dict -d path/unidic_lite/dicdir -u user.dic Noun_u.csv -f utf-8 -t utf-8

polm commented

なるほど、特に問題なさそうですね。

MeCabで作成した場合もunidic-liteを使いましたか。

Jupyter以外に以上のコードを実行するとなにかエラーメッセージは出ますか?エラー情報なしでは少し対応しづらいです。

Mecabの際は、ipadicを使ってました。

Jupyter以外でということでしたので、pyファイルにして、terminalから実行すると、以下のpopupが出るだけですね。
image

polm commented

なるほど、ipadicでも使えるということはおそらくフィールドに違いがあると思われます。

fugashiはnode.featureを作るために、CSVをパースして、各フィールドの情報を使ってnamedtupleを作ります。単語別にフィールドの数に違いがあればエラーになります。それが原因であれば、TaggerGenericTaggerに変更すると問題なく動作するはずです。GenericTaggerを変更すると辞書のパスを指定する必要がありますので以下のようなコードになります。

import fugashi
import unidic_lite

tagger = fugashi.GenericTagger(f"-d {unidic_lite.DICDIR} -u path/to/user.dic")

GenericTaggerを使うとfeatureの情報はfeature.lemmaのように名前で取得することができなくなりますが、代わりにfeature[0]のように取得できます。

それでもうまくいかなかったら教えてください。

polm commented

返事がないので一旦クローズしますが、もしまだ解決していないのであれば教えてください。