Amazon Comprehend で(言語検出)と(感情分析)を試してみる
機械学習を使用して構造化されていないデータから情報を見つける自然言語処理 (NLP) サービスです。
言語、人物、場所などデータの中の重要な要素を特定できます。
言語検出
文章がどの言語で書かれているのかを判定します。
2021.07.08現在、AmazonDocumentによれば、言語の種類は104種類で、日本語もサポートされています。
感情分析
文章の内容から、自動的かつ正確に、リアルタイムにどのような感情を持っているのかを推測します。
ポジティブ(肯定的)、ネガティブ(否定的)、ニュートラル(中立的)ミックス(混合)の4種類で判定します。
顧客が得ることができる体験の質を向上させるために、より多くの情報を、リアルタイムで届けることができるようになります。
2021.07.08現在、日本語にも対応している。
キーフレーズ抽出
文章の中から、「重要な言い回し」を抽出し、何を話題としているのかを大まかに提示します。(裏付けとなる信頼性スコアを返します)
2021.07.08現在、日本語にも対応している。
エンティティ認識
文章から、人名、地名、社名といった固有名詞や日付などの情報を抽出します。
2021.07.09現在、日本語にも対応している。
構文解析
文章の構文を解析します。
トークン分割や品詞 (PoS) を使用してテキストを分析したり、テキスト内の名詞や形容詞などの単語境界やラベルを識別したりできます。
2021.07.09現在、日本語には対応していない。
Amazon Comprehend の料金
100文字を1ユニットとして、1回の処理を最低3ユニット(300文字)分の料金がかかります。
ユニットあたりの料金
機能 | 10 M ユニットまで | 10 M~50 M ユニット | 50 M ユニット超 |
キーフレーズ抽出 | 0.0001USD | 0.00005USD | 0.000025USD |
感情分析 | 0.0001USD | 0.00005USD | 0.000025USD |
エンティティ認識 | 0.0001USD | 0.00005USD | 0.000025USD |
言語検出 | 0.0001USD | 0.00005USD | 0.000025USD |
イベントタイプごとのイベント検出 | 0.003USD | 0.0015USD | 0.00075USD |
構文解析 | 0.00005USD | 0.000025USD | 0.0000125USD |
機能 | 10 M ユニットまで | 10 M~50 M ユニット | 50M~100 M ユニット | 100 M ユニット超 |
PII 検出 | 0.0001USD | 0.00005USD | 0.000025USD | 0.000005USD |
Contains PII | 0.000002USD | 0.000001USD | 0.0000005USD | 0.0000001USD |
カスタムコンプリヘンド
非同期分類とエンティティ認識
ユニットあたり0.0005USD
同期分類とエンティティ認識
IU あたり 0.0005 USD/秒
モデルトレーニングは 1 時間あたり 3 USD
モデル管理は毎月?0.50USD
トピックモデリング
ジョブあたり 1.00USD?(均一料金)
最初の 100 MB
MB あたり?0.004USD
無料利用枠
50,000 ユニットのテキスト (500 万文字) 初回のリクエストから 12 か月間
9 つの API (キーフレーズ抽出、感情分析、エンティティ認識、言語検出、Detect PII、Contains PII、イベントの検出、
構文解析、カスタムエンティティ、カスタム分類) ごとの 1 か月あたりの使用量です。
※ カスタム分類およびカスタムエンティティの場合、モデルトレーニング、モデル管理、および、エンドポイントでの
無料利用枠はありません。
APIリファレンス
boto3 boto3.client関数
機能 デフォルトのセッションを使用して、低レベルのサービスクライアントを作成する
構文 boto3.client(クライアント名)
戻り値 サービスクライアントのオブジェクト
Comprehend detect_dominant_languageメソッド (言語検出)
機能 入力テキストの主要言語を決定します。
構文
{
"Text": "string"
}
戻り値
{
"Languages": [
{
"LanguageCode": "string",
"Score": number
}
]
}
構文説明
リクエストは以下のデータを JSON 形式で受け入れます。
[Text]
UTF-8 テキスト文字列。各文字列には、少なくとも 20 文字を含める必要があります。
また、UTF-8 でエンコードされた文字を 5,000 バイト未満にする必要があります。
タイプ: 文字列
長さの制約: 最小長= 1
指定は必須
戻り値説明
アクションが成功すると、サービスは HTTP 200 レスポンスを返します。
サービスから以下のデータが JSON 形式で返されます。
[Languages]
入力テキストで Amazon Comprehend が検出した言語。各言語について、
応答は RFC 5646 言語コードと、Amazon Comprehend が推論の精度に持つ信頼度を返します。日本語ja OK!
タイプ: DominantLanguageobjects配列インデックス作成
エラー内容
[InternalServerException]
内部サーバーエラーが発生しました。リクエストを再実行します。
HTTP ステータスコード: 500
[InvalidRequestException]
要求は無効です。
HTTP ステータスコード: 400
[TextSizeLimitExceedException]
入力テキストのサイズが制限を超えています。小さなドキュメントを使用する。
HTTP ステータスコード: 400
Comprehend detect_sentimentメソッド (感情分析)
機能 テキストを検査し、一般的な感情(POSITIVE、NEUTRAL、MIXED、またはNEGATIVE)の推論を返します。
構文
{
"Text": "string"
}
戻り値
{
"Sentiment": "string",
"SentimentScore": {
"Mixed": number,
"Negative": number,
"Neutral": number,
"Positive": number
}
}
構文説明
リクエストは以下のデータを JSON 形式で受け入れます。
[LanguageCode]
入力ドキュメントの言語。Amazon Comprehend でサポートされる主要言語のいずれかを指定できます。
すべてのドキュメントは同じ言語である必要があります。
タイプ: 文字列
有効な値: en | es | fr | de | it | pt | ar | hi | ja | ko | zh | zh-TW 日本語ja OK!
指定は必須
[Text]
UTF-8 テキスト文字列。各文字列には、UTF-8 エンコード文字で 5,000 バイト未満です。
タイプ: 文字列
長さの制約: 最小長= 1
指定は必須
戻り値説明
アクションが成功すると、サービスは HTTP200レスポンスを返します。
サービスから以下のデータが JSON 形式で返されます。
[Sentiment]
Amazon Comprehendが最高レベルの信頼度を持つ推定センチメント。
タイプ: 文字列
有効な値: POSITIVE | NEGATIVE | NEUTRAL | MIXED
[SentimentScore]
感情とそれに対応する信頼水準をリストするオブジェクト。
タイプ: SentimentScore オブジェクト
エラー内容
[InternalServerException]
内部サーバーエラーが発生しました。リクエストを再実行します。
HTTP ステータスコード: 500
[InvalidRequestException]
要求は無効です。
HTTP ステータスコード: 400
[TextSizeLimitExceedException]
入力テキストのサイズが制限を超えています。小さなドキュメントを使用する。
HTTP ステータスコード: 400
[UnsupportedLanguageException]
Amazon Comprehend は入力テキストの言語を処理できません。
ユーザー定義エンティティ認識 API の場合、英語、スペイン語、フランス語、イタリア語、ドイツ語、またはポルトガル語のみが
受け入れられます。
HTTP ステータスコード: 400
①文章の言語を検出するプログラム detect_dominant_language.py
import boto3
import json
comprehend = boto3.client('comprehend', 'ap-northeast-1')
text = "文章がどの言語で書かれているのかを判定します。言語の種類は104種類で、日本語もサポートされています。"
result = comprehend.detect_dominant_language(Text=text)
print(json.dumps(result, indent=4))
PS C:\Users\mikol\comprehend> python detect_dominant_language.py
{
"Languages": [
{
"LanguageCode": "ja", (日本語であることを検出できた)
"Score": 1.0
}
],
"ResponseMetadata": {
"RequestId": "2e49b16a-a252-4d33-9e4a-d6b665b4518c",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "2e49b16a-a252-4d33-9e4a-d6b665b4518c",
"content-type": "application/x-amz-json-1.1",
"content-length": "49",
"date": "Thu, 08 Jul 2021 09:08:10 GMT"
},
"RetryAttempts": 0
}
}
②文書の感情を分析するプログラム detect_sentiment.py
import boto3
import json
comprehend = boto3.client('comprehend', 'ap-northeast-1')
text = "彼こそが真の長距離打者だと感じます。また、大谷選手は素晴らしいピッチャーです。¥
大リーグの常識を変えた唯一無二の存在です。今後もファンの方々や少年たちの夢を背負い、シーズンを乗り切って欲しいと思います。"
result = comprehend.detect_sentiment(Text=text, LanguageCode='ja')
print(json.dumps(result, indent=4))
PS C:\Users\mikol\comprehend> python detect_sentiment.py
{
"Sentiment": "POSITIVE",
"SentimentScore": {
"Positive": 0.9919137954711914, (ポジティブな文章と分析。99%!!)
"Negative": 0.00012447306653484702, (ネガティブ文書ではない)
"Neutral": 0.007162350229918957, (中立的文書ではない)
"Mixed": 0.0007993989274837077 (混合の文書ではない)
},
"ResponseMetadata": {
"RequestId": "9654e52e-b462-48a4-828f-437550885866",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "9654e52e-b462-48a4-828f-437550885866",
"content-type": "application/x-amz-json-1.1",
"content-length": "166",
"date": "Thu, 08 Jul 2021 09:28:07 GMT"
},
"RetryAttempts": 0
}
}
補足 detect_dominant_languageメソッド 言語検出の対応言語表
Code | Language |
af | アフリカーンス語 |
am | アムハラ語 |
ar | アラビア語 |
as | アッサム語 |
az | アゼルバイジャン語 |
ba | バシキール |
be | ベラルーシ語 |
bn | ベンガル語 |
bs | ボスニア語 |
bg | ブルガリア語 |
ca | カタロニア語 |
ceb | セブアーノ |
cs | チェコ語 |
cv | チュヴァシュ |
cy | ウェールズ語 |
da | デンマーク語 |
de | ドイツ語 |
el | ギリシャ語 |
en | 英語 |
eo | エスペラント |
et | エストニア語 |
eu | バスク自治州 |
fa | ペルシャ語 |
fi | フィンランド語 |
fr | フランス語 |
gd | スコットランド・ゲール語 |
ga | アイルランド語 |
gl | ガリシア語 |
gu | グジャラート語 |
ht | ハイチ語 |
he | ヘブライ語 |
ha | ハウサ語 |
hi | ヒンディー語 |
hr | クロアチア語 |
hu | ハンガリー語 |
hy | アルメニア語 |
ilo | イロコ |
id | インドネシア語 |
is | アイスランド語 |
it | イタリア語 |
jv | ジャワ語 |
ja | 日本語 |
kn | カンナダ |
ka | グルジア語 |
kk | カザフ語 |
km | 中央クメール |
ky | キルギス |
ko | 韓国語 |
ku | クルド人 |
lo | ラオス |
la | ラテン語 |
lv | ラトビア語 |
lt | リトアニア語 |
lb | ルクセンブルク語 |
ml | マラヤーラム語 |
mt | マルタ |
mr | マラーティー語 |
mk | マケドニア語 |
mg | マダガスカル |
mn | モンゴル語 |
ms | マレー語 |
my | ビルマ語 |
ne | ネパール語 |
new | ネワリ |
nl | オランダ語 |
no | ノルウェー語 |
or | 折谷 |
om | オロモ |
pa | パンジャブ語 |
pl | ポーランド語 |
pt | ポルトガル語 |
ps | プシュト |
qu | ケチュア州 |
ro | ルーマニア語 |
ru | ロシア語 |
sa | サンスクリット |
si | シンハラ |
sk | スロバキア語 |
sl | スロベニア語 |
sd | シンドー |
so | ソマリ語 |
es | スペイン語 |
sq | アルバニア語 |
sr | セルビア語 |
su | スンダ語 |
sw | スワヒリ語 |
sv | スウェーデン語 |
ta | タミル語 |
tt | タタール |
te | テルグ語 |
tg | タジク |
tl | タガログ語 |
th | タイ語 |
tk | トルクメン語 |
tr | トルコ語 |
ug | ウイグル |
uk | ウクライナ語 |
ur | ウルドゥー語 |
uz | ウズベク語 |
vi | ベトナム語 |
yi | イディッシュ語 |
yo | ヨルバ |
zh | 簡体字中国語 |
zh-TW | 繁体字中国語 |