• Top
  • Search
  • About
  • Privacy Policy
 green

Amazon Comprehend が日本語に対応しましたね。
今回はお試しとして Node.js で Amazon Comprehend の日本語感情分析をしてみたいと思います。

Amazon Comprehend が日本語に対応しました | Amazon Web Services ブログ

AWS コンソール上で試してみる

まずは Node.js で実行する前に、AWS コンソール上で試してみます。

1. AWS コンソールで「Amazon Comprehend」にアクセスし「Launch Amazon Comprehend」をクリックします。

amazon_comprehend_1

2.「Real-time analysis」のページが表示されたら「Input text」のところまでスクロールします。

amazon_comprehend_2

3. 「Input text」の欄に分析したいテキストを入力します。
今回は、夏目漱石の「坊ちゃん」の第一段落を分析してみます。

親譲おやゆずりの無鉄砲むてっぽうで小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰こしを抜ぬかした事がある。なぜそんな無闇むやみをしたと聞く人があるかも知れぬ。別段深い理由でもない。新築の二階から首を出していたら、同級生の一人が冗談じょうだんに、いくら威張いばっても、そこから飛び降りる事は出来まい。弱虫やーい。と囃はやしたからである。小使こづかいに負ぶさって帰って来た時、おやじが大きな眼めをして二階ぐらいから飛び降りて腰を抜かす奴やつがあるかと云いったから、この次は抜かさずに飛んで見せますと答えた。

amazon_comprehend_3

4.「Analyze」をクリックして分析が完了したら「Insights」の「Sentiment」のタブに分析結果が表示されています。
「坊ちゃん」は「損ばかりしている」などの言葉があるからか「Negative」なテキストという判定になりました。

amazon_comprehend_4

Node.js で実行する

AWS コンソール上で日本語の分析ができることが確認できました。

次は、Node.js で Amazon Comprehend を実行してみます。
今回は、Lambda (Node.js 12.x) と API Gateway を使用しています。

1. Lambda 関数を準備する

Lambda 関数を準備します。
aws-sdk をインストールして読み込んでおきます。
※ Lambda で Amazon Comprehend を使用する場合は、ここでロールを変更しておきます。

const AWS = require("aws-sdk");

exports.handler = async event => {
  return event;
};

2. Comprehend インスタンスを作る

先ほどの関数に「us-east-2」リージョンを指定した Comprehend インスタンスを作成します。

日本語は東京リージョンに対応していません。
現段階では、以下の中からリージョンを選ぶことになります。

名前 コード
EU (アイルランド) eu-west-1
EU (ロンドン) eu-west-2
アジアパシフィック (シンガポール) ap-southeast-1
アジアパシフィック (シドニー) ap-southeast-2
EU (フランクフルト) eu-central-1
米国東部 (バージニア北部) us-east-1
米国東部 (オハイオ) us-east-2
カナダ (中部) ca-central-1
米国西部 (オレゴン) us-west-2
const AWS = require("aws-sdk");

AWS.config.update({ region: "us-east-2" });
const comprehend = new AWS.Comprehend();

exports.handler = async event => {
  return event;
};

3. 言語コードを判別する

テキストの感情分析を行う関数のリクエストパラメータには言語コードが必要になるので、まず batchDetectDominantLanguage 関数で言語コードを判別します。

先ほどのコードを以下のように修正します。
event.text で対象のテキストを受け取れるようにしておきます。

~~ 略 ~~

exports.handler = async event => {
  const text = event.text;

  if (!text) return;

  const params = {
    TextList: [text]
  };

  // 言語コードを判別する
  const LanguageResult = await comprehend
                                                       .batchDetectDominantLanguage(params)
                                                       .promise();

  return LanguageResult;
};

以下のようなレスポンスが帰ってくるので、その中の LanguageCode を使用します。

{
  "ResultList": [
    {
      "Index": 0,
      "Languages": [
        {
          "LanguageCode": "ja",
          "Score": 1
        }
      ]
    }
  ],
  "ErrorList": []
}

4. テキストを分析する

言語コードが取得できたら、あとは対象テキストと言語コードをパラメータに詰めて batchDetectSentiment 関数を実行するだけです。

~~ 略 ~~

exports.handler = async (event, context, callback) => {
  const text = event.text;

  if (!text) return;

  let params = {
    TextList: [text]
  };

  // 言語コードを判別する
  const LanguageResult = await comprehend
                                                       .batchDetectDominantLanguage(params)
                                                       .promise();

  params["LanguageCode"] = LanguageResult
                                                   .ResultList[0]
                                                   .Languages[0]
                                                   .LanguageCode;

  // 感情分析をする
  const sentiment = await comprehend
                                             .batchDetectSentiment(params)
                                             .promise();

  return sentiment;
};

AWS コンソール上で実行してみたテキストをリクエストしてみると、同じ結果が返ってくることが確認できます。

{
  "ResultList": [
    {
      "Index": 0,
      "Sentiment": "NEGATIVE",
      "SentimentScore": {
        "Positive": 0.07277911901473999,
        "Negative": 0.8395860195159912,
        "Neutral": 0.08762635290622711,
        "Mixed": 0.000008513573447999079
      }
    }
  ],
  "ErrorList": []
}

エラー処理などは各自でよしなに。
あとは、この結果をいい感じに処理したらいろいろできそうですね。

今回のソースコードは以下に置いておきます。
amazon-comprehend-demo / GitHub

それでは、よい AWS ライフを!

参考情報

Class: AWS.Comprehend — AWS SDK for JavaScript