とあるSEの手順書

個人的な技術メモです。無保証ですが参考になりましたら幸いです。

PythonとMeCabによるツイートの単純分析(その2)

Twitterの分析で興味を持った文献がありました。

CiNii Articles -  E-003 Extraction of Associative Relations Based on Connective Expression on Tweets

こちらの文献では「のくせに」という接続表現を検索し
「○○のくせに××」という関係から「○○」と「××」が対立する連想関係を抽出しているようです。

すこし興味を持ったので、やってみました。
環境、MeCabのインストール、Twitterのデータ収集は前回の記事と同様です。
PythonとMeCabによるツイートの単純抽出 - とあるSEの手順書

手順

  1. Twitterから「のくせに」の単語を含むツイートを取得
  2. MeCab分かち書きに変換
  3. 「のくせに」の前後の単語を抽出

スクリプト

取り急ぎ、ダウンロードしたcsvを読込、MeCabを実行して、分かち書きにして、「のくせに」の前後を
抽出する一連のスクリプトを書いてみました。

import subprocess
import pandas as pd
import codecs
import re

datas = pd.read_csv("1500ttr.csv" , header=None)
# 「のくせに」を含むもののみ抽出 (検索でなぜか「のくせに」以外が混じってた。)
datas = datas[datas[5].str.contains("のくせに")]

# CSV読込
for key, row in datas.iterrows():
    # Mecab用に出力
    fout =codecs.open("in_mecab.txt", "w" , "utf-8")
    # 5列目にツイート本文
    tw = str(row[5])
    # 英数字を消し、日本語のみに
    tw = re.sub("[^ぁ-んァ-ンー一-龠]", "", tw);
    # Mecabに食わせるファイルを出力    
    fout.writelines(tw)
    fout.close()
    
    # Mecab実行 -E でEOFを出力しない、 >> で追記 -Owakatiで分かち書き
    cmd = "\"C:\\Program Files (x86)\\MeCab\\bin\\mecab.exe\" < in_mecab.txt >> out_mecab.txt -E \"\" -Owakati"
    #cmd = "mecab < in_mecab.txt > out_mecab.txt"
    subprocess.call(cmd , shell=True)

# 出力結果を読み込む
f = codecs.open("out_mecab.txt" , "r" , "utf-8")
lines = f.readlines()

# 「○○のくせに××」の○○をsrcに××をdstに格納する
kuseni_list = pd.DataFrame(columns=["src" , "dst"])

# 1行づつ処理
for line in lines :
    # 「のくせに」まで形態素が分割されているのでとりあえず一つに
    line = line.replace("の くせ に", "のくせに")
    # 分かち書きを分割
    words = line.split(" ") 
    #「そのくせに」とかもあるので、「のくせに」だけで抽出
    if("のくせに" in words) :
        # 「のくせに」のインデックスを求め、その前後をみる
        i = words.index("のくせに")
        # インデックスを超えていないか、「のくせに改行コード」の場合スルー(jupyterの場合エスケープらいない??)
        if((i-1 >= 0) & (len(words) > i+1)) & (words[i+1] != "\r\n") :
            df = pd.DataFrame([[words[i-1], words[i+1]]], columns=["src" , "dst"])
            kuseni_list = kuseni_list.append(df , ignore_index=True)

# カウントする
pd.DataFrame(kuseni_list["src"].value_counts())
pd.DataFrame(kuseni_list["dst"].value_counts())

結果

「○○のくせに××」の「○○」の個所に含まれる単語TOP10

順位 単語 個数
1 だけ 122
2 24
3 19
4 ヒットアンドアウェー 15
5 ブス 13
6 デブ 12
7 くらい 11
8 ドラマ 9
9 8
10 8

「○○のくせに××」の「××」の個所に含まれる単語TOP10

順位 単語 個数
1 119
2 あんな 20
3 生意気 19
4 17
5 ヒットアンドアウェー 15
6 なんで 14
7 犯罪 11
8 9
9 半分 8
10 7

うーん、広告や報道などのバイアスが結構強く出てそうです。
また、リツイートによる同文が複数入っている影響もありますね。
リツイートを排除し、ユニーク文のデータ数を多くすれば、このあたりの誤差が隠れて面白い結果が
出るかもしれません。(前回の分析も・・ですね。)

参考にした論文では、CaboCha(南瓜)による構文解析も行っているみたいですね。
この辺りも、折を見て触れたいと思います。

ひとまずでした。