はじめに
MATLABのText Analytics Toolboxというものを普段愛用しているのですが、最新バージョンR2019bの新機能リストにセンチメント分析の機能があったので(Sentiment Analysis: Evaluate sentiment in text data using sentiment scoring algorithms including VADER)、お遊び感覚で試してみました。自分の備忘も兼ねて紹介します。
センチメント分析とは?
記載の文章が、ポジティブ・ネガティブ・ニュートラルのどれなのか、一連の単語から判断するものです。感情分析ともいいます。ツイートやアンケート結果がポジティブなのかどうかを判断するために使われたりもします。
準備するもの
MATLABに、バージョンR2019b以降のText Analytics Toolboxが入っていればOKです。
早速試してみました
データの準備
解析に使ったデータは下記です。strという名前のテーブルに3つの文章を保存しています。
念のため、Google翻訳を使って日本語に訳すと、意味としては下記の通りです。
"I am happy for you!": よかったね!
"Once upon a time, there was a princess.": むかしむかし、王女がいました。
"I'm so shocked because I failed the exam.": 試験に失敗したのでショックを受けました。
トークン化
センチメント分析をするための前処理として、トークン化をします。コードと出力結果は下記です。
documents = tokenizedDocument(table2array(str));
documents(1:3)
ans =
3×1 tokenizedDocument:
6 tokens: I am happy for you !
10 tokens: Once upon a time , there was a princess .
8 tokens: I'm shocked because I failed the exam .
センチメント分析
各文章のスコアを見てみます。コードと出力結果は下記です。
compoundScores = vaderSentimentScores(documents);
compoundScores(1:3)
ans =
0.6114
0
-0.6808
文章が下に行くほど値がネガティブになっていることがわかります。
このスコア化の部分、2行だけで書けたので、これから便利に使っていけそうです。
Twitterのコメントをざっと見てみた
センチメント分析を応用できないかなと、twitterで、自分の好きな海外のテレビ番組名を検索した時の視聴者の反応を見てみました。(激しいコメントもあったので、番組名は伏せておきます)
なお、ツイートの取得に関しては、twitterのdeveloperアカウントも持っているのですが、アカウントを作っていない人でも雰囲気だけ試せるように、Htmlから中身を取ってくるコードを下に載せておきます。
(おそらく関数が英語のみ対応?なので、lang=enを明示しています)
% KEYWORDには好きな検索ワードを入れる
doc = webread('https://twitter.com/search?q=KEYWORD&src=typd&lang=en');
% paragraphタグの中身を抽出
doc2 = extractBetween(doc, "<p", "/p>");
% eraseTagsを使用するためにタグをつけ戻す
for ii=1:length(doc2)
doc3{ii} = ['<p' doc2{ii} '/p>'];
end
doc3 = doc3';
% HTMLタグの削除
doc4 = eraseTags(doc3);
% トークン化
documents = tokenizedDocument(doc4);
% センチメント分析
compoundScores = vaderSentimentScores(documents);
% ツイートとセンチメント分析スコアを横並びにして1つのテーブルにする
Scoretab = table(doc4 ,compoundScores);
以上の処理で、Scoretabという名前のテーブルの中に、ツイート(実際にはツイート以外の文も混ざっていますが・・)とスコアが横並びに格納されます。
で、Scoretabの中身を全部公開するにはちょっと激しい内容もあったので一部抜粋で・・
こんな感じの結果が出てきました。
・解説者は野蛮で、女の子は野蛮で、編集は野蛮である! スコア -0.9115
・言ってもいいですか、私は◎◎と△△が大好きです スコア 0.6369
スコア別にツイートをまとめたり、ソートしたりと、何かしら使い道がありそうですね。
もし、他にもっと良いセンチメント分析のお遊びの題材や、もっと良いコードの書き方などあれば教えてください。