🙃

AWSのComprehendで5,000bytes制限に困った話

2022/08/08に公開

今回は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を

sample.py
text = text[:2500]

のように修正した後、Comprehendにかけてみました。スライスすることで、文字数を2,500以下にしたということです。

ですが、また同様エラーが起きました。

ここでのポイントは、「日本語は1文字が2byte」ということにとらわれすぎていたことです。確かに文字量は2,500文字以下になりましたが、改行コードや空白を考えると5,000 bytesには収まっていませんでした。

適切な対応方法

スライスでは同様のエラーが起こるので別の対応方法を考えなくてはいけません。もちろん、文字数を2,000までと極端に制限する方法もありますが、感情分析のため極限文字数は減らしたくありません。

適切なのは、「エンコード → 5,000 bytesに制限 → デコード」という対応です。

つまり、textという変数に対して

sample.py
ebcoded_text = text.encode('utf-8')
sliced_text = ebcoded_text[:5000]
decoded_text = sliced_text.decode('utf-8')

とすることで、確実に5,000 bytesまでにおさめるようにするということです。

この対応方法で正しく動くようになりました。

Github上にサンプルプログラムも上げているので、そちらも併せてご参照ください。

https://github.com/krap730/AWS/blob/main/cmprehend.py

Discussion