エラー内容
PyKNPからJuman++を使って日本語文を形態素分解しようとしたらこんなエラーが...!
ValueError: invalid literal for int() with base 10: 'input'
(PythonからJuman, Juman++を使う方法は省略)
File "/$HOME/.pyenv/versions/anaconda3-2019.03/lib/python3.6/site-packages/pyknp/
juman/morpheme.py", line 143, in _parse_spec
self.hinsi_id = int(parts[4])
ValueError: invalid literal for int() with base 10: 'input'
エラーの原因候補
とりあえずエラーメッセージを元に調べてみると
半角スペースとか、半角文字が悪さをしてしまう模様。
入力テキストの修正
ということで半角文字を全部全角文字に置き換えます。
しかし
半角文字を全部全角文字、修正しても同じエラーが出続けた。
どうやら上記記事の状況とは原因が違うらしい。
原因判明
関係ないけどpdbって便利よね
そこでpdbで実行し、エラー時の変数parts
の中身をチェックしてみた最初からそうしろ。
(Pdb) parts
['InvalidParameter:', 'byte', 'size', 'of', 'input', 'string', '(4302)', 'is', 'greater', 'than│(base)
', 'maximum', 'allowed', '(4096)']
(エラー発生時に本来は解析結果が入るリストにエラー内容が入る仕様だったとは...)
どうも入力文字列のサイズ(バイト数)が大きすぎたそうです。
入力文字列の限界は合計4096バイトみたいなのでそれ以下の容量に制限した方が良さそう。
とりあえず解決法
BERTに流すデータセットを作る過程だったんですが、長すぎる文はパス!
UTF-8は文字種によってバイト数が違うっぽいのでカットするのめんどくさい
4096バイトより大きい文は次のような条件で検出して何らかの回避策をしましょう。
(分割するなりパスするなり)
これは文字列text
のバイト数を調べて比較しています。
if len(text.encode('utf-8')) > 4096:
文字列の文字数長ではなくバイト数を調べる方法はこちら
まとめ
PyKNPからJuman++を使う時にエラーが発生する原因は、以上で紹介した記事と合わせると
でした。