Pythonのmatplotlibとかで詳しく考える

経緯

俺もデータサイエンティストやってみます - 自由研究をします。

昨日、適当に散布図を作って遊んでたけど今回はちゃんと考えていく。

書いた

import matplotlib.pyplot as plt
import json
 
json_open = open('./analysed_netnewsdata.json', 'r')
json_load = json.load(json_open)
analysed_news_data_array = json_load['analysed_data']
 
# figureを生成する
fig = plt.figure()
 
# axをfigureに設定する
ax = fig.add_subplot(1, 1, 1)
 
# axesに散布図を設定する
for index, analysed_result in enumerate(analysed_news_data_array):
  ax.scatter(x=len(analysed_result["text"]), y=analysed_result["documentSentiment"]["magnitude"], c='b', s=1)
 
# 表示する
plt.savefig("textlength_magnitude_graph.jpg")

前回書いたmatplotlibを使ったコードとほぼ同じ。点を配置する時にメソッドに渡す値を配列型のデータ群じゃなくてひとつひとつ値をforで回して渡すようにしてる。 今回見たかったのは解析した記事のテキストの量とGoogleNaturalLanguageの感情分析で出たmagnitudeの値の関係です。

出た散布図

f:id:ten0313:20200924012144j:plain

(magnitudeが50とか出てるものとか極端に大きな記事は外している)

横軸が記事の文章の文字数 縦軸がmagnitudeの値

もっと直線的に表示されるかなって思ったけど割とバラけてて正直ビックリした。ちゃんと感情分析してスコアを出してるんだな (あたりまえだけど) もちろん大きい記事になるにつれmagnitudeの値が大きくなってる。(Googleのドキュメントにも「長いテキスト ブロックで値が高くなる傾向があります。」ってある)

読んでみる

f:id:ten0313:20200924014752j:plain

なんかここに筋っぽいのが見える。赤くマーカーしたところ。要はこの横線の値である文章量の記事が多いっていえるんだと思う。この場合だったら600文字と800文字と1000文字。でもコレは文春オンラインにある記事がそうってだけで知りたいこととはなんの関係もない。

なんでかっていうと今回、最終的に知りたいのはTwitterでの投稿の際に感情がそんなもんだったらバズりに繋るか(人の目を引きやすいか)なので140文字の制限があるTwitterで何百文字もの記事と相関をつけようったって無理な話。今回は大衆誌の記事文をモデルに進めてるけど、もしそれらが「200文字だったらmagnitudeが10なのが良いかんじで、500文字だったら30くらいなのがちょべりぐだよ」みたいな結果を出しててもそれをそのまま140文字に当てはめてもなあ...ってかんじ(200文字でmagnitudeが10なのが良いんだったらTwitterなら8くらいがいいのかなあとかも違う気がするし(だってモデルの記事達とTwitterの投稿文の量の差異があまりにもありすぎる。これがTwitterの文字数が平均的に300とかだったら今出てる結果でよかったと思う))。だからさっき出したグラフで得れた有効そうな情報は割とちゃんとバラけてることから「ちゃんと感情の大きさを見てくれてるっぽい」ってことと「文字量と感情のデカさはやっぱり関係あるっぽい」ってこと。

んで

じゃあこのクソデカ記事達とTwitterに投稿されてる文章をどうやってひもづけるか、なんだけど 「記事の中身を文で分けてその文の数との関係性を見てみる」でやってみる。

書いた。

tweet-test-bot/analyse_newsdata_sepalate.py at master · iinoten/tweet-test-bot · GitHub

もうプログラムのコードそのまま記述するのやめよかな。めんどくさ

内容としては前回書いた分析の結果をjsonの配列に収める際に文毎の分析結果も配列化しておしこむようにしただけのもの。一部が二次元配列みたいになってるからめちゃくちゃネストされて合計4万3千行とかのファイルになっちゃってる。

jsonファイルはコレ↓

https://raw.githubusercontent.com/iinoten/tweet-test-bot/master/analysed_data/analysed_data_sepalate.json

んで

さっきのとこまでを書いたのが2時間くらい前で、行ごとにいろいろ出すコードを書いてた。でも今ふと思ったけど文で分けてどうするつもりだったんだろう。文の数と記事全体の長さってそれこそ比例して多くなっていくしTwitterの短文にはどうしてもあてはまらない。どうしよう。

とりあえず書いちゃったから文ごとのscoreを散布図におこそうとしてみる。

こうなった

ウーン

f:id:ten0313:20200924050805j:plain

10分くらいで出力された。「そこまで大きく感情を表わす文はないのんな~」「割とポジティブな文もネガティブな文も平等にあるのんな~」くらいしかわからない。最後の気付きは重要かも。そこからヒントを得て、明日はひとつの記事内から感情の変動をみるってことをしてみよっかな

夜中に作業は効率よくないかも