gepuro.net
gepulog

データ分析エンジニアによる備忘録的ブログ

シェルスクリプトでアクセスログを用いてページ間の類似度を求める

協調フィルタリングです。

協調フィルタリングに関しては、「協調フィルタリングについてまとめてみた。」が詳しく書かれており参考になります。

データセットは、いつものようにwebビーコンのログです。

使用したコマンド

  • jq
  • q
  • sed
  • awk
  • mcmd
  • http://datascienceatthecommandline.com/
  • など

実際のコマンド

もう少しクールに書けるような気がします。

cat data/* |  # jsonからデータを取り出してcid, urlのデータを得る
jq -c -r 'select(.site=="blog.gepuro.net")| [.cid, .url] | @csv' |
sed -e 's/\?.*"$/"/' |
grep "http://blog.gepuro.net/archives/" |
sed -e 's/http\:\/\/blog\.gepuro\.net\/archives\///' |
header -a '"cid","url"' | # cidごとにurlのビューをカウントして横持ちにする
q -H -O -d ',' "
select cid, url, count(1) as view
from -
group by cid, url
" |
mcross k=cid f=view s=url v=0 |
cat > tmp/cross.csv

cat tmp/cross.csv | # urlごとのコサイン類似度を求める
msim -d c=cosine f=$(head -n1 tmp/cross.csv | cut -c 11-) |
q -H -O -d ',' '
select fld1, fld2, cosine
from -
where fld1 != fld2
order by fld1, cosine desc

' | # urlごとに上位5件を取得する
sed -e 's/,/ /g' |
body rank ref=1 |
sed -e 's/fld1 fld2 cosine/rank fld1 fld2 cosine/' |
sed -e 's/ /,/g' |
q -H -O -d ',' '
select fld1,fld2 from -
where rank <= 5
' |
mtra k=fld1 f=fld2 | # url,類似記事一覧 というデータの持ち方をする
sed -e 's/fld1%0/fld1/' |
csvjson  # パースしやすいようにjson形式にする

結果

ハードディスクの寿命分布を比較 という記事に対しての結果を見てみます。

アクセスログを使った場合(メモリベース, コサイン類似度)

コンテンツベース, BoWでコサイン類似度

となりました。

さいごに

各記事の下に表示出来たら楽しいなあ。


似てる記事

似てない記事