きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

COTOHA API × を × 試してみた

この記事の目的

この記事では、
COTOHA APIで試したことをまとめること
を目的としています。


本題

★COTOHA APIとは

NTT Communicationsが提供している日本語文章解析サービスです。NTTグループの40年以上にわたる研究成果である日本語辞書と、自然減書処理を活用したサービスで、高度な日本語文章の解析が実現できます。
使える機能は、構文解析固有表現抽出照応解析キーワード抽出類似度算出文タイプ判定ユーザ属性推定があります。

本記事では、COTOHA APIのFor Developersを利用してどんな機能が利用できるか試していきます。

※COTOHA APIのより詳しい情報はこちら!
www.ntt.com



★利用を開始する

COTOHA API For Developersを利用するためには、まず、ユーザー登録する必要があります。以下のURLにアクセスし、ユーザー登録をします。
api.ce-cotoha.com

f:id:kinakomotitti:20181124211137p:plain
※自分の環境では、登録した後すぐには利用開始ができませんでした。登録後、1~2週間後に、ふとログインしたときに利用できるようになっていました。


トークンの取得

COTOHA APIの各機能を利用するためにはアクセストークンを取得する必要があります。要は、サービスにログインするということですね。ここで取得したそのトークンをHTTPヘッダーのAuthorizationのBearerに添付することで、サービスが利用できるようになります。
開発者リファレンスにも書いてあるので細かいところははしょりますが、以下のようなリクエストを用意してPOSTします。
f:id:kinakomotitti:20181124211152p:plain
正しくリクエストが送信されると、このようなレスポンスが返ってきます。
f:id:kinakomotitti:20181124211200p:plain
以降、サービスを呼び出すときは、ここで取得したトークンをHeaderに設定します。
f:id:kinakomotitti:20181124211209p:plain

これ以降では、特に言及しませんが、各機能を呼び出す設定には必ず↑の設定をしています。


★ユーザ属性推定

ここからは、気になった機能の実行方法と、結果を見ていきます。まずは、ユーザ属性推定機能です。まだβ版の機能ですが、とても気になります。この機能では、日本語で記述された複数の文からなるテキストを受け取り、年代、性別、趣味、職業などの人物に関する属性を推定・出力することができます。
文章から、文章を書いた人の年齢、性別、職業、趣味などを推定できるということで、とても面白いです。
利用するためには、以下のようにPOSTリクエストを作成します。
f:id:kinakomotitti:20181124211219p:plain
試しに、子の設定のままリクエストを送信した結果はこのようになりました。

{
  "result": {
    "age": "40-49歳",
    "civilstatus": "既婚",
    "hobby": [
      "COOKING",
      "GOURMET",
      "INTERNET",
      "MOVIE",
      "SHOPPING"
    ],
    "location": "関東",
    "moving": [
      "RAILWAY"
    ],
    "occupation": "会社員"
  },
  "status": 0,
  "message": "OK"
}

むう。

49才・・・



次に、もう少し長い文章、かつ、年齢、性別がわかるものを流してみようとおもいます。よい感じの文章が手元になかったので、芸能人のブログから一部拝借しました。全文は載せないですが、要約すると、乃木坂グループに所属している女性が、乃木坂グループをやめることを決めた決意表明の文章でした。
さて、その解析結果は・・・?

{
  "result": {
    "age": "20-29歳",
    "earnings": "3M-5M",
    "gender": "女性",
    "hobby": [
      "COOKING",
      "GOURMET",
      "MUSIC",
      "SHOPPING",
      "TRAVEL"
    ],
    "location": "関東",
    "moving": [
      "RAILWAY"
    ],
    "occupation": "会社員"
  },
  "status": 0,
  "message": "OK"
}

アイドルは会社員なかなぁ・・・それを除いても、結構的中していそうですね!趣味もMusicがあるあたり正しく推定できているといえるのではないでしょうか?w
今回は、480文字程度の長さの文章を解析にかけました。より精度が必要な場合は、これくらいか、それ以上の長さの文章が必要なのではないかと思います。


★キーワード抽出

次の機能は、文章の中から、その文章に含まれる特徴的なフレーズ・単語をキーワードとして抽出する機能です。
以下のようにPOSTリクエストを構築します。
f:id:kinakomotitti:20181124211240p:plain
このサンプルの実行結果は以下のようになりました。

{
  "result": [
    {
      "form": "入力",
      "score": 17.78646
    },
    {
      "form": "テキスト",
      "score": 9.5002
    }
  ],
  "status": 0,
  "message": ""
}

さらに、ユーザ属性推定のときに利用させていただいたブログの文章を利用して実行結果を見てみます。実行結果は以下の通りです。

{
  "result": [
    {
      "form": "体現",
      "score": 17.5599
    },
    {
      "form": "すべて",
      "score": 16.666666
    },
    {
      "form": "アイドル人生",
      "score": 15.518726
    },
    {
      "form": "アイドル",
      "score": 13.476435
    },
    {
      "form": "20歳",
      "score": 13.333334
    },
    {
      "form": "乃木坂",
      "score": 11.9943
    },
    {
      "form": "",
      "score": 10.766816
    },
    {
      "form": "加入",
      "score": 9.86082
    },
    {
      "form": "小中高",
      "score": 9.166667
    },
    {
      "form": "本気",
      "score": 9.084075
    },
    {
      "form": "余裕",
      "score": 8.91675
    },
    {
      "form": "不安",
      "score": 8.60025
    },
    {
      "form": "焦り",
      "score": 7.8740664
    },
    {
      "form": "やつ",
      "score": 7.5362997
    },
    {
      "form": "葛藤",
      "score": 6.782183
    },
    {
      "form": "全部",
      "score": 6.30944
    },
    {
      "form": "最年少",
      "score": 5.77625
    },
    {
      "form": "周り",
      "score": 5.744515
    },
    {
      "form": "安心感",
      "score": 5.722217
    },
    {
      "form": "",
      "score": 4.549784
    },
    {
      "form": "環境",
      "score": 4.183812
    },
    {
      "form": "満足",
      "score": 3.5180001
    },
    {
      "form": "13歳",
      "score": 3.253615
    },
    {
      "form": "",
      "score": 2.8731298
    },
    {
      "form": "",
      "score": 2.7593467
    },
    {
      "form": "",
      "score": 2.41294
    },
    {
      "form": "現状",
      "score": 1.6721166
    },
    {
      "form": "場所",
      "score": 1.2219884
    },
    {
      "form": "初心",
      "score": 1.1248667
    },
    {
      "form": "がむしゃら",
      "score": 0.8333334
    }
  ],
  "status": 0,
  "message": ""
}

40個キーワードを抽出するように設定したので、いっぱい表示されました。どれも確かに特徴的な文字列ばかりであると思います。こんな感じで抽出できるようです。


・・・さて、AI、キーワード抽出、といったら、MicrosoftのText Analyticsが思い浮かびますよね!wこちらのサービスも、COTOHA APIと同じようにテキストからキーフレーズ(と、感情、言語)を抽出する機能を持っています。ということで、最後に、Text Analyticsでの抽出結果と比較してみたいと思います。

★ユーザ属性推定

以下のURLでText Analyticsのデモを利用できます。今回は、ここのデモを利用して結果を出力します。
https://azure.microsoft.com/ja-jp/services/cognitive-services/text-analytics/
結果は以下の通りです。

{
  "languageDetection": {
    "documents": [
      {
        "id": "30e1131f-1d94-4c55-9d7e-e71f645d560b",
        "detectedLanguages": [
          {
            "name": "Japanese",
            "iso6391Name": "ja",
            "score": 1.0
          }
        ]
      }
    ],
    "errors": []
  },
  "keyPhrases": {
    "documents": [
      {
        "id": "30e1131f-1d94-4c55-9d7e-e71f645d560b",
        "keyPhrases": [
          "こと全部",
          "余裕",
          "アイドル人生",
          "か後輩",
          "くらい",
          "か上",
          "触れ",
          "小中高",
          "環境",
          "周り",
          "安心感",
          "葛藤",
          "中学",
          "焦り",
          "目標",
          "場所",
          "小学生",
          "加入",
          "感じ",
          "青春",
          "すべて",
          "比べ",
          "つき",
          "やつ",
          "体現",
          "節目",
          "迎え",
          "現状",
          "満足",
          "戻り",
          "やり",
          "乃木坂",
          "時間",
          "働き",
          "いこう",
          "当初"
        ]
      }
    ],
    "errors": []
  },
  "sentiment": {
    "documents": [
      {
        "id": "30e1131f-1d94-4c55-9d7e-e71f645d560b",
        "score": 0.42574897408485413
      }
    ],
    "errors": []
  },
  "entities": {
    "documents": [],
    "errors": [
      {
        "id": "30e1131f-1d94-4c55-9d7e-e71f645d560b",
        "message": "Supplied language is not supported. Pass in one of: en,es. See https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/overview for the complete list of support languages."
      }
    ]
  }
}

「こと全部」「つき」「やり」など、結構意味がわからないキーワードも抽出されていますが、アイドルをやめようとしているフレーズが抽出されています。ただ、抽出されたキーワードとしては、COTOHA APIの方が適切に言語解析できているのではないかと感じますね・・・言語解析専門ではないので正確な比較はできませんが・・・


まとめ

日本語に特化した言語解析をしたいときは、COTOHA API
api.ce-cotoha.com


テキストの感情や、何の言語かわからないときは、Cognitive Service!
azure.microsoft.com


今回試したAPI以外にも機能があるので、少しずつ触っていこうかと思います。