January 21, 2016

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

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

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

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

使用したコマンド

実際のコマンド

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


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でコサイン類似度

となりました。

さいごに

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

© gepuro 2013