Help us understand the problem. What is going on with this article?

PyKNPでJUMAN++を使ったらValueErrorが出た

エラー内容

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++を使う時にエラーが発生する原因は、以上で紹介した記事と合わせると

でした。

tomoharr24
プログラミング初心者な大学院生です。 主な使用言語はPythonです。 趣味的な記事しかまだないですが、いずれは自然言語処理分野のことも書けたらなと。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away