協調フィルタリングです。
協調フィルタリングに関しては、「協調フィルタリングについてまとめてみた。」が詳しく書かれており参考になります。
データセットは、いつものようにwebビーコンのログです。
使用したコマンド
sed
awk
mcmd
など
実際のコマンド
もう少しクールに書けるような気がします。
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でコサイン類似度
となりました。
さいごに
各記事の下に表示出来たら楽しいなあ。