日々の「ハッ、そうなのか!」を書き留める職遊渾然blog

ログファイルの一部を切り取って頻出語を頻出順に30個表示する

»

現場百遍。サイトであれ経営であれ、生データを眺めることも現場仕事のうちである。
先日は、某企業のWebサイトで直帰率が高い状態を改善しようということになり、メンバーの方とログを眺めた。

人がどんな思いを言葉に載せて検索をし、サイトに来てくださっているか。これを目の当たりにすると、奮い立つ。よい結果が得られずサイトを離れていった方に、申し訳ないような気持ちになる。

問題はログの分析だ。Excelでかなり賄えるが、データ量が大きくなると難しい。定型的な分析ツールでは、カジュアルにあれこれ試せない。テキストファイルの扱いは、ときとして生産性や創造性を大きく左右(上下?)するなあと、ハッとした次第。

テキストファイルの扱いは、その出自からしてPerlが最も充実している(らしい)のだが、残念ながらPerlを学んでいない。

先日もそんなことがあった。*ListFreakで「先週検索されたタグを、多い順に30個並べ」て表示させようとしてみた。例えば、
-----
フレームワーク aaa
経営 bbb
フレームワーク ccc
目標 ddd
目標 eee
フレームワーク fff
-----

というログファイルから、下記のリストを得るということだ。

-----
フレームワーク
目標
経営
-----

まったくもって趣味の世界ではあるが、こういうスキルは経営分析にだって活かし得る。だから真面目に考えた。13,4年前に習い覚えたUNIXコマンドで30分くらい頑張って(もっと掛かったかも)、下記のようにした。

sort -k 1,1 <logfile> | uniq -c | sort -k 1,1 -r | head -n 30 | awk '{print $2}'
第一フィールドで並べ替え、
同じ語句の数をカウントした上で重複行を削除し、
そのカウント(出現頻度)の大きい順に並べ替え、
先頭の30行を取り出し、
カウントを除いて語句だけを表示。

僕が現在唯一まともに使える言語であるPHPで同じ事をするよりは、はるかにシンプルにできた(はず)。しかし、もっとエレガントなやり方があるんだろうな。

Comment(2)

コメント

kojiさんのやりたいことが「その場でぱっと確認したい」であれば、Perlよりawk/sort/uniqの方がいいと思いますよ。
kojiさんの出題を私も考えてみたのですが、結論はほぼ同じでした。
ただ、第二フィールドを最初に捨てないとuniqの結果が求めているものにならないと思います。あと、sort -k1,1はオプションなしのsortと同じ結果になります。

もしkojiさんの実現したいことがもう少し多角的視覚的に把握することなのであれば、Google Analyticsというログ解析サービスが断然お薦めです。
元々はUrchinという商用のログ解析ツールで仕事でよく利用していましたし、今は個人的にGoogleサービスを利用しています。

ほんのしおりさん、ありがとうございます!
> 第二フィールドを最初に捨てないとuniqの結果が求めているものにならないと思います。
あれ、そうですね。sortの件と併せ、以下のように修正。
awk '{print $1}' < [logfile] | sort | uniq -c | sort -r | head -n 30 | awk '{print $2}'
 
※ Google Analyticsは便利に使っています。ただ今回の場合、ユーザーがサイト内検索に使った言葉だけを溜めているカスタムログが対象なんです。また週1で上記のプログラムをcronで起動して、サイトコンテンツに変換しているので、コマンドラインで処理したかったのです。

コメントを投稿する