GoogleAnalyticsの流入キーワードをmecabで形態素解析して頻出単語をランキング
Googleのアナリティクスで検索エンジン等からのサイト流入キーワードが見れるけど
キーワードが一塊になっているので例えば
キーワード | 訪問数 |
---|---|
macbook | 10 |
macbook air | 5 |
macbook air ノートパソコン | 3 |
mac ノート | 5 |
mac pro | 1 |
windows8 pc | 5 |
windows8 ノートpc | 10 |
windows ノートパソコン | 5 |
みたいな感じになってたとして「mac」とか「ノート」みたいな単語の出現数も
取りたいと思ってmecabとgoogle analytics apiを使って試してみました。
処理はrubyで書いてます。
もしかしたらGAで普通に出来るのかもしれない、
けどmecab使ってなんかやりたかったのでよしとします。
手順
-
MacにMecabをインストールする
ここから以下のファイルをダウンロードする
- mecab-0.996.tar.gz (mecab本体)
- mecab-ipadic-2.7.0-20070801.tar.gz(IPA辞書:200Mぐらいある)
- mecab-ruby-0.996.tar.gz
DLしたファイルを任意のディレクトリに移動して以下のようにしてインストール
# mecab本体のインストール tar xvzf mecab-0.996.tar.gz cd mecab-0.996 ./configure make make install # 辞書のインストール tar xvzf mecab-ipadic-2.7.0-20070801.tar cd mecab-ipadic-2.7.0-20070801 ./configure --with-charset=utf8 make make install
-
mecabの実行
mecab <textfile>
もしくは以下のようにコマンドのみ入力し、その後にテキストを入力してもOK
mecab
分かち書きで出力(品詞の情報とか出さないで形態素で分割した結果のみ出力)
mecab -O wakati <textfile>
とりあえず動作確認できたので先ほどのキーワードリストをテキストファイルにして
mecabに読み込ませてみました。$ mecab -O wakati sample.txt macbook macbook air macbook air ノート パソコン mac ノート mac pro windows 8 pc windows 8 ノート pc windows ノート パソコン morikubonaoki-no-MacBook-Air:mecab_work morikubonaoki$ mecab sample.txt macbook 名詞,固有名詞,組織,*,*,*,* EOS macbook 名詞,固有名詞,組織,*,*,*,* air 名詞,一般,*,*,*,*,* EOS macbook 名詞,固有名詞,組織,*,*,*,* air 名詞,一般,*,*,*,*,* ノート 名詞,一般,*,*,*,*,ノート,ノート,ノート パソコン 名詞,一般,*,*,*,*,パソコン,パソコン,パソコン EOS mac 名詞,固有名詞,組織,*,*,*,* ノート 名詞,一般,*,*,*,*,ノート,ノート,ノート EOS mac 名詞,固有名詞,組織,*,*,*,* pro 名詞,一般,*,*,*,*,* EOS windows 名詞,一般,*,*,*,*,* 8 名詞,数,*,*,*,*,* pc 名詞,固有名詞,組織,*,*,*,* EOS windows 名詞,一般,*,*,*,*,* 8 名詞,数,*,*,*,*,* ノート 名詞,一般,*,*,*,*,ノート,ノート,ノート pc 名詞,固有名詞,組織,*,*,*,* EOS windows 名詞,固有名詞,組織,*,*,*,* ノート 名詞,一般,*,*,*,*,ノート,ノート,ノート パソコン 名詞,一般,*,*,*,*,パソコン,パソコン,パソコン EOS
分かち書きで出力するとこうなる
$ mecab -O wakati sample.txt macbook macbook air macbook air ノート パソコン mac ノート mac pro windows 8 pc windows 8 ノート pc windows ノート パソコン
それぞれの出現数をソートして出力してみる
mecab sample.txt | cut -f 1 | sort | uniq -c | sort -r -n 8 EOS 4 ノート 3 windows 3 macbook 2 パソコン 2 pc 2 mac 2 air 2 8 1 pro
とりあえず、ソレらしい感じで結果が取れそう。
-
Google Analytics API使用準備
OAuthの設定等必要なのでGoogle APIs Consoleで設定を行う
-
Google Analytics APIをrubyから使う
gemをインストールする
gem install google-api-client
-
mecab-rubyを導入する
上の方でDLした[mecab-ruby-0.996.tar.gz]を解凍してインストールする
tar xvzf mecab-ruby-0.996.tar.gz cd mecab-ruby-0.996 ruby extconf.rb make make install
インストールが出来たので同じディレクトリ内にあるtest.rbを実行してみる
ruby test.rb
エラーが出た
dyld: lazy symbol binding failed: Symbol .... xxxxx Expected in: flat namespace
extconf.rbを以下のように修正
$CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp $LDFLAGS = '-L/usr/local/lib' # この行を追加
再インストール
make clean ruby extconf.rb make make install
もう一度test.rbしたら成功した
公式のサンプルを参考に、こんな感じで流入キーワードを取得、
結果をmecabで形態素解析して出力# coding: utf-8 require 'google/api_client' require 'google/api_client/client_secrets' require 'google/api_client/auth/installed_app' require 'json' require 'MeCab' # 適当に名前とバージョン入れる(未設定だとエラーになる) client = Google::APIClient.new( :application_name => 'test', :application_version => '0.01' ) # ダウンロードした認証jsonファイルを[client_secrets.json]にリネームしておく(この関数で読み込まれる) client_secrets = Google::APIClient::ClientSecrets.load # ref https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization?hl=ja flow = Google::APIClient::InstalledAppFlow.new( :client_id => client_secrets.client_id, :client_secret => client_secrets.client_secret, :scope => 'https://www.googleapis.com/auth/analytics.readonly' ) client.authorization = flow.authorize analytics = client.discovered_api('analytics', 'v3') # 流入キーワードと各キーワードの流入数を取得する # ref https://developers.google.com/apis-explorer/#s/analytics/v3/analytics.data.ga.get result = client.execute( :api_method => analytics.data.ga.get, :parameters => { 'ids' => 'ga:xxxx', 'start-date' => '2013-01-01', # 分析したい開始年月日を指定 'end-date' => '2012-01-31', # 分析したい開始年月日を指定 'metrics' => 'ga:visits', 'dimensions' => 'ga:keyword', 'sort' => '-ga:visits' } ) # analytics apiの結果をjsonパース body = JSON.parse(result.response.body) opt = "-O wakati" data = body['rows'].map{ |r| r[0] }.join(" ") # mecabで形態素解析 c = MeCab::Tagger.new(opt) keywords = c.parse(data).split(/\s/).group_by{ |e| e } # 形態素解析の結果を{文字列:カウント}のハッシュにしてソートして出力 word_counts = keywords.inject({}){|a,(k, v)| a[k] = v.count; a} word_counts.sort{|(k1, v1), (k2, v2)| v2 <=> v1}.each do |r| p "#{r[0]} : #{r[1]}" end
他の値を取りたい場合はディメンションとメトリクスを変える必要があるので
その場合はこちらを参考に
まとめ
正直、今回の結果だけだとそんなに目新しい発見は無かったけど、
色々使いどころはありそうなのでもうちょっと別の素材でも試してみたい。