AWSのComprehendで5,000bytes制限に困った話
今回はAWSのComprehendの5000bytes制限に困った話です。
文字数減らしたはずなのに、制限引っかかるぞという人は是非読んでください。
エラー内容
AWSのComprehendを利用して感情分析をしようとした際に、下記のようなエラーが出ました。
[ERROR] TextSizeLimitExceededException: An error occurred (TextSizeLimitExceededException) when calling the DetectSentiment operation: Input text size exceeds limit. Max length of request text allowed is 5000 bytes while in this request the text size is 5018 bytes
ふむふむ。感情分析に用いる文章は5,000 bytesまでなのに5,018 bytesになってるで、というお話ですね。ここまではすぐ理解できました。問題はここから。
対応したこととその後起きた問題
日本語は1文字が2byteなので、textを
text = text[:2500]
のように修正した後、Comprehendにかけてみました。スライスすることで、文字数を2,500以下にしたということです。
ですが、また同様エラーが起きました。
ここでのポイントは、「日本語は1文字が2byte」ということにとらわれすぎていたことです。確かに文字量は2,500文字以下になりましたが、改行コードや空白を考えると5,000 bytesには収まっていませんでした。
適切な対応方法
スライスでは同様のエラーが起こるので別の対応方法を考えなくてはいけません。もちろん、文字数を2,000までと極端に制限する方法もありますが、感情分析のため極限文字数は減らしたくありません。
適切なのは、「エンコード → 5,000 bytesに制限 → デコード」という対応です。
つまり、textという変数に対して
ebcoded_text = text.encode('utf-8')
sliced_text = ebcoded_text[:5000]
decoded_text = sliced_text.decode('utf-8')
とすることで、確実に5,000 bytesまでにおさめるようにするということです。
この対応方法で正しく動くようになりました。
Github上にサンプルプログラムも上げているので、そちらも併せてご参照ください。
Discussion