LoginSignup
10
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-23

エラー内容

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

でした。

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4