ユーザー定義辞書を使って文章を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を使って実施している作業になります。
もし、解決策があれば教えて頂ければと思います。よろしくお願いします。
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
なるほど、特に問題なさそうですね。
MeCabで作成した場合もunidic-liteを使いましたか。
Jupyter以外に以上のコードを実行するとなにかエラーメッセージは出ますか?エラー情報なしでは少し対応しづらいです。
なるほど、ipadicでも使えるということはおそらくフィールドに違いがあると思われます。
fugashiはnode.feature
を作るために、CSVをパースして、各フィールドの情報を使ってnamedtuple
を作ります。単語別にフィールドの数に違いがあればエラーになります。それが原因であれば、Tagger
をGenericTagger
に変更すると問題なく動作するはずです。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]
のように取得できます。
それでもうまくいかなかったら教えてください。
返事がないので一旦クローズしますが、もしまだ解決していないのであれば教えてください。