Amazon Web Services ブログ

Amazon Comprehend を使用してカスタム分類子を構築する

Amazon Comprehend は、機械学習 (ML) を使用してテキストの洞察と関係を見つける自然言語処理 (NLP) サービスです。Amazon Comprehend はテキストの言語を識別し、キーフレーズ、場所、人、ブランド、またはイベントを抽出し、テキストがどれほどポジティブかネガティブかを理解します。Amazon Comprehend でできることの詳細については、「Amazon Comprehend の機能」を参照してください。

研究段階をリードすることなく、ニーズに合わせてすぐに使用できる NLP 機能が必要になる場合があります。それがあれば、ビジネスに固有のドキュメント分類を実行できます。たとえば、エンティティタイプを認識し、業界固有の用語を認識したり、顧客のフィードバックをさまざまなカテゴリに分類したりできます。

Amazon Comprehend は、このようなユースケースに最適です。2018 年 11 月、Amazon Comprehend は、カスタムエンティティを認識してカスタム分類を実行するようにトレーニングする機能を追加しました。詳細については、「AWS で独自の自然言語モデルを構築する (ML の経験は不要)」を参照してください。

この記事では、特定のラベルを特定のテキストに割り当てることができるカスタムテキスト分類子を作成する方法を説明します。ML の予備知識は必要ありません。

このブログ記事について
完了するまでの時間 縮小されたデータセットの場合は 1 時間。完全なデータセットの場合は 2 時間
完了するためのコスト 縮小されたデータセットの場合は 50 USD。完全なデータセットの場合は 150 USD
これには、トレーニング、推論、モデル管理の料金が含まれます。詳細については、Amazon Comprehend の料金表をご覧ください。
学習レベル 高度 (300)
AWS のサービス Amazon Comprehend
Amazon S3
AWS Cloud9

前提条件

このチュートリアルを完了するには、AWS アカウントと、そのアカウント内で AWS IAMAmazon S3、Amazon Comprehend、および AWS Cloud9 のリソースを作成するためのアクセス許可が必要です。

この記事では、Xiang Zhang と Yann LeCun 著の論文 『Text Understanding from Scratch』で引用された Yahoo の回答コーパスを使用しています。このデータセットは、AWS Open Data Registry で利用できます。

独自のデータセットを使用することもできます。ラベルごとに最大 1,000 個のトレーニングドキュメントでモデルをトレーニングし、ラベルを選択するときに、明確で意味が重複しないラベルを提案することがお勧めです。詳細については、「カスタム分類子のトレーニング」を参照してください。

ソリューションの概要

このチュートリアルには、次の手順が含まれます。

  1. 環境の準備
  2. S3 バケットの作成
  3. IAM のセットアップ
  4. データの準備
  5. カスタム分類子のトレーニング
  6. 結果の収集

ドキュメントから人や組織の名前、場所、時間表現、数値などの情報を抽出するカスタムエンティティレコグナイザーの構築方法の詳細については、「Amazon Comprehend を使用してカスタムエンティティレコグナイザーを構築する」を参照してください。

環境の準備

この記事では、可能な限り AWS CLI を使用して、実験を高速化します。

AWS Cloud9 はクラウドベースの統合開発環境(IDE)で、ブラウザを使用してコードを作成、実行、およびデバッグできます。これには、コードエディタ、デバッガー、ターミナルが含まれています。AWS Cloud9 には、一般的なプログラミング言語に不可欠なツールと AWS CLI がプリインストールされているため、このワークショップでファイルをインストールしたりノートパソコンを設定したりする必要はありません。

AWS Cloud9 環境は、AWS Management Console にログインしたユーザーと同じ AWS リソースにアクセスできます。

環境を準備するには、次の手順を実行します。

  1. コンソールの Services で、[AWS Cloud9] を選択します。
  2. [Create environment] を選択します。
  3. Name には、CustomClassifier を入力します。
  4. [Next step] を選択します。
  5. Environment settings で、インスタンスタイプを t2.large に変更します。
  6. 他の設定はデフォルトのままにします。
  7. [Next step] を選択します。
  8. 環境設定を確認し、[Create environment] を選択します。

環境のプロビジョニングと準備が完了するまで数分かかる場合があります。環境の準備が整うと、IDE のウェルカム画面が開き、ターミナルプロンプトが表示されます。

このプロンプトで、ローカルコンピューターと同じように AWS CLI コマンドを実行できます。

  1. ユーザーがログインしていることを確認するには、次のコマンドを入力します。
Admin:~/environment $ aws sts get-caller-identity

アカウントとユーザー情報を示す次の出力が表示されます。

{
    "Account": "123456789012",
    "UserId": "AKIAI53HQ7LSLEXAMPLE",
    "Arn": "arn:aws:iam::123456789012:user/Colin"
}
  1. 次の手順で使用するアカウント ID を記録します。

このチュートリアルでは、AWS Cloud9 IDE をタブで開いたままにしてください。

S3 バケットの作成

前のステップのアカウント ID を使用して、123456789012-customclassifier などのグローバルに一意のバケット名を作成します。AWS Cloud9 ターミナルプロンプトで次のコマンドを入力します。

Admin:~/environment $ aws s3api create-bucket --acl private --bucket '123456789012-comprehend' --region us-east-1

出力には、作成したバケットの名前が表示されます。

{
    "Location": "/123456789012-comprehend"
}

IAM のセットアップ

Amazon Comprehend がトレーニング中または推論中にバケットの読み取りと書き込みを実行することを許可するには、作成した S3 バケットへの Amazon Comprehend アクセスを許可する必要があります。Amazon Comprehend サービスプリンシパルを信頼するために、アカウントにデータアクセスロールを作成しています。

IAM をセットアップするには、次の手順を実行します。

  1. コンソールの Services で、[IAM] を選択します。
  2. [Roles] を選択します。
  3. [Create role] を選択します。
  4. 信頼できるエンティティのタイプとして [AWS service] を選択します。
  5. このロールを使用するサービスとして [Comprehend] を選択します。
  6. [Next: Permissions] を選択します。

ComprehendDataAccessRolePolicy という名前のポリシーが自動的にアタッチされます。

  1. [Next: Review] を選択します。
  2. ロール名 には、ComprehendBucketAccessRole と入力します。
  3. [Create role] を選択します。
  4. Role ARN を記録します。

この ARN は、カスタム分類子のトレーニングを開始するときに使用します。

データの準備

このステップでは、コーパスをダウンロードし、トレーニングと推論の両方で Amazon Comprehend の予想される形式に一致するようにデータを準備します。この記事では、データセットのデータ準備を支援するスクリプトを提供します。

または、さらに便利なように、次の 2 つのコマンドラインを入力して準備済みのデータをダウンロードできます。

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-test.csv .

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-train.csv .

前の手順に従う場合は、次の手順をスキップして、このセクションの最後にあるアップロード部分に直接進んでください。

このチュートリアルのデータセットの準備を行う場合、または独自のデータを使用する場合は、以下の手順を実行します。

AWS Cloud9 ターミナルプロンプトで次のコマンドを入力して、AWS Open Data レジストリからダウンロードします。

Admin:~/environment $ aws s3 cp s3://fast-ai-nlp/yahoo_answers_csv.tgz .

進行状況バーが表示され、次の出力が表示されます。

download: s3://fast-ai-nlp/yahoo_answers_csv.tgz to ./yahoo_answers_csv.tgz

次のコマンドで圧縮を解除します。

Admin:~/environment $ tar xvzf yahoo_answers_csv.tgz

AWS Cloud9 環境で使用できるスペースが限られているため、アーカイブを削除する必要があります。次のコマンドを使用します。

Admin:~/environment $ rm -f yahoo_answers_csv.tgz

次の 4 つのファイルを含むフォルダ yahoo_answers_csv を取得します。

  • classes.txt
  • readme.txt
  • test.csv
  • train.csv

ファイル train.csvtest.csv には、トレーニングサンプルがコンマ区切り値として含まれています。クラスインデックス (1~10)、質問のタイトル、質問の内容、およびベストアンサーに対応する 4 つの列があります。テキストフィールドは二重引用符 (「) を使用してエスケープし、内部の二重引用符は 2 つの二重引用符 (” “) によってエスケープします。改行は、バックスラッシュとそれに続く「n」文字、つまり「\ n」でエスケープします。

次のコードは、ファイルの内容の概要です。

"5","why doesn't an optical mouse work on a glass table?","or even on some surfaces?","Optical mice use an LED
"6","What is the best off-road motorcycle trail ?","long-distance trail throughout CA","i hear that the mojave
"3","What is Trans Fat? How to reduce that?","I heard that tras fat is bad for the body. Why is that? Where ca
"7","How many planes Fedex has?","I heard that it is the largest airline in the world","according to the www.fe
"7","In the san francisco bay area, does it make sense to rent or buy ?","the prices of rent and the price of b

ファイル classes.txt には使用可能なラベルが含まれています。

train.csv ファイルには 1,400,000 行が含まれ、test.csv には 60,000 行が含まれています。Amazon Comprehend は、トレーニング用に送信されたドキュメントの 10~20% を使用して、カスタム分類子をテストします。

次のコマンドは、データが均等に分散されることを示しています。

Admin:~/environment $ awk -F '","' '{print $1}'  yahoo_answers_csv/train.csv | sort | uniq -c

ラベルごとに最大 1,000 のトレーニングドキュメントを使用してモデルをトレーニングする必要があり、1,000,000 を超えるドキュメントは使用する必要はありません。

テストに使用したのは 1,000,000 の 20% で、カスタム分類子をトレーニングするためにまだ十分なデータがあります。

train.csv の短縮バージョンを使用してカスタム Amazon Comprehend モデルをトレーニングし、test.csv を使用して検証を実行し、カスタムモデルのパフォーマンスを確認します。

トレーニングのために、ファイル形式は次の要件に準拠する必要があります。

  • ファイルには、行ごとに 1 つのラベルと 1 つのテキストが含まれている必要があります – 2 列。
  • ヘッダーなし
  • UTF-8 形式、キャリッジリターン「\n」。

ラベルは大文字である必要があります。複数トークン、空白、アンダースコアまたはハイフンで接続した複数の単語で構成できます。また、正しくエスケープされている限り、コンマを含めることもできます。

次のテーブルには、トレーニング用に提案された書式付きラベルが含まれています。

インデックス オリジナル トレーニング用
1 社会と文化 SOCIETY_AND_CULTURE
2 科学と数学 SCIENCE_AND_MATHEMATICS
3 健康 HEALTH
4 教育とリファレンス EDUCATION_AND_REFERENCE
5 コンピューターとインターネット COMPUTERS_AND_INTERNET
6 スポーツ SPORTS
7 ビジネスと財務 BUSINESS_AND_FINANCE
8 エンターテイメントと音楽 ENTERTAINMENT_AND_MUSIC
9 家族と人間関係 FAMILY_AND_RELATIONSHIPS
10 政治と政府 POLITICS_AND_GOVERNMENT

カスタム Amazon Comprehend モデルで、特定のテキストに対応するラベルを非同期の方法で決定する場合、ファイル形式は次の要件に準拠する必要があります。

  • ファイルには 1 行に 1 つのテキストが含まれている必要があります
  • ヘッダーなし
  • UTF-8 形式、キャリッジリターン「\n」。

この記事には、データの準備を高速化するスクリプトが含まれています。次のコマンドを入力して、スクリプトをローカル AWS Cloud9 環境にコピーします。

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/prepare_data.py .

データの準備を開始するには、次のコマンドを入力します。

Admin:~/environment $ sudo pip-3.6 install pandas tqdm
Admin:~/environment $ python3 prepare_data.py

このスクリプトは Yahoo コーパスに関連付けられており、pandas ライブラリを使用して、トレーニングとテストデータセットをフォーマットし、Amazon Comprehend の期待に一致させます。独自のデータセットに適合させるか、トレーニングデータセットと検証データセットのアイテム数を変更できます。

スクリプトが完了すると (完全なデータセットでは t2.large インスタンスで約 11 分間、縮小されたデータセットでは 5 分未満で実行されます)、環境に次の新しいファイルがあります。

  • comprehend-train.csv
  • comprehend-test.csv

次のコマンドを使用して、作成したバケットに準備したデータ (ダウンロードしたデータまたは準備したデータ) をアップロードします。

Admin:~/environment $ aws s3 cp comprehend-train.csv s3://123456789012-comprehend/

Admin:~/environment $ aws s3 cp comprehend-test.csv s3://123456789012-comprehend/

カスタム分類子のトレーニング

カスタムテキスト分類子トレーニングを開始する準備ができました。次のコマンドを入力し、ロール ARN とバケット名を独自のものに置き換えます。

Admin:~/environment $ aws comprehend create-document-classifier --document-classifier-name "yahoo-answers" --data-access-role-arn arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole --input-data-config S3Uri=s3://123456789012-comprehend/comprehend-train.csv --output-data-config S3Uri=s3://123456789012-comprehend/TrainingOutput/ --language-code en

カスタム分類子 ARN に名前を付ける次の出力が表示されます。

{
    "DocumentClassifierArn": "arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers"
}

これは非同期呼び出しです。その後、次のコマンドでトレーニングの進行状況を追跡できます。

Admin:~/environment $ aws comprehend describe-document-classifier --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers

次の出力が得られます。

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINING",
        "LanguageCode": "en",
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "SubmitTime": 1571657958.503,
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        }
    }
}

トレーニングが終了すると、次の出力が得られます。

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINED",
        "LanguageCode": "en",
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        },
        "SubmitTime": 1571657958.503,
        "EndTime": 1571661250.482,
        "TrainingStartTime": 1571658140.277
        "TrainingEndTime": 1571661207.915,
        "ClassifierMetadata": {
            "NumberOfLabels": 10,
            "NumberOfTrainedDocuments": 989873,
            "NumberOfTestDocuments": 10000,
            "EvaluationMetrics": {
                "Accuracy": 0.7235,
                "Precision": 0.722,
                "Recall": 0.7235,
                "F1Score": 0.7219
            }
        },
    }
}

トレーニング期間は異なるかもしれません。この記事の場合、トレーニングには完全なデータセットで約 1 時間かかりました (縮小したデータセットでは 20 分)。

完全なデータセットでのトレーニングの出力は、モデルのリコールが 0.72 であることを示しています。つまり、指定されたラベルの 72% を正しく識別しています。

次のスクリーンショットは、コンソールからのビューを示しています (Comprehend > Custom Classification > yahoo-answers)。

結果の収集

推論ジョブを起動して、分類子のパフォーマンスをテストできるようになりました。次のコマンドを入力します。

Admin:~/environment $ aws comprehend start-document-classification-job --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers --input-data-config S3Uri=s3://123456789012-comprehend/comprehend-test.csv,InputFormat=ONE_DOC_PER_LINE --output-data-config S3Uri=s3://123456789012-comprehend/InferenceOutput/ --data-access-role-arn arn:aws:iam::123456789012:role/ComprehendBucketAccessRole

次の出力が得られます。

{
    "JobStatus": "SUBMITTED",
    "JobId": "cd5a6ee7f490a353e33f50d866d0317a"
}

トレーニングの進行状況の追跡で行ったように、推論は非同期であるため、次のコマンドを使用して新しく起動されたジョブの進行状況を確認できます。

Admin:~/environment $ aws comprehend describe-document-classification-job --job-id cd5a6ee7f490a353e33f50d866d0317a

次の出力が得られます。

{
    "DocumentClassificationJobProperties": {
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-test.csv",
            "InputFormat": "ONE_DOC_PER_LINE"
        },
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "JobStatus": "IN_PROGRESS",
        "JobId": "cd5a6ee7f490a353e33f50d866d0317a",
        "SubmitTime": 1571663022.503,
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz"
        }
    }
}

完了すると、JobStatusCOMPLETED に変わります。これを完了するには約数分かかります。

OutputDataConfig.S3Uri パスと次のコマンドを使用して結果をダウンロードします。

Admin:~/environment $ aws s3 cp s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz .

出力 (tar xvzf output.tar.gz) を解凍すると、.jsonl ファイルが得られます。各行は、送信したドキュメントの対応する行に対してリクエストされた分類の結果を表しています。

たとえば、次のコードは予測の 1 行です。

{"File": "comprehend-test.csv", "Line": "9", "Classes": [{"Name": "ENTERTAINMENT_AND_MUSIC", "Score": 0.9685}, {"Name": "EDUCATION_AND_REFERENCE", "Score": 0.0159}, {"Name": "BUSINESS_AND_FINANCE", "Score": 0.0102}]}

これは、カスタムモデルが、次のテキストが「エンターテイメントと音楽」ラベルに関連していることを 96.8% の信頼スコアで予測したことを意味します。

"What was the first Disney animated character to appear in color? \n Donald Duck was the first major Disney character to appear in color, in his debut cartoon, \"The Wise Little Hen\" in 1934.\n\nFYI: Mickey Mouse made his color debut in the 1935 'toon, \"The Band Concert,\" and the first color 'toon from Disney was \"Flowers and Trees,\" in 1932."

結果の各行は、2 番目と 3 番目のラベルになり得るものも提供します。これらの異なるスコアを使用して、アプリケーションを構築できます。その際、スコアが 40% を超えている場合は各ラベルを適用し、単一のスコアが 70% を超えていない場合はモデルを変更します。

まとめ

トレーニングと検証用の完全なデータセットを使用して、2 時間以内に Amazon Comprehend を使用して 10 のカスタムカテゴリを学習しました。そしてテストで 72% のリコールを達成し、カスタムモデルを 60,000 ドキュメントに適用しました。

Amazon Comprehend コンソールからカスタムカテゴリを今すぐお試しください。詳細については、「カスタム分類」 を参照してください。Amazon Comprehend の他の機能を発見し、分類を超えた Amazon Comprehend の使用方法に関するインスピレーションを得るには、他の AWS ブログ記事をご覧ください。

Amazon Comprehend は、すぐに NLP 機能を使用してアプリケーションを強化するのに役立ちます。よい実験を!


著者について

Hervé Nivon はソリューションアーキテクトで、スタートアップのお客様が AWS でビジネスを成長させるのを支援しています。AWS に入社する前は、商用の無人航空機画像から企業のビジネスに関する洞察を生み出す企業の CTO を務めていました。また Accenture のコンサルタントも務めていました。