【上級編】【PowerQuery】APIを活用して文章から感情を読み取ってみよう!

今回はPowerQueryを使って
API接続する方法を紹介します!

どんなAPIに接続するかと言うと…

今回はGoogleが提供している自然言語処理のAI
CloudNaturalLanguage API を使って実装していきます!

これを活用してセリフ感情分析をしてみます!

このAPIを使うには
前もってGoogleCloudPlatformに登録が必要になります。
感情分析に使う文字数が
月に5000文字までだったら今のところ無料だそうです!

登録方法やPythonで実装する場合はコチラを参考

とても分かり易い説明のいまにゅさん!
他の動画もとても勉強になりますよ♪♪


それではPowerQuery実装してみます!

この記事を動画で見たい方はコチラ

APIを実装してみよう!

かじむー

実際にM言語を書いてAPI接続してみるよ~!

今回作りたいもの

ではGoogleCloudPlatformの登録を進めていくと
CloudNaturalLanguage API に接続するための
APIキーを取得できます。

そのAPIキーをどこかシートに記入して
テーブル化しておきましょう!

では最終的にこんなものを作りたいと思います!

テキスト」テーブルに文章を入力して
感情分析」テーブルを更新すると
どれだけその文章が
ポジティブか?ネガティブか?
出力するものを作ろうと思います!

因みにこのAPIは
文章に対して最小値 -1 最大値 +1 で数値判定をして
その文章のポジティブ度合い・ネガティブ度合が分かります!

例えば画像にあるこの文章!
この冬ドラマsilentの主題歌でヒットした曲
髭男の「subtitle」のサビの部分!

皆さんこの文章は
ネガティブだと思いますか?ポジティブだと思いますか?

更新してみてみると…
+50%」でポジティブでした!!!

今からこの中身を作っていきます!

シートの情報を読込む

まずはシート上のテーブルに記入した
APIキー
文章
を読込みます!

テーブル値を読込む
// APIキー
api_key = Excel.CurrentWorkbook(){[Name="api"]}[Content]{0}[api_key],
// 文章
words = Excel.CurrentWorkbook(){[Name="text"]}[Content]{0}[テキスト]

Excel.CurrentWorkbook() 関数を使って
{[Name = “テーブル名“]}[Content]{0}[列名]

と入力すれば取得できます!

この関数を無理やり和訳すると
“〇〇〇”と言う名前のテーブル(Name=”テーブル名”)の
〇〇〇という名前の列(列名)に対して
データ行(Content)の一番上にある(0行目)データを取得

公式リファレンスで作り方を確認しよう

ではAPIに文章を送って
感情値が返ってくる部分を作ります!

要はリクエストする記述を書くのですが
これは公式リファレンスに説明が書いております!

CloudNaturalLanguage APIのリファレンス

HTTPリクエストPOST形式
URLは

URL
https://language.googleapis.com/v1/documents:analyzeSentiment

でリクエストしろって言ってますね!

そしてポストデータ、つまりボディ部分は
Json形式でこのように書けって言ってますね!
因みにJson形式とは辞書型のデータ形式です。
「言葉」に対して「意味」が紐づいてる辞書の様に
「名前」に対して「値」が紐づいている形式です。

ではボディの中身を見てみると
DocumentencodingTypeという名前に対して値が必要みたいです!

Document
Documentの中身を見てみると
typecontentlanguageまたはgcsContentUriと言う設定がありますね。

・type:PLAIN_TEXT
・language:JA
・content:感情分析したい文章(words)

encodingType

encodingTypeはUTF8で良いでしょう!

PowerQuery – Web.Contents のリファレンス

ではPowerQueryでリクエストする関数を見ていきます!
この「Web.Contents」関数を使います!

そして親切にPOST形式のテンプレートがあります!
これをそのまま使っちゃいましょう!

M言語でAPIを実装してみよう

先ほどのテンプレートを、続きにコピペしましょう!
そして中身を先ほど確認した内容に書き換えていきましょう!

POSTデータ
// URL
url = "https://language.googleapis.com/v1/documents:analyzeSentiment?" & "key=" & api_key,
// ヘッダー (リクエストするポストデータはJson形式ですよ~)
headers = [#"Content-Type" = "application/json"],
// ボディ (ポストデータはこんな内容です~)
postData = Json.FromValue(
    [
        document = [
            type = "PLAIN_TEXT",
            language = "JA",
            content = words
        ],
        encodingType = "UTF8"
    ]
),
// リクエスト
response = Web.Contents(
    url,
    [
        Headers = headers,
        Content = postData
    ]
),
// Json形式の文字列をJson型に変換
jsonResponse = Json.Document(response)

これによって
文章をAPIに渡して感情分析をしてもらい
その結果が返ってきます!

その結果を見てみると…

documentSentimentscoreが感情の値を表しています!

では全コードを書くとこんな感じです!

感情分析
let
    // APIキー
    api_key = Excel.CurrentWorkbook(){[Name="api"]}[Content]{0}[api_key],
    // 文章
    words = Excel.CurrentWorkbook(){[Name="text"]}[Content]{0}[テキスト],
    // URL
    url = "https://language.googleapis.com/v1/documents:analyzeSentiment?" & "key=" & api_key,
    // ヘッダー (リクエストするポストデータはJson形式ですよ~)
    headers = [#"Content-Type" = "application/json"],
    // ボディ (ポストデータはこんな内容です~)
    postData = Json.FromValue(
        [
            document = [
                type = "PLAIN_TEXT",
                language = "JA",
                content = words
            ],
            encodingType = "UTF8"
        ]
    ),
    // リクエスト
    response = Web.Contents(
        url,
        [
            Headers = headers,
            Content = postData
        ]
    ),
    // Json形式の文字列をJson型に変換
    jsonResponse = Json.Document(response),
    // 感情値のみ取得
    documentSentiment = jsonResponse[documentSentiment][score]
in
    documentSentiment

この数値をシートに出力させれば完了です!
1なら100%、0.5なら50%、-0.5なら-50%て感じですね!
プラスならポジティブ、マイナスならネガティブ!

感情分析で遊んでみよう

かじむー

Official髭男dism「subtitle」の歌詞を感情分析してみたよ♪

それではOfficial髭男dismsubtitle」の1番の歌詞を
Aメロ・Bメロ・サビの3つに分けて感情値を出してみると…

かじむー

感情値から逆算して歌詞の意味を考えてみたよ♪

~全体~

数値だけ見るとサビ前で感情を下げて、サビ入って盛り上げてますね!
ここは感情の振れ幅が大きいので、聞き手の感情が揺さぶられそうですよね。

~Aメロ~

1番のAメロは言い換えるとポジティブとネガティブのせめぎ合い!
君には僕が必要という傲慢さ、騒がしいほどの励ましが、逆に傷つけていたというネガティブさ!
でもそれによって、本当に伝えたい、静かで熱いものに気づいたポジティブさ!

~Bメロ~

綺麗な理想はあるけど、今の僕にはどうする事もできないネガティブさ!

~サビ~

それでも諦められない。愛してるの言葉よりもっと奥に愛が届くまで。というポジティブさ!

かじむー

こんな楽しみ方はいかがでしょうか?

今回のまとめ

▼API接続する方法

 ①APIキー発行する
 ②Web.Contents関数を使ってリクエスト

APIを使って業務効率化できることは沢山あります!
特にデータ分析を行っている業務では
手動でデータをかき集める手間が省けます!

数値を自動で集めて
すぐに集計結果を出す事ができるのでかなり便利だと思います!

欲しいデータ元でAPIが公開されていれば
是非活用していきましょう!
と言うより今の時代APIを使いこなせる事は必須だと思います!
頑張って習得していきましょう!

かじむー

業務効率化のご相談はお気軽に♪