Watson APIでお問い合わせメールを分類する

SendGridサポートチームの有田です。
今回の記事では、Parse Webhook(SendGridのメール受信機能)で受信したメールを、本文の内容によって自動的に分類する方法を検討します。例として、SendGridに関するお問い合わせメールを、トラブル / 機能 / その他(営業メールなど優先度が低いもの)に分類できるかを試してみました。

概要と前提条件

システム構成は以下の通りです。

システム構成

過去の記事と同様に、SendGridで受信したメールをZapier経由でメールクライアント(Gmail)へ転送しますが、転送前にWatson APIのNatural Language Classifierを利用してメールを分類し、ラベル付けします。
前提条件として、SendGrid・Zapier・Gmail・IBM Cloud(Standard以上)のアカウントが必要となります。

Natural Language Classifierとは

IBM Watsonは、AIや機械学習などを簡単に自社ビジネスに組み込むためのサービスで、チャットボットや翻訳機能、音声認識・画像認識などたくさんのAPIが公開されています。
Natural Language ClassifierもWatson APIの1つです。このサービスを使うと、入力した文章(例:メールの本文)を、あらかじめトレーニングしておいたクラス(例:トラブル / 機能 / その他)のどれかに分類することができます。ここで言うトレーニングとは、事前に各クラスの例文をClassifierに与え、用途にあわせてチューニングしておくことを指します。

Natural Language Classifierのトレーニング

Natural Language Classifierのトレーニングは、CSV形式のトレーニングデータをアップロードして実行します。
今回は、サポートページの「よくあるご質問」などから準備した40個の例文に、trouble / function / otherのクラス名を付与したものをトレーニングデータとしました。

差出人情報(Sender)の認証が完了しません。どうすればよいでしょうか?,trouble
パスワードの変更に失敗してしまいます。,trouble
IP Access Managementの設定を間違えてしまい、SendGridへアクセスできなくなってしまいました。,trouble
日本の携帯電話向けのメール配信にも対応していますか?,function
どのようなAPIが提供されていますか?,function
送信したメールの内容を後から参照できますか?,function
お見積りはお気軽にお問い合わせください。,other
詳しくはWebサイトをご覧ください。,other
新製品を限定価格でご紹介します。,other

トレーニングはGUIとAPIの両方で実行可能ですが、今回はGUIを利用します。Natural Language Classifierのセットアップとトレーニングの手順は以下の通りです。

  1. IBM Cloudからサインインし、ダッシュボードを開きます。
  2. 「カタログ」ページで「Watson Studio」のサービスを選択し、「作成」します。Natural Language Classifierのセットアップ
    Natural Language Classifierのセットアップ
    Natural Language Classifierのセットアップ
  3. Watson Studioが起動したら、「Get Started」→「Projects」から「New Project」を作成します。プロジェクト名などを入力し、「Create」をクリックします。プロジェクト名などを入力
    「Create」をクリック
    New Project
    Watson Project Setting
  4. プロジェクトのページが開いたら、「Assets」タブの「Natural Language Classifier models」の項目で「New Natural Language Classifier model」をクリックします。New Natural Language Classifier model
  5. 契約プランを選択して「Confirm」すると、「Natural Language Classifier」のサービスが利用可能になります。契約プランを選択
    Confirm
  6. Classifierの管理ページが表示されます。画面右側の「1. Upload to Project」から、トレーニングデータをアップロードします。トレーニングデータをアップロード
  7. アップロードが完了したら、右上の「Train Model」をクリックします。言語は「Japanese」を選択してください。Train Modelをクリック
    14_language
  8. しばらく待つと、トレーニング終了が通知されます。今回のトレーニングは5分くらいで終了しました。トレーニング終了の通知
  9. ここまで完了したら、トレーニングしたClassifierを使えるようになります。「Test」タブで適当な文章を入力して試してみましょう。テスト入力

最後に、IBM CloudのダッシュボードでNatural Langage Classifierのサービス名をクリックすると、管理ページが表示されます。Zapierからトレーニング済みのClassifierにアクセスするために、認証情報を控えておきましょう。

認証情報

以上で、Classifierの設定は完了です。

Gmailの設定

受信側メールクライアント(Gmail)で、お問い合わせメールに付与するラベルを作成しておきます。このラベルは、次項のZapierの設定で利用します。

Gmailの設定

Zapierの設定

ZapierとSendGridの基本的な設定方法は過去の記事と同様ですが、Zapに下図の「2. Run Javascript」アクションを追加し、「3. Send Email」アクションを一部修正します。

Run Javascriptアクションを追加

まずは「Run Javascript」アクションの設定です。このアクションで、先ほど作成したClassifierを呼び出します。

  1. 「+」ボタンからアクションを追加し、「Code」を選択します。
  2. 言語はJavascriptを選択して「Save + Continue」をクリックします。Javascriptを選択
  3. 「Input Data」でStep 1(Catch Hook)のメール本文を指定します。ここで登録した項目は、Javascriptのソースコードで参照できるようになります。メール本文を指定
  4. 「Code」の欄にソースコードを入力します。
    const URL = 'https://{username}:{password}@gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/{classifier_id}/classify';
    
    const CLASS_LABEL = {
      trouble:  {Gmailの「トラブル」のラベルID},
      function: {Gmailの「機能」のラベルID},
      other:  {Gmailの「その他」のラベルID}
    };
    
    var input = inputData.mail_body.replace(/\r?\n/g, '');
    var input_json = '{\"text\":\"' + input + '\"}';
    
    fetch(URL, { method: 'POST', body: input_json,headers:{'content-type':'application/json'}})
      .then(function(res) {
        return res.text();
      }).then(function(json) {
        var resbody  = JSON.parse(json);
        var top = resbody.top_class;
        var output = [{tag:CLASS_LABEL[top]}];
        callback(null, output);
      })
      .catch(callback);
    

    ※Natural Language ClassifierのAPIリファレンスはこちらです。
    ※GmailのラベルIDは、「Send Email」アクションの「Edit Template」を開き、「Label/Mailbox」の項目で「Use a Custom Value」を選択すると一覧表示されます。

  5. 「Continue」ボタン→「Send Test To Code by Zapier」ボタンの順でクリックし、「Test was successful!」のメッセージが表示されたら、このアクションの設定は完了です。完了

次に、「Send Email」アクションを修正します。

  1. 「Send Email」アクションの「Edit Template」をクリックします。
  2. 「Label/Mailbox」の設定で、「Use a Custom Value」を選択し、その値として「Run Javascript」アクションの出力(GmailのラベルID)を選択します。Zapierの設定

以上で、Zapierの設定は完了です。編集したZapをONにしておきましょう。

結果の確認

それでは、実際にお問い合わせメールを送ってみます。メールの本文は、トラブル / 機能 / その他の3パターンでそれぞれ試してみました。

結果の確認

以下が受信結果です。想定通りに分類されています。

受信結果

「トラブル」のメールにある「Domain Authentication」という用語はトレーニングデータに含まれませんでしたが、「Fail」といった単語をヒントに正解できたようです。

その他の文章も確認してみました。概ね正しいラベルが付与されましたが、トレーニングデータに類似の内容がない場合、語尾によってトラブルと機能の分類結果が左右されることもあるようです(No.6とNo.7)。また、「その他」のトレーニングデータが営業系の内容に偏っていたため、質問でも営業でもない文章の分類が難しいようでした(No.9とNo.10)。

No 文章 正解ラベル 結果
1 ユーザ名を忘れてログインできなくなりました。 トラブル トラブル(正解)
2 アカウントがサスペンドされたのですが、どうしたらよいでしょうか? トラブル トラブル(正解)
3 Processedイベント発生からDeliveredイベント発生までに数時間かかっています。SendGridに障害は発生していませんか? トラブル トラブル(正解)
4 Web APIでカテゴリを指定してメール送信することはできますか? 機能 機能(正解)
5 複数のドメインからメール配信することは可能でしょうか? 機能 機能(正解)
6 TO, CC, BCCを指定した場合の通数の数え方を教えてください。 機能 機能(正解)
7 TO, CC, BCCを指定した場合の通数の数え方がわかりません。 機能 トラブル(不正解)
8 一度お打合せの機会をいただけませんか? その他 その他(正解)
9 明日は雨が降るらしい。 その他 トラブル(不正解)
10 お腹が空いたので、食事にいきませんか? その他 トラブル(不正解)

まとめ

Natural Language Classifierを使うと、理論やアルゴリズムを理解していなくても、お手軽にメールを分類できることがわかりました。普段からたくさんのメールを受信している場合、一次仕分けには使えそうです。また、作成したClassifierは、後でデータを追加して再トレーニングすることもできるので、データが集まればより精度が高くなるはずです。
Watson APIにはたくさん種類があるので、他にも活用方法を探っていきたいと思います。