Python
statistics
データ分析
テキストマイニング
可視化

今年一年のブログを一切読まずに雰囲気だけ把握する

先日話題になった松居一代さんの分析記事。めっちゃおもしろかった。。。。

あたまの中身を知りたくて・・・松居一代さんの代替品を作ってみた

 

「結婚」-「夫」が「イヤー」かあ。。。:dizzy_face:

でもよく考えると「結婚」+「夫」の要素は調べてないし、「人生」+「夫」とかなら、もしかしたらいいことも書いてるんじゃない?

 

だが一年分のブログなぞめんどくさくて読む気がしない:sleeping:

 

...というわけで、手抜きのためにいつもの可視化で遊んでみました。
今回は他人のトラブルが絡むネタなのでタイトルと記事は控えめです。
(分析結果を見て自重しました。)

ちなみに、私はニュースをほとんど見ないので、「どうも離婚騒動があったらしい」以上の知識がありません。
よって、分析結果から完全に手探りで内容を把握していく形になりました。

やること

  • 「人生」+「夫」のベクトルから人情味のあるいい話も書いていないか探ってみる
  • 約一年分書き溜めたブログを可視化して、読まずにブログの方向性やネタを把握する

手順

  1. 一年分の記事と「人生」、「夫」との関連度を計算する。
  2. 横軸:「人生の関連度」、縦軸:「夫の関連度」の散布図を作り、傾向を可視化する。
  3. 図から要点を読み取る。

下準備(関連度を計算する他)

冒頭のお手本リンクの説明が全てです。
今回は関連度の低いものも表示されるので、テキストのクリーニングを強化しました。

なおmacユーザは、mecabを使う際、utf-8に変換する処置が必要です。
mecabをutf-8設定にしてコンパイルする方法もあるそうです。

mecab -Owakati matsui_blog.txt -o matsui_data.txt
# 初期設定だと出力はeucになり、word2vecでバグる
# utf-8を入力しても分かち書きはうまくいった

nkf -w matsui_data.txt > matsui_data_utf8.txt

 

今回はすでに挙がっているトピック「人生」「夫」を切り口に使うわけですが、この切り口がどれだけ有効か一応アタリをつけようと思います。
(いい感じのキーワードなので、調べなくても大丈夫そうな感じはありますが。)

分布を見るとこんな感じ。(seabornのpairplot)

pairplot.png

「関連あり」「関連なし」で二極化しています。
読み取りやすそうな特徴があるので、この切り口で大丈夫そうです。
(と思っていましたが、あとで「関連なし」が若干怪しいことがわかります:sweat_smile:

一応、なんでもかんでも二極化しているわけではないことを確認しました。(pandasのhist)

perousa.png

重心付近に正規っぽい分布、という感じになっています。
なんでもかんでも二極化するわけではなく、「人生」「夫」という切り口を選んだ場合の特徴ですよと。

ちなみにこの怪しい「ぺろうさ」はあとで出てきます。
(※実をいうと、「ぺろうさ」は不要なワードだったのですが、必要ワードである「晴れ」や「ハイビスカス」も同様の分布になるのを確認しました。)

可視化する

散布図を書きます。重心で4象限に区切りました。

bunpu.png

作図用コードです。

import matplotlib.pyplot as plt
%matplotlib inline

# 図の設定
plt.figure(figsize=(30,30))
plt.rcParams["font.size"] = 15
plt.rcParams["font.family"] = "IPAPGothic"
plt.xlim([-0.25, 0.75])
plt.ylim([-0.25, 0.75])
plt.xlabel("人生", fontsize=30)
plt.ylabel("夫", fontsize=30)
plt.tick_params(labelsize=20)

# df_j_oは各種関連度を格納したデータフレーム
# カラム: ワード, 関連度_人生, 関連度_夫, 関連度_結婚, 人生+夫, 人生-夫, 人生+結婚, 人生-結婚
# 3列目まであれば図は描ける

# テキストをプロット
for key, row in df_j_o.iterrows():
    word, jinsei, otto, kekkon, add_otto, sub_otto, add_kekkon, sub_kekkon = row
    if word.isalnum() == False:
        continue
    if word.encode("utf-8").isalnum():
        continue
    plt.text(jinsei, otto, word)

# 重心で領域を分ける
mean_j = df_j_o["関連度_人生"].mean()
mean_o = df_j_o["関連度_夫"].mean()
plt.scatter(mean_j, mean_o, color="r", marker="x", s=750)
plt.plot([-0.25, 0.75], [mean_o, mean_o])
plt.plot([mean_j, mean_j], [-0.25, 0.75])

# 各領域にコメントを貼る
plt.rcParams["font.size"] = 50
plt.text(-0.2, -0.2, "リラックス")
plt.text(-0.2, 0.65, "夫個人")
plt.text(0.65, 0.65, "過去")
plt.text(0.65, -0.2, "未来")

ちょっと遠目からみるとこう。こっちは原点に目印をつけました。

ichi.png

Word2Vecの理解不足で、原点で区切るのが正しいかは自信がないのですが、原点で区切っていいとすれば、記事は全体的に「人生」と「夫」との関連度が高い書き方をされていると言えそうです。(原点云々を置いておいても、右上に寄っている傾向はありそうです。)

図からブログの要点を読み取る

では最初の図に戻って4象限の各エリアを時計回りに見ていきます。
図にあった通り、以下のように名前をつけました。

人生- 人生+
夫+ 夫個人 過去
夫- リラックス 未来

「過去」のエリアから分かること

  • 最果てに来るのが「ビジネス」「すべて」
  • 「夫」の濃度を上げていくと、「新聞」「ニュース」「報道」「生涯」「黙っ」「苦しい」「調べ」「反対」「費」など、不穏な感じやネガティブな感じが増す
  • 「ビジネス」「世の中」「最大」「アメリカ」など、意識高い系の主張演説ワードが少し多め、「人生」濃度を上げるほど「目標」「夢」「戦い」「先輩」など、さらに増える
  • 「夫」に対する具体的な攻撃ワードが見つからない
  • 「趣味」「グラム」が謎

「ビジネス」「すべて」
「ビジネス」については一瞬、「夫とはすべてビジネスの繋がりでした」みたいな想像をしてしまいましたが、「ビジネス」と「すべて」の繋がりがあるわけではないので、これはさすがに乱暴すぎですね。
ちょっとピンとこないので、「ビジネス」の関連語を探したところこんな感じ。

ワード 関連度
0 成功 0.842903
1 みなさま 0.835896
2 前夫 0.829527
3 政府 0.828620
4 0.828200

本当にビジネスの話なら、どうも何かやろうとしてるか、すでにやらかしたっぽい、という感じがしますね。。。
(信者作りや炎上商法の臭いがする)

「夫」成分の濃度を上げるとネガティブワードが増える
なるほどマスコミに騒ぎ立てられて、離婚騒動っぽいもめ方をしている感じが伺えます。
夫絡みの細かい話をするのではなく、マスコミの報道姿勢に総じて反対したり、マスコミ被害者としての自己主張をしている印象です。

「意識高い系ワード」が多い
外周に主張や演説に向けの語が頻出しており、ここでも過去のいざこざの話はありません。
過去の出来事は色々あったけど「それはさておき」という論調かもしれません。

「夫」に対する具体的な攻撃ワードが見つからない
ちょっと意外ですが、予備知識なしでは気づかないのかも。
(あるいは共起ネットワークを描いてみるとか)
あくまで今後の活動を意識したものであり、感情のまま書いているわけではないんでしょう。

「趣味」「グラム」
関連語を調べても全然ピンと来ず。
飛び出てるやつには何かわかりやすい理由がありそうなんだけどなあ。

趣味

ワード 関連度
0 進める 0.819662
1 支払い 0.807630
2 苦しい 0.807218
3 新聞 0.800029
4 暮れ 0.798162

グラム

ワード 関連度
0 苦しい 0.777102
1 試験 0.769170
2 昨年 0.763322
3 趣味 0.757795
4 誕生 0.751833

...まあこういう分析は、全てに意味を求めるのではなく、いくつかピンポイントで当たりが見つかったり、大意を掴めたり、という点に期待するべきかな、と思います。(逃げ腰)
そもそも図の解釈には人間の主観も入るので。

「夫」+「人生」のまとめ
報道姿勢に意見・反論をしたり、さておき自分は前進していますという主張をしています。
夫や関連事件とは「距離を置く方向で積極的に」関連付けしているように思えます。

というわけで、「人生」+「夫」に関する良い話題はなさそうでした。
調査目的は達成しましたが、結果は狙いと真逆な感じで残念。:sob:

 

あとは簡単に。

「未来」のエリアから分かること

  • 「よろしく」「はじまり」「朝」「明日」「嬉しい」「週末」
  • 大和言葉が多い

気持ちの切り替えや、共感を得るような意識がありそうです。

「リラックス」のエリアから分かること

  • 目立つ「ぺろうさぎ」「カナヘイ」
  • 「晴れ」「ルンルン」「爆笑」「大根」

結論を言うと、「ぺろうさぎ」他はクリーニングが甘くて別のブログのタイトルなどが混ざっていました。すみません。
(バグっぽかったので答え合わせしました。)
この辺りは不要データが多いので、重心はもっと「人生」+「夫」に寄るのが正しそうです。

それでもやはり、有効なキーワードにはリラックスムードのものが多いです。...大根?

「夫個人」のエリアから分かること

  • 予想はしてたけどとにかくキーワードが少ない
  • やたら目立つ「ハワイ」

ワードの量が少ないわけですが、わざわざ言及したくないというか、それ以前に夫個人に焦点を当てた話題には興味がないのかもしれません。

で、怪しいのが唐突すぎる「ハワイ」。またバグか...と思って調べたところ

hawaii.png

全然バグってなかった。:scream:

テキストマイニング強いなー。

まとめ

ブログを読まずに以下のように内容がつかめました。

ブログの要点

「人生」+「夫」(過去)について、なんかいいこともコメントしていたか
してない。
一連の出来事については、細かい議論はせず、距離を置く目的で関連付けをしています。
前夫への攻撃姿勢も目立たなかったので、回避や防御のために書いている印象を受けました。

「人生」-「夫」(未来)について、言いたそうなこと
これからの松居一代の勢いをアピールしています。
心機一転、まずは共感してくれる支援者がほしそう。

夫との関連が特に強い話題
スキャンダルを各種メディアのマスコミに攻撃されています。
おそらく報道姿勢に対する意見が中心で、個別のトピックはなし。
純粋に「夫」個人に着眼した話題については、触れない方針。

ブログの作成意図や全体的な主張
「人生」「夫」という観点には、強めの意図が見られます。大きく2つの要素に大別できます。

  • 一連の出来事の意見反論や今後について意識高く語る要素
  • 内面的または外面的なバランスを取るためにリラックスムードを作る要素

(ただし後者は処理ミスの影響があり、程度が怪しい)

要点やネタの掘り方について
各エリアの端っこを見ると、各エリアのテーマに対する基本スタンスが読み取れました。
また、濃いトピック「ハワイ」が浮き彫りになりました。

各エリアのベクトル要素が強い領域から、共感なり攻撃なりの「刺さるネタ」が探せます。
(ゴシップ誌のインタビューネタ生成器とか、しょぼいチャットボットあたりに使えそう。)
各ベクトルにどんな解釈を与えるかがポイントになると思います。

総合的な印象
なんだか選挙活動みたい。

おまけ:松居一代さんと仲良しになる作戦

ここまでの分析結果からお近づきになるときの作戦を考えてみました。

  • ビジネスについて興味がある体なので、意識高い感じの話題を撒いて出方を見る
  • 「すべて」「最大」「アメリカ」などを使って雰囲気重視でいってみる
  • ここからが始まり!という意気込みに同調する、先手を打つ勢いで行く(最重要)
  • 「よろしく」「ここから」「はじまり」を連打、朝や週末の話題を振るのも印象良さげ
  • スキャンダル系は触れないか、「苦しい」などの切り口からの自然発展に止める
  • もし話してきたら各論には踏み込まず苦労やマスコミの迷惑についてのみ深く同調する
  • 前夫の話は一切なくてよい
  • 閑話休題したいときは、、、ちょっと調査不足(大根?)

一般論も多いけど、手がかりなしよりはだいぶ良いのではないでしょうか。
ただしブログはあくまで芸能人としてのコメントだということ、あくまで「人生」「夫」という軸で見た結果であることも踏まえたほうが良さそうです。(=もっと他にもネタはある)
 

メモ

  • 「人生」+「夫」という切り口を見つけるところからやってみたほうがよさげ
  • クリーニングの質が悪いと全体に影響する
  • ...とはいえ粗くても役には立つので、適度がよい。トレードオフ。というかQiita民は自動化して当たり前
  • 最初はX軸:「人生」+「夫」、Y軸:「人生」-「夫」の合成ベクトルで作図したのですが、意味がないことに気づき、今の図にしました。(なんとなくDematel法を想像していたけど、状況が全然違った。)
  • 「グラム」もバグっぽく見えたので答え合わせしたのですが、少なくともバグではなさそうだけど、右上にくる理由はわかりませんでした。