あなたが持っている Amazon シンプル ストレージ サービス (Amazon S3)多くの言語で、受信した顧客のチャット、製品レビュー、ソーシャルメディアフィードを含むファイルでいっぱいのバケット。 あなたの仕事は、人々が話している製品を特定し、彼らが幸せな考えを表現しているか悲しい考えを表現しているかを判断し、コメントを単一の共通言語に翻訳し、この新しい情報を追加してビジネスアナリスト向けのデータのコピーを作成することです。各レコード。 さらに、名前、住所、クレジットカード番号などの個人情報(PII)を削除する必要があります。
あなたはすでに使い方を知っています アマゾンアテナ 単純なSQLコマンドとAthenaの組み込み関数を使用して、AmazonS3でデータを変換します。 これで、Athenaを使用してテキストフィールドを翻訳および分析することもできます。 Amazon翻訳, Amazon Comprehend、およびAthenaユーザー定義関数(UDF)の能力。
Athenaは、SQLを使用してAmazonS3に保存されているデータを簡単に分析できるインタラクティブなクエリサービスです。 Amazon Comprehendは、テキストから洞察を簡単に発見できる自然言語処理(NLP)サービスです。 Amazon Translateは、高速、高品質、手頃な価格、カスタマイズ可能な言語翻訳を提供するニューラル機械翻訳サービスです。 この投稿では、これらを一緒に使用して次のアクションを実行する方法を示します。
- テキストフィールドの主要言語を検出する
- 表現された一般的な感情(ポジティブ、ネガティブ、どちらでもない、または両方)を検出します
- エンティティ(アイテム、場所、数量など)を検出または編集します
- PIIを検出または編集する
- ある言語から別の言語にテキストを翻訳する
この投稿は、次の目標を達成します。
- 自分のAWSアカウントでテキスト分析機能をすばやく設定する方法を示します(すばやく簡単です!)
- 関数がどのように機能するかを簡単に説明します
- パフォーマンスとコストについて話し合う
- Amazon製品レビューでテキスト分析を行うチュートリアルを提供します
- 利用可能なすべての機能を説明する
投稿の最後に、利用可能なすべての機能のリストが含まれています。 次のコードは、クエリと結果の例をいくつか示しています。
テキスト分析UDFをインストールします
AthenaUDFは AWSラムダ 機能機能を実装します。 詳細についてはこの投稿の後半で説明しますが、テキスト分析UDFを使用するために内部の仕組みを理解する必要はないので、始めましょう。
次の手順で、ビルド済みのLambda関数をインストールします。
- に移動します TextAnalyticsUDFHandler のアプリケーション AWSサーバーレスアプリケーションリポジトリ.
- の中に アプリケーションの設定 セクションでは、設定をデフォルトのままにします。
- 選択 このアプリがカスタムIAMロールを作成することを認めます.
- 選択する 配備します.
以上です! これで、という新しいLambda関数ができました textanalytics-udf
。 Athenaでテキスト分析クエリを試す準備ができました。
代わりにソースコードからビルドしてデプロイする場合は、最後にある手順を参照してください。 GitHubリポジトリのREADME.
最初のテキスト分析クエリを実行します
あなたがアテナに不慣れであるならば、あなたはレビューしたいかもしれません スタートガイド ガイド。
この記事の執筆時点では、AthenaUDF機能はまだプレビュー中です。 これを有効にするには、という名前のAthenaワークグループを作成します AmazonAthenaPreviewFunctionality
そのワークグループからすべてのUDFクエリを実行します。
次のクエリをSQLエディタに入力します。
あなたは簡単になります POSITIVE
結果。 ここで、入力テキストを変更して再試行します。あまり肯定的でないものを試して、返される感情値がどのように変化するかを確認してください。
潜在的な感情値ごとの信頼スコアとともに感情を取得するには、代わりに次のクエリを使用します。
これで、感情とすべての感情スコアを含むJSON文字列が得られます。
あなたが使用することができます 組み込みのJSON抽出関数 この結果についてアテナでフィールドを抽出し、さらに分析します。
UDFのしくみ
Athena UDFフレームワークの詳細については、を参照してください。 ユーザー定義関数を使用したクエリ.
Javaクラス TextAnalyticsUDFHandler UDFLambda関数ハンドラーを実装します。 各テキスト分析関数には、このクラスに対応するパブリックメソッドがあります。
Athenaは、入力レコードのバッチを使用してUDFLambda関数を呼び出します。 ザ・ TextAnalyticsUDFHandler
これらのバッチを最大25行の小さなバッチに分割して、Amazon Comprehend同期マルチドキュメントバッチAPIを利用できる場合(言語、エンティティ、感情の検出など)を利用します。 利用可能な同期マルチドキュメントAPIがない場合( DetectPiiEntity
& TranslateText
)、代わりに単一ドキュメントAPIを使用します。
Amazon Comprehend API サービスクォータ 意図しない高使用によるコストエクスポージャーを制限するためのガードレールを提供します(これについては次のセクションで詳しく説明します)。 デフォルトでは、マルチドキュメントバッチAPIは250秒あたり最大20レコードを処理し、シングルドキュメントAPIはXNUMX秒あたり最大XNUMXレコードを処理します。 UDFは指数バックオフを使用し、リクエストレートを調整してこれらの制限内にとどまるように再試行します。 を使用して、APIのXNUMX秒あたりのトランザクション数の割り当ての増加をリクエストできます。 クォータリクエストテンプレート AWSマネジメントコンソール.
AmazonComprehendとAmazonTranslateは、それぞれ5,000utf-8バイトの最大入力文字列長を強制します。 5,000 utf-8バイトより長いテキストフィールドは、言語と感情の検出のために5,000バイトに切り捨てられ、翻訳とエンティティまたはPIIの検出と編集のために、文の境界で5,000バイト未満の複数のテキストブロックに分割されます。 次に、結果が結合されます。
コストの最適化
Athenaクエリのコストに加えて、テキスト分析UDFには、Lambda、Amazon Comprehend、AmazonTranslateからの使用コストが発生します。 支払う金額は、UDFで処理するレコードと文字の総数の要因です。 詳細については、を参照してください。 AWSLambdaの価格, Amazonは価格を理解します, Amazon翻訳の価格.
コストを最小限に抑えるために、同じレコードを複数回処理することは避けることをお勧めします。 代わりに、CREATE TABLE AS SELECT(CTAS)クエリを使用してテキスト分析UDFの結果を具体化し、結果を別のテーブルにキャプチャして、追加のUDF料金を発生させることなく必要な頻度でコスト効率よくクエリを実行できます。 INSERT IGNORE INTO…SELECTクエリを使用して、新しく到着したレコードを段階的に処理し、新しいレコードのみを分析して強化し、それらをターゲットテーブルに追加します。
後で破棄するレコードに対して、テキスト分析関数を不必要に呼び出すことは避けてください。 最初に一時テーブル、ビュー、またはネストされたクエリを使用してデータセットをフィルタリングするクエリを記述し、次に、結果のフィルタリングされたレコードにテキスト分析関数を適用します。
さまざまなレコード数のテーブルでテキスト分析クエリを実行する前に、常に潜在的なコストを評価してください。
このセクションでは、XNUMXつのコスト評価の例を示します。
例1:ツイートの言語と感情を分析する
10,000件のツイートレコードがあり、ツイートあたりの平均長が100文字であると仮定します。 SQLクエリは、各ツイートの主要な言語と感情を検出します。 あなたはサービスのXNUMX年目です(無料利用枠はもう適用されません)。 費用の詳細は次のとおりです。
- 各ツイートのサイズ= 100文字
- レコードあたりのユニット数(100文字)(最小は3ユニット)= 3
- 合計ユニット数:10,000(レコード)x 3(レコードあたりのユニット数)x 2(Amazon Comprehendリクエスト/レコード)= 60,000
- ユニットあたりの価格= $ 0.0001
- AmazonComprehendの総コスト= [ユニット数] x [ユニットあたりのコスト] = 60,000 x $ 0.0001 = $ 6.00
例2:ツイートを翻訳する
2,000件のツイートがローカル言語ではないと仮定して、XNUMX番目のSQLクエリを実行してそれらを翻訳するとします。 費用の詳細は次のとおりです。
- 各ツイートのサイズ= 100文字
- 合計文字数:2,000(レコード)* 100(レコードあたりの文字数)x 1(レコードあたりのリクエストの翻訳)= 200,000
- 0.000015文字あたりの価格= $ XNUMX
- Amazon翻訳の総費用= [文字数] x [文字あたりの費用] = 200,000 x $ 0.000015 = $ 3.00
カスタマーレビューからの洞察を分析する
新しいテキスト分析クエリを使用するときが来ました。
カスタマーレビューから実用的な洞察を得るチュートリアルについては、を参照してください。 チュートリアル:AmazonComprehendを使用したカスタマーレビューからの洞察の分析。 この投稿では、同じ課題に対する代替アプローチを提供します。AthenaとAmazonComprehendを利用したSQLクエリを使用することです。
チュートリアルの完了には約10分かかり、AmazonComprehendの費用は最大$ 6です。無料利用枠の資格がある場合は費用はかかりません。
Athenaで新しいデータベースを作成します
Athenaクエリエディタで次のクエリを実行します。
データソースを接続するときは、新しいデータベースを選択してください。
カスタマーレビューデータを含むソーステーブルを作成します
私たちは、使用 Amazonカスタマーレビューデータセット、AmazonS3でパブリックアクセス用に便利にホストされています。
- Athenaクエリエディタで次のクエリを実行します。
- テーブル類、新しいテーブルamazon_reviews_parquetを見つけます。
- オプションメニューから、 パーティションをロードします.
- 新しいテーブルをプレビューし、
amazon_reviews_parquet
.
- 次のクエリを実行して、平均レビュー期間を評価します。
レビューの平均の長さは約365文字です。 これは、レコードごとに4つのAmazon Comprehendユニットに相当します(1ユニット= 100文字)。
各レビューの言語を検出する
各レビューの言語を検出するには、Athenaクエリエディターで次のクエリを実行します。実行には1分強かかり、費用は2ドルです。
このクエリは、新しいテーブルを作成します。 amazon_reviews_with_language
、XNUMXつの新しい列が追加されました: language
。 LIMIT句は、レコード数を5,000に制限します。
コストは次のように計算されます:5,000(レコード)x 4(レコードあたりのユニット)x 1(レコードあたりのリクエスト)x $ 0.0001(ユニットあたりのAmazon Comprehend価格)= $ 2。
次のクエリを実行して、検出された言語コードと、各言語に対応するレビューの数を確認します。
レビューごとに感情とエンティティを検出する
感情を検出するには、Athenaクエリエディターで次のクエリを実行します。1つのテキスト分析機能を使用し、実行に約4分かかり、費用はXNUMXドルです。
このクエリは、新しいテーブルを作成します。 amazon_reviews_with_text_analysis
、XNUMXつの列が追加されています: sentiment
& entities
。 WHERE句は、結果セットをAmazonComprehendの感情とエンティティの検出でサポートされている言語のリストに制限します。
コストは次のように計算されます:5,000(レコード)x 4(レコードあたりのユニット)x 2(レコードあたりのリクエスト)x $ 0.0001(ユニットあたりのAmazon Comprehend価格)= $ 4。
新しいテーブルをプレビューし、新しいテーブルの値の一部を調べます sentiment
& entities
列。 それらには、ネストされた構造とフィールドを持つJSON文字列が含まれています。
次のスクリーンショットは、 sentiment
列の詳細。
次のスクリーンショットは、エンティティ列の詳細を示しています。
次に、AthenaのJSON関数を使用して、分析用にこれらの列を準備します。
分析のために感情を準備する
次のSQLクエリを実行して、感情と感情スコアを別々の列に展開した新しいテーブルを作成します。
新しいプレビュー sentiment_results_final
テーブル(次のスクリーンショットを参照)。 感情は一般的にテキストと一致していますか review_body
フィールド? それはどのように相関しますか star_rating
? 疑わしい感情の割り当てを見つけた場合は、信頼スコアをチェックして、感情が低い信頼度で割り当てられているかどうかを確認します。
分析のためにエンティティを準備する
次のSQLクエリを実行して、検出されたエンティティを含む新しいテーブルを作成します。このテーブルには、ネストされていない個別の行(内部サブクエリ)が含まれ、各フィールドは個別の列(外部クエリ)にあります。
新しいテーブルの内容をプレビューし、 entities_results_final
(次のスクリーンショットを参照).
Amazon QuickSightで視覚化(オプション)
オプションの手順として、結果を視覚化できます アマゾンクイックサイト。 手順については、 ステップ5:AmazonQuickSightでAmazonComprehendの出力を視覚化する.
ツリーマップの代わりに、エンティティに新しいワードクラウドビジュアルタイプを使用できます。 ワードクラウドチャートメニューで、 「その他」のカテゴリを非表示.
これで、次のスクリーンショットのような感情とエンティティの視覚化を備えたダッシュボードができました。
トラブルシューティング
クエリが失敗した場合は、 アマゾンクラウドウォッチ UDFLambda関数によって生成されたメトリックとログ。
- Lambdaコンソールで、
textanalytics-udf
機能。 - 選択する 監視.
関数が実行された頻度、実行時間、失敗した頻度などを示すCloudWatchメトリックスを表示できます。
- 選択する CloudWatchでログを表示する 追加のトラブルシューティングの洞察を得るために機能ログストリームを開きます。
Lambdaを介したCloudWatchメトリックスの表示の詳細については、を参照してください。 Lambdaコンソールの使用.
追加のユースケース
SQLテキスト分析関数には多くのユースケースがあります。 この投稿に示されている例に加えて、次のことを考慮してください。
- インクリメンタルSQLクエリを使用してETLパイプラインを簡素化し、テキストデータを感情やエンティティで強化します(ソーシャルメディアストリームのストリーミングなど)。 Amazon Kinesis データ ファイアホース
- SQLクエリを使用して、カスタマーサポートテキスト、電子メール、およびサポートケースの感情とエンティティを調査します
- 顧客または患者の相互作用からPIIを編集して、研究に対応したデータセットを準備します
- 多くの言語を単一の共通言語に標準化する
これらの機能の追加の使用例や、次のような追加機能を追加したい場合があります。
- AmazonComprehendでカスタムエンティティ認識およびカスタム分類モデルを呼び出すSQL関数
- 匿名化のためのSQL関数-エンティティとPII編集関数を拡張して、エンティティを代替の一意の識別子に置き換えます
さらに、実装はオープンソースです。つまり、リポジトリのクローンを作成し、必要に応じて関数を変更および拡張し、(願わくば)プルリクエストを送信して、改善点をプロジェクトにマージし、より良いものにすることができます。全員。
清掃
このチュートリアルを完了したら、使用しなくなったAWSリソースをクリーンアップすることをお勧めします。 アクティブなAWSリソースでは、引き続きアカウントに料金が発生する可能性があります。
- Athenaで、次のクエリを実行して、データベースとすべてのテーブルを削除します。
- AWS CloudFormationで、スタックを削除します
serverlessrepo-TextAnalyticsUDFHandler
. - QuickSightサブスクリプションをキャンセルします.
まとめ
Athena用のサンプルテキスト分析UDFLambda関数をインストールする方法を示しました。これにより、単純なSQLクエリを使用してAmazon Translateを使用してテキストを翻訳し、Amazon Comprehendを使用してテキストからインサイトを生成し、機密情報を編集できます。 これがお役に立てば幸いです。また、これを使用してアーキテクチャを簡素化し、ビジネスに新しい機能を実装する方法の例を共有してください。
コメントセクションまたはプロジェクトの問題セクションで私たちとあなたの考えを共有してください GitHubリポジトリ.
付録:利用可能な関数リファレンス
このセクションでは、現在提供されている機能を要約します。 ザ・ README ファイルは追加の詳細を提供します。
言語を検出します
この関数はAmazonComprehendを使用します バッチ検出主言語 入力テキストの最初の5,000バイトに基づいて主要言語を識別するAPI。
次のコードは、フランス語の場合はfr、英語の場合はenなどの言語コードを返します。
次のコードは、JSON形式の言語コードの配列と対応する信頼スコアを返します。
感情を検出する
この関数はAmazonComprehendを使用します バッチ検出センチメント 入力テキストの最初の5,000バイトに基づいて感情を識別するAPI。
次のコードは、感情をPOSITIVE、NEGATIVE、NEUTRAL、またはMIXEDとして返します。
次のコードは、各感情値に対して検出された感情と信頼スコアを含むJSON形式のオブジェクトを返します。
エンティティを検出する
この関数はAmazonComprehendを使用します エンティティの検出 PIIを識別するためのAPI。 5,000バイトを超える入力テキストは、複数のAmazon ComprehendAPI呼び出しになります。
次のコードは、次の配列を含むJSON形式のオブジェクトを返します。 エンティティタイプ および値:
次のコードは、PIIエンティティタイプの配列とその値、スコア、および文字オフセットを含むJSON形式のオブジェクトを返します。
エンティティを編集する
この関数は、指定されたエンティティタイプのエンティティ値を「[ENTITY_TYPE]
」。 5,000バイトを超える入力テキストは、複数のAmazon ComprehendAPI呼び出しになります。 次のコードを参照してください。
このコマンドは、入力文字列の編集されたバージョンを返します。 XNUMXつ以上を指定します エンティティタイプ 有効なカンマ区切りのリストを提供して編集する types
タイプ文字列パラメータ、または ALL
すべてのタイプを編集します。
PIIを検出する
この関数は、 PiiEntities の検出 PIIを識別するためのAPI。 5,000バイトを超える入力テキストは、複数のAmazon ComprehendAPI呼び出しになります。
次のコードは、次の配列を含むJSON形式のオブジェクトを返します。 PIIエンティティタイプ および値:
次のコードは、スコアと文字オフセットを含むPIIエンティティタイプの配列を含むJSON形式のオブジェクトを返します。
PIIを編集する
この関数は、指定されたPIIエンティティタイプのPII値を「[PII_ENTITY_TYPE]
」。 5,000バイトを超える入力テキストは、複数のAmazon ComprehendAPI呼び出しになります。 次のコードを参照してください。
この関数は、入力文字列で編集されたバージョンを返します。 XNUMXつ以上を指定します PIIエンティティタイプ で有効なタイプのコンマ区切りリストを提供することによって編集する type
文字列パラメータ、または ALL
すべてのタイプを編集します。
テキストを翻訳する
この関数は、テキストをソース言語からターゲット言語に変換します。 5,000バイトを超える入力テキストは、複数のAmazon TranslateAPI呼び出しになります。 次のコードを参照してください。
この関数は、翻訳された文字列を返します。 オプションで、ソース言語を自動検出し(Amazon Comprehendを使用する言語コードとしてautoを使用)、オプションで カスタム用語 (それ以外の場合は使用 NULL
for customTerminologyName
).
著者について
ボブ・ストラハン AWS Language AIServicesチームのプリンシパルソリューションアーキテクトです。