

最近、いろんな場面で利用されているテキストマイニング。大量の文章から有益な情報を抽出する手法として注目されています。今回はその中でも分かりやすく文章データに含まれる情報を整理し、可視化できる「WordCloud」を使って理系女子と文系女子の生態を比較してみたいと思います。
WordCloudとは?
WordCloudとは、文章中で出現頻度が高い単語を選んで、その頻度に応じた大きさで図示する手法のことです。
上記は、ウィキペディアの「激おこぷんぷん丸」のページの文章をWordCloudで可視化したものです。頻繁に登場している単語であればあるほど文字のサイズが大きくなっており、一目でその文章における重要な要素を把握することができます。
「激おこぷんぷん丸」という言葉は、2013年頃に流行した怒りの感情を表すギャル語で…という説明をしなくても、この図を見れば「怒り」「おこ」を「表現」した「言葉」であることや「インターネット上」や「Twitter」でよく使われている「ギャル語」であることがわかると思います。
このWordCloudを使って理系女子と文系女子の生態を比較していきたいと思います。
今回やったこと
使用言語:Python
1.TwitterAPIを使ってツイートデータを取得
2.形態素解析エンジンMeCabで単語に分解、名詞・動詞・形容詞を抽出
3.WordCloudで図示
理系女子と文系女子のツイートデータをGET
今回は、理系女子・文系女子それぞれ10人のTwitterアカウントからツイートデータをGETし、可視化してみます。
対象にしたTwitterアカウントは、筆者が所属していた大学の公式Twitterアカウントのフォロワーからプロフィールに書かれている学部学科名を手がかりに適当にピックアップしました。
ツイートデータは、“【Python】ネガポジ判定を使って次のデートの行き先を考えてみた”のときと同様にTwitterAPIを利用します。リクエストURLを特定のユーザのタイムラインを取得できる“https://api.twitter.com/1.1/statuses/user_timeline.json” に設定し、ユーザIDもしくはスクリーン名(@〜〜〜)をパラメータとしました。(*1)
url = 'https://api.twitter.com/1.1/statuses/user_timeline.json' res = session.get(url, params = {'screen_name':u'スクリーン名', 'count':200})
その後、形態素解析エンジン「MeCab」を用いて単語に分解し、名詞・動詞・形容詞を抽出しました。
# -*- coding: utf-8 -*- import MeCab fi = open("テキストファイル ",'r').read() fo = open("出力するテキストファイル",'w') m = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') keyword = m.parse(fi) words = [] for row in keyword.split("\n"): word = row.split("\t")[0] if word == "EOS": break else: pos = row.split("\t")[1].split(",")[0] if pos == "名詞": words.append(word) else: pos = row.split("\t")[1].split(",")[0] if pos == "形容詞": words.append(word) else: pos = row.split("\t")[1].split(",")[0] if pos == "動詞": words.append(word) w =','. join(words) keywords = w.replace(',',' ') print(keywords)
すると、以下のような感じの出力が得られます。
冒頭の「激おこぷんぷん丸」のテキストを単語に分解、名詞・動詞・形容詞を抽出
この単語データをWordCloudのライブラリに投入していきます。
WordCloudで図示する
WordCloudのライブラリは下記よりインストールすることができます。
https://github.com/amueller/word_cloud
あとは、めちゃくちゃ簡単です。
以下のように単語データを読み込んで、文字色・背景・図示する単語数・フォント・図の大きさなどを設定し図を生成します。後ほど少し紹介しますが、設定できるパラメータはこれら以外にも色々あるのでかなり自由自在に図示することができます。
from wordcloud import WordCloud #文字色を設定 def color_func(word, font_size, position, orientation, random_state, font_path): return '文字色' #単語データを読み込む with open("単語データのファイル ") as f: for words in f: #ストップワードを設定 stop_words = [除外したい単語(例 u'ある', u'こと', u'これ')] #背景の色、図示する単語数の最大値、フォント、図の大きさなどを設定して図示 wordcloud = WordCloud(background_color="背景の色", / color_func=color_func ,max_words=図示する単語数の最大値, / font_path="フォントのパスを設定 ",/ width=図の幅,height=図の高さ,/ stopwords=set(stop_words)).generate(words) #ファイルに保存 wordcloud.to_file("保存するファイル名")
実際に先ほど取得した理系女子と文系女子のツイートデータで生成した図がこちらです。
▼理系女子
▼文系女子
これらの単語がどのような文脈で使われていたのかはツイートデータを読んだわけではない(どちらも500KB以上あった)ので全くわかりませんが…
好きな人のことを理系女子は「時間」をかけて「思っ」てしまうタイプであるのに対し、文系女子はすぐに「好き」って「言っ」ちゃうタイプなのだろうか…という想像ができたりできなかったり。また、理系女子は「わたし」、文系女子は「みんな」という単語が目に入ることから理系女子は単独行動、文系女子は集団行動が多いのかな? とわかります。あとは、理系女子が行きたがり、文系女子が誕生日祝いがち…などということでしょうか。
適当に10人ずつピックアップした割には、意外と理系女子っぽさ、文系女子っぽさが表れていて面白かったです。
ちなみに、同様に工学部男子5名のツイートをWordCloudで図示してみたら、以下のようになりました。
…なるほど。工学部男子っぽい。
上の図は見やすさ重視で正方形にしましたが、好きな画像を使ってマスキングすることもできます。
girl_mask = np.array(Image.open('girl.png'))
上記のように画像ファイルを読み込んで、WordCloudのパラメータ部分に以下を追記します。
mask=girl_mask
先ほどの理系女子、文系女子のツイートデータを女の子のシルエットでマスキングすると次のようになります。
マスキングの仕方によっては情報の可視化にとどまらず、めちゃくちゃオシャレなグラフィックを作成することもできそうです。
まとめ
以上、WordCloudを使って理系女子と文系女子のツイートを可視化してみました。このようにビジュアルでテキストマイニングの結果を図示できるのはとても面白いと思いました。使い方やアレンジ次第では、単なるテキストマイニング以外にも応用できそうです。
今回はツイートデータの可視化を行いましたが、今後はもっといろんなテキストデータを可視化してみたいと思います。
参考URL
(*1)http://ailaby.com/twitter_api/

工学部女子大生とライターをしています。卒業研究で彼氏の浮気を防ぐためにSNS上で彼氏と彼氏のフォロワーの親密度推定に挑戦中。大学院では計量言語学を専攻予定。