IT

【ソースコード付き】Twitterのつぶやきを感情分析してみる その2

 

Advertisements

はじめに

日本語のテキストマイニングを、Facebook FastTextで実際にやってみるシリーズ第2弾。

第1弾では、教師データや評価対象データの準備まで行った。
今回はその続きを最後まで行い、Twitterのつぶやきの感情分析を行って、そのつぶやきが
ポジティブ なのか ネガティブ なのか、それを判定してみようと思う。

 

前提

第1弾と同じ内容を再掲する。

  1. 環境構築
    • Mecabやfasttextなどの導入手順
  2. 日本語の前処理
    • 形態素解析
    • テキストマイニングの精度向上させるコツ
    • それを実現するためのライブラリとその使い方
  3. 本記事で使用するコードは、全てここから取得可能

 

手順

以下のような順で実施する。

  1. twitterからデータを入手する
  2. 入手したデータの前処理
  3. 教師データの学習と学習モデル作成
  4. 評価対象データの分類
  5. 結果の可視化
  6. 結果の解釈

今回は 教師データの学習と学習モデル作成 からを述べる。

 

3. 教師データの学習と学習モデル作成

第1弾は2章までだったので、3章から再開する。

以下が、fasttextで分類を学習させるためのスクリプトlearning.py

 
以下のように、コマンドラインから、learning.pyを実行する。
すると、negaposi.bin という学習モデルが作成される。

 
教師データを作るとき、そのモデルに対しての適合率や再現率も、計算している。

観点内容
Precision適合率のこと。予測を正と判断した中で、答えも正のもの。
Recall再現率のこと。答えが正の中で、予測が正とされたもの。

 
Recallが1.0ということは、ポジティブとラベルしたデータはすべてポジティブに、
ネガティブとラベルしたデータはすべてネガティブに、分類しているようだ。
1.0だと、ちょっと過学習しているような気もするのだけど、とりあえずこのまま進める。

 

Advertisements

4. 評価対象データの分類

2.2節で、評価対象データの前処理は、すでに完了させてある。
その前処理の結果として、 w_[アカウント名].pkl のようなファイルが作成されているはずだ。
このファイルを読み込み、評価結果を出力させていく。

改めて、w_nikkei.pkl の中身がどんな内容となっているのか、確認しよう。
ただ、このpklファイル形式は、pythonのバイナリ保存形式である。
同じ中身が、plain textで拡張子tsvで出力されているので、これを確認する。

 
このようなデータを元にして、1行ごとに出力されているtweetデータの内容がポジティブなのかネガポジなのかを判定していく。


ここでは、positiveなら+1negativeなら-1となるようにする。
具体的には、positiveとnegativeに分類される確率を取得し、negativeの場合は、その確率の値の負を取る。

そのための処理を行うpython script、judgePositive.pyを作ったので、
この引数に、対象ファイル名と教師データを与えて、結果を得る。

以下のshell scriptで、一気に変換できる。

 
この処理の結果、result_w_[アカウント名].tsvresult_w_[アカウント名].pkl といった、
tsvファイルとpklファイルの2種類が出力される。

それでは、result_w_nikkei.tsv の中身を確認してみよう。

 
これだけみると、あまりポジティブとネガティブを判定できていないと、直感的に思える。。。。
教師データも少ないし、いくら前処理を頑張っても、限界があったのかもしれない。

そもそも、ポジティブ名言の内容で、

というものもあった。ここから、以下のような内容を判定するのは、そもそも無理があるのだろう。

これは、株が上がるってことで、誰しもが 「ポジティブ」 ととらえる文章だとう。
しかし、これがネガティブ判定されてしまっている。
これが、なぜそうなのか説明できないところが機械学習というか、なんというか。

 

5. 結果の可視化

5.1 結果の可視化方法

結果の可視化を行う。

twitterデータは、時系列情報のデータ。
そのため、文章から感情の時間変化を描画する ことが可能なはず。

また、この結果を複数のアカウントのつぶやきと比較することによって、
相対的にそのアカウントのつぶやきが、ポジティブなのかネガティブなのかを比較することができる。

visualizeResult.pyという、可視化のためのscriptも用意した。

このスクリプト中で、ポジティブとネガティブの半手度合いの数値は、週次/月次で集計したものを描画した。
そのまま描画すると、個々のつぶやきはポジティブだったりネガティブだったりして、
大きくバタつき、非常に見づらいグラフとなってしまうからだ。

 

5.2 個人的に知っている人達のアカウント

早速可視化した結果を見てみよう。
まず最初は、どこの誰かは明言しないが、個人的に知っている人達のアカウント。

 
アカウント名karen529mmの発言は、2017年5月ごとにテンションが上がっている。
何があったのかわからないが、きっとアゲアゲだったのだろう。

あと、いくつかのアカウントが、今年の4月以降なんだかざわついている。
いろいろと、心境の変化画ったりしたのだろうか。

 

5.3 アニメのセリフなどのbot

 
matsuoka_shuzoは、もちろん松岡修造氏のアカウントです。
この安定したポジティブ感wwwwww
ただ、このアカウントは公式だと思うのですが、動きを見ているとどうやらbotのようだ。

残り2つのアカウントは、エヴァのシンジ君(shinji0606_bot)と葛城ミサト(ayano0515)の
セリフbotなのだが、意外にネガティブじゃないのな。

botだと似たようなセリフをひたすら繰り返すため、内容が均質化されてしまい、
こういう可視化すると 面白くない

 

5.4 日経関連のアカウント

 
アカウントごとに発言量が違うので、それもあって期間の長さが違うが、
同じような記事の見出しのはずなのに、意外にバラける。

 

6.結果の考察

 

6.1 教師データの分類

教師データの評価で、Recallが1.0だったことに触れた。
これについても、あえて評価対象データとして可視化してみる。

 
* ポジティブ名言bot

 

  • ネがティブ名言bot

 
確かに、教師データとして、すべて意図通りに分類されているようだ。

 

6.2 その他

5.4節で 日経関連のアカウントを可視化した。

この時、nikkeiWOLnikkeistylenikkeivdata、の3つのアカウントが、
かなりポジティブ寄りの記事らしいことが分かった。

実際に、そのつぶやきの内容を見てみよう。

 

6.2 nikkeiWOL:日経ウーマンオンラインのアカウント

早速その中身。

うーん、ネガィテブと判定されている文章は、確かにそんな気がする。
が、ポジティブと判定されているものの中で、なんか違うなと思うものもあるが、
それは個人で考えや感性も違うだろうから・・・・・(逃


個人的には、以下のつぶやきがネガティブと判定されていることにちょっと笑えた。

記事の中身を読んでみると、その後に身を持ち崩した話とか出ていて、確かにネガティブ寄りの記事かな、感じた。

 

7.まとめ

2回に分けて、ソースコード付きで、機械学習によるTwitter投稿内容のネガポジ感情判定を行う手順を紹介した。
今どき、ライブラリもかなり増えてきたし、マシンパワーもかなりのものなので、気軽に機械学習できるようになった。

こういう時代になってくると、プログラミングはそこそこ出来れば十分。
それよりも、むしろその処理内容の数学的内容を理解して、結果の差異を考察できる能力のほうがよほど重要ですね。

もうこれは、理系だとか文系だとかは関係なく、

  • 統計的な数量をどう解釈すべきか
  • どういう時に、どういう手法を使うべきか

こうしたことに、一定の根拠を持ってアプローチできる人は、需要が高いでしょう。


今どき、AIによって人間の仕事がなくなるとかいうバズワードが流布しています。
そんなことは絶対なくて、単に上記のようなことができない人が、今までのように給料をもらえなくなるだけの話でしょう。

人間、一生勉強ですね。

それでは。

 

Advertisements

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

4 × four =