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.0001USD0.00005USD0.000025USD
感情分析0.0001USD0.00005USD0.000025USD
エンティティ認識0.0001USD0.00005USD0.000025USD
言語検出0.0001USD0.00005USD0.000025USD
イベントタイプごとのイベント検出0.003USD0.0015USD0.00075USD
構文解析0.00005USD0.000025USD0.0000125USD
ユニットあたりの料金(1)
機能10 M ユニットまで10 M~50 M ユニット50M~100 M ユニット100 M ユニット超
PII 検出0.0001USD0.00005USD0.000025USD0.000005USD
Contains PII0.000002USD0.000001USD0.0000005USD0.0000001USD
ユニットあたりの料金(2)

カスタムコンプリヘンド

 非同期分類とエンティティ認識
    ユニットあたり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メソッド 言語検出の対応言語表

CodeLanguage
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繁体字中国語