SNS分析まとめ①ツイートを自然言語処理
Natural Language APIを使用してツイートを数値化し、それをBigQuery にアップして分析します。
記事は3つに分けており、この記事は1番目「ツイートを自然言語処理して数値化」をするところです。
目次
Twitterのどの単語がどう影響しているのかを分析する
本分析の目的は「潜在ニーズの表出」と「SNS(twitter)からのサイトへの流入」であり、
「この単語を使うとインプレッション率(サイトURLクリック率)が上がりますよ!」と言えるようになることです。
手順は以下の通りです。
- GASを使用して、スプレッドシート経由でツイートを自然言語処理
- 数値化されたツイートをBigQueryに挿入
- データポータルで可視化、BQMLで分析
この記事では手順1のツイートを自然言語処理する部分の記事です。
手軽に自然言語処理できる「Natural language API」
Cloud Natural Language | Google Cloud
「Natural Language API」とはGoogleが提供する自然言語処理APIです。このAPIでは、「構文解析」「感情分析」「エンティティ分析」「エンティティ感情分析」「コンテンツの分類」を行うことができます。今回のTwitter分析では「エンティティ感情分析」を使用しました。
ツイートを自然言語処理して数値化する
ツイートを数値化し、分析できる形に変換します。
以下の記事を参考に行っていきます。
Natural Language API でお手軽センチメント分析(感情分析) – Qiita
STEP1 GCP(Google Cloud Platform)に登録しAPIを有効化
Cloud Natural Language | Google Cloud
途中でクレジットカードの登録が必要です。
左上のナビゲーションメニューから、「APIとサービス」→「ライブラリ」→「Natural Language API」で検索し、有効化します。
↑有効化された画面
その後、「APIとサービス」→「認証情報」→「認証情報を作成」からAPIキーを作成してください。APIキーはこの後スクリプトで使います。
料金について
5000ノードまでは無料で分析を行うことができます。詳しくはドキュメントの料金の欄をご覧ください。
Pricing | Cloud Natural Language | Google Cloud
使用するのは「エンティティ感情分析」と「コンテンツの分類」です。
サンプルコード↓
//mySheetの定義
//スプシのIDを自動で取得
var mySheet = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId()).getSheetByName(SpreadsheetApp.getActiveSpreadsheet().getSheetName());
//Natural Language APIキー
var apiKey = "ここに先ほどのAPIキーを入力してください";
//指定した範囲のテキストを取得して、配列に保存、配列の長さを取得してlenに入力
const ss = SpreadsheetApp.getActiveSheet()
const cont = ss.getActiveRange().getValues();
var len = cont.length
main(len,cont)
//シートの分析結果の値のクリア
var range = mySheet.getRange("B2:G5000");
// そのセル範囲にある値のみクリア
range.clearContent();
//onOpenメソッドから呼び出される。センチメント分析をする範囲を引数として渡す
function main() {
getSentiment(2, len);
}
//センチメント分析を行うメソッド。引数で指定された範囲のセルを分析
function getSentiment(start, end) {
//エンティティの取り出しのための変数定義
var c = 0;
//エンティティの分析結果を書き出すセルを指定するための変数の定義
var e = 2;
//1から繰り返してendより大きくなったら終了
for (i = start; i <= end + 1; i++) {
//分析文を取得したcontから文を取得
var tweet = cont[c]
Logger.log(cont)
c += 1
//セルから取得した文字列をAPIへ送信
var response = retrieveSentiment(tweet[0]);
//JSONをGASで読み込めるようにする
var json = JSON.parse(response);
//json(分析結果)の単語の個数を取得
var jsonlen = json["entities"].length;
//分析結果を挿入
for (a = 0; a<jsonlen; a++){
var score = json["entities"][a]["sentiment"]["score"];
var magnitude = json["entities"][a]["sentiment"]["magnitude"];
var name = json["entities"][a]["name"];
var type = json["entities"][a]["type"];
var salience = json["entities"][a]["salience"];
mySheet.getRange(e, 1).setValue(tweet);
mySheet.getRange(e, 2).setValue(name);
mySheet.getRange(e, 3).setValue(salience);
mySheet.getRange(e, 4).setValue(type);
mySheet.getRange(e, 5).setValue(score);
mySheet.getRange(e, 6).setValue(magnitude);
e = e + 1;
}
}
}
//APIに送る型の指定
function retrieveSentiment(textData) {
//行う分析のHTMLを指定する。今回はエンティティ感情分析
var apiEndpoint =
"https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=" +
apiKey;
//ドキュメントの型の指定
var docDetails = {
//言語の指定
language: "ja-jp",
//テキストのタイプの指定
type: "PLAIN_TEXT",
//分析する文の指定
content: textData,
};
var nlData = {
//入力テキスト
document: docDetails,
//どの文字コード系で符号化されているか
encodingType: "UTF8",
};
var nlOptions = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(nlData),
};
var response = UrlFetchApp.fetch(apiEndpoint, nlOptions);
Logger.log("json is :" + response);
return response;
}
function onOpen() {
SpreadsheetApp
.getActiveSpreadsheet()
.addMenu('カスタムメニュー', [
{name: 'センチメント分析', functionName: 'main'}
]);
}
onOpen();
AppScriptの使い方
1,スプレッドシートを新規作成し、拡張機能から「AppScript」を選択
2,サンプルコードをペーストする
APIキーを自分のAPIキーに変更してください。その後シートに戻ってF5で更新すると、「カスタムメニュー」が表示されるので、A列に分析したい文章を入力し範囲選択することによって分析をすることができます。
このように結果が表示されれば分析成功です。
結果の解釈は以下の通りです。
まとめ
これによって文章を数値データにすることができました。「Natural Language API」を使用することによって、Twitterの文章に限らず様々な文章の傾向を数値化することができます。
反省点としては、「エンティティ感情分析」を使用したのですが、scoreとmagunitudeの値がうまく返ってこなかった点です。
次回はこの数値とTwitterのアナリティクスデータをBigQueryにアップし、分析ができるようにしていきます。