読者です 読者をやめる 読者になる 読者になる

小さなエンドウ豆

まだまだいろいろ勉強中

ワードクラウドで自己分析

絶賛就職活動中。

こんにちは、就職活動まっただ中でございます。今日は自己分析のために自分のツイートを分析してみた。
ただMeCabとか使って単語をカウントするだけだと見栄えが悪いのでワードクラウドにしてみることにした。

ワードクラウドとは

ワードクラウドとは…単語のカウント数に応じて文字の大きさが変化し,いろんな方向に表示されたデザイン。
f:id:h-piiice16:20160218224644p:plain

まあこんなヤツのことをいいます。というよりこれが分析結果。
何故か地名が多い…思考がばれるw

データの作成(単語のカウント)

全ツイートの取得はTwitterのアカウントの設定からcsvファイルでダウンロードできた。
データの作成はPythonで行った。csvファイルにcount(単語のカウント数)とword(単語)の1組で並ぶフォーマットにしたかった。

count,word
51,岡山
40,熊本
35,日本
34,ユナイテッド
31,東京

そのために書いたPythonスクリプトがこちら

#coding: utf-8

import MeCab
import pandas as pd
import re

def parse_tweet(text, words):
        mt = MeCab.Tagger ("-Ochasen")
        res = mt.parseToNode(text)

        pattern = re.compile("[!-/:-@≠\[-`{-~]")
        pattern2 = re.compile("[!-~]")

        while res:
                if res.feature.split(",")[1] == u"固有名詞".encode("utf-8"):
                        if not(pattern2.search(res.surface)):
                                words.append(res.surface)
                res = res.next

if __name__ == "__main__":
        data = pd.read_csv("tweets.csv")
        texts = data.text
        words = []
        texts = texts.values
        for text in texts:
                parse_tweet(text, words)

        count = []
        word = list(set(words))
        for w in word:
                c = words.count(w)
                count.append(c)

        df = pd.DataFrame({'word' : word,
                           'count': count})
        df = df.sort('count', ascending=False)
        df.to_csv('wc_result.csv', index=False)

結果をwc_result.csvというファイルに書きだした。

d3-cloud

D3.jsとd3-cloudというワードクラウドプラグインを使ってワードクラウドを作成。 カウントした結果をSVGに描画するwordcloud.jsを書いていく。

d3.csv("wc_result.csv", function(data){
        var h = 800;
        var w = 800;
        data = data.splice(0, 200);

        var random = d3.random.irwinHall(2)

        var countMax = d3.max(data, function(d){ return d.count} );
        var sizeScale = d3.scale.linear().domain([0, countMax]).range([10, 100])
        var colorScale = d3.scale.category20();

        var words = data.map(function(d) {
                return {
                text: d.word,
                size: sizeScale(d.count)
                };
        });

        d3.layout.cloud().size([w, h])
                .words(words)
                .rotate(function() { return Math.round(1-random())*90; })
                .font("Impact")
                .fontSize(function(d) { return d.size; })
                .on("end", draw)
                .start();

        function draw(words) {
                d3.select("svg")
                .attr({
                        "width": w,
                        "height": h
                })
                .append("g")
                .attr("transform", "translate(150,150)")
                .selectAll("text")
                .data(words)
                .enter()
                .append("text")
                .style({
                        "font-family": "Impact",
                        "font-size":function(d) { return d.size + "px"; },
                        "fill": function(d, i) { return colorScale(i); }
                })
                .attr({
                        "text-anchor":"middle",
                        "transform": function(d) {
                                return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
                        }
                })
                .text(function(d) { return d.text; })
                .on("click", function(d, i){
                        var url = "http://www.google.co.jp/search?q=" + d.text
                        window.open(url, "_blank");[f:id:h-piiice16:20160218224644p:plain]
                });

        }

});

【D3.js】「全ツイート履歴」からWord cloudを作ってみた。スクリプトを参考にさせてもらいました。 またワード一つ一つにgoogleでの検索結果のリンクを付随してみた。

このデザイン好きなのでまた機会があったら使ってみたいと思った!