PythonとMeCabによるツイートの単純分析(その2)
Twitterの分析で興味を持った文献がありました。
CiNii Articles - E-003 Extraction of Associative Relations Based on Connective Expression on Tweets
こちらの文献では「のくせに」という接続表現を検索し
「○○のくせに××」という関係から「○○」と「××」が対立する連想関係を抽出しているようです。
すこし興味を持ったので、やってみました。
環境、MeCabのインストール、Twitterのデータ収集は前回の記事と同様です。
PythonとMeCabによるツイートの単純抽出 - とあるSEの手順書
スクリプト
取り急ぎ、ダウンロードした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(南瓜)による構文解析も行っているみたいですね。
この辺りも、折を見て触れたいと思います。
ひとまずでした。
PythonとMeCabによるツイートの単純分析
今回は、Pythonと形態素解析エンジンのMeCabをつかってTwitterに投稿されているツイートから
特定の単語と同時に登場する名詞を抽出し、頻出度を調べてみようと思います。
MeCabのインストール
公式サイトからダウンロードしてインストールで完了です。
辞書は、UTF-8が無難とのこと。
ただコマンドプロンプトの表面では文字化けするようです。
公式サイト
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
インストールの参考にしたサイト
64bit Windows + python 2.7 + MeCab 0.996 な環境をつくる - Qiita
Windows+Python環境でMeCabを動かす際に、Visual Studioで再ビルドしたり
MeCabのライブラリをセットアップが必要です。
はやく動くものが見たい*1がために、
Pythonスクリプト内で、SubprocessコールでMeCabを実行しファイルを食わせて吐き出すことにしました。
Twitterのデータ収集
TwitterのAPIで取得することができますし、収集アプリもあります。
私は下記のサイトからcsvでダウンロードしました。
UTF-8でダウンロードできるのが親切です。
1500ったー
http://membonia.com/1500ttr/
スクリプト
取り急ぎ、ダウンロードしたcsvを読込、MeCabを実行して、形態素を取得、名詞だけを抽出するまでの
一連のスクリプトを書いてみました。
pandasはCSVを読み込んだり、フィルタをかけたりとデータ操作に便利なライブラリです。
import subprocess import pandas as pd import codecs import re # CSVファイル読込 datas = pd.read_csv("1500ttr.csv" , header=None) 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を出力しない、 >> で追記 cmd = "\"C:\\Program Files (x86)\\MeCab\\bin\\mecab.exe\" < in_mecab.txt >> out_mecab.txt -E \"\" " subprocess.call(cmd , shell=True) # 出力結果を読込 wordlist = pd.read_csv("out_mecab.txt" , header=None , delimiter="\t") # 一般名詞だけ抽出 MeCabの形態素解析結果に品詞が記載されている nounlist = wordlist[wordlist[1].str.contains("名詞,一般")] # 名詞のカウントをする pd.DataFrame(nounlist[0].value_counts(), columns=["COUNT"])
少し補足すると、MeCab実行の際につけている
-E \"\" "
このオプションは、通常、MeCabの出力結果にはEOS(end of string)が末尾に出力されます。
今回は「>>」で指定のファイルに追記し、一つの一覧にしたいため、つけました。
結果
順位 | 名詞 | 個数 |
---|---|---|
1 | 私 | 299 |
2 | 魔法 | 244 |
3 | 少女 | 214 |
4 | むら | 211 |
5 | あたし | 116 |
6 | 何 | 110 |
7 | それ | 100 |
8 | マギカ | 99 |
9 | 杏子 | 81 |
10 | ゾンビ | 80 |
1位、5位の「私」「あたし」は「あたしって、ほんとバカ」のセリフの影響でしょうか。
2位、3位の「魔法」「少女」は、そのままですね。
4位の「むら」は最初わからなかったですが「暁美ほむら*3」の「むら」が形態素になっているようです。*4
10位の「ゾンビ」もキャラのセリフですね。
「鹿目まどか*5」でもしてみましたが、「少女」「魔法」「マギカ」「フィギュア」「マギ」などで
特徴的な単語が上位にはありませんでした。
単純なので、このあたりの改善もすれば、もっと面白い抽出ができるかもしれませんね。
ひとまずでした。
*1:処理速度的には、きちんとライブラリのセットアップしたほうが良いと思います。
*2:魔法少女まどか☆マギカのキャラクター、魔法少女の一人。
*3:魔法少女まどか☆マギカのキャラクター、魔法少女の一人。
*4:こういう場合でもMeCabでチューニングできるようです。
*5:魔法少女まどか☆マギカのキャラクター、名の通り魔法少女で主人公。「まどか」で変換したら「まどか☆マギカ」が出てきて驚き。