2010年05月18日
2010年05月15日
erockrにレコメンド機能を追加しました
erockr, erockr携帯版, レコメンド機能 | |
予告より早く、erockrにレコメンド機能を追加しました。
●●を見た人は、このページも見ています、ってやつですね!
携帯版、PC版ともに本日導入しました。
仕組み
全ての組み合わせでは20万通りほどの計算が必要だが、今の所まだ3万通りしか計算できていない。
CRONじゃ遅すぎる*1ので、初回の計算は自分のPCからcurlでサーバ上のプログラムにやってもらうことにした。
ちなみに名前付近の数字はおすすめ度です。高いものほどおすすめです!
おすすめ度は、今のところjaccard係数の1000倍から10を引いた値です。
サイトマップを送信してインデックスを激増させる方法のまとめ
SEO | |
ページ数の多いサイトを運営していると気になるのがインデックス数。僕もerocrというサイトを運営していまして、無限増殖型サイトなので、特に気になるところ。
検索エンジンに「site:erockr.com」と入れてでてくる件数がインデックス数。実際にはこの数字には誤差があるらしいが、おそらく本当のインデックス数と比例するだろうし、参考になる数字だとは思う。
先日erocrのサイトマップについて、いくつか対策を施したところ、インデックス数は3-5倍に増え*2、Google検索結果ではサイトリンク*3も付与された。
そこで、ただしいサイトマップの作り方と送信法をまとめておく。
必ずインデックス数が増えるというものではなくて、僕の場合はこれでうまくいきました、というメモです。
間違いなどがあったらごめんなさい。
1.サイトマップを作る。
サイトマップはただのxmlファイルなので、メモ帳でもプログラムからでも簡単につくれる。
以下のような感じ。
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>http://erockr.com/about</loc></url> <url><loc>http://erockr.com/ad</loc></url> <url><loc>http://erockr.com/list/ranking/1</loc></url> ... </urlset>
priority、changefreq、lastmodといったタグを含めることもできるが、必須ではない。正しく指定できないなら設定しない方がましだと思う。
PC向けのページと携帯版のサイトマップは別のファイルにする。
携帯版は以下の通り。
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"> <url><loc>http://erockr.com/m/</loc><mobile:mobile /></url> <url><loc>http://erockr.com/m/about</loc><mobile:mobile /></url> <url><loc>http://erockr.com/m/list/ranking/1</loc><mobile:mobile /></url> ... </urlset>
これはGoogle用のもの。
書き方は以下参照。
モバイル サイトマップの作成 - ウェブマスター ツール ヘルプ
日本のYahoo!(Softbank標準)は、YSTとは別なので注意。そして日本のYahoo!ではモバイル用サイトマップだからといって拡張はないようだ。
2.ウェブマスターツールからサイトマップを登録
以下からそれぞれ登録。
bingはお好みでw
この時サイトマップを登録するサイトのドメイン以下にある必要があり、サイトマップがあるディレクトリより上位のページは登録できない。
例えば、サイトマップは「http://example.com/d1/sitemap.xml」にある場合は、「http://example.com/page.htm」は登録できない。この場合はルートに置く必要がある。
3.robots.txtにサイトマップの在処を書いておく。
ここにも書いておけば完璧。
Sitemap: http://erockr.com/sitemap_pc.xml
Sitemap: http://erockr.com/sitemap_m.xml
こんな感じでよい。
サイトマップをプログラムで生成していてURL末尾がphpで気持ち悪いと思う場合は.htaccessに以下のような記述を追加すればよい。
実際erockrでもそうしているが、SEO的な意味はなさそう。これは精神衛生上の問題ですねw
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
4.以後、サイトマップを更新したら検索エンジンに通知する
2.のツールからでもよいけど、直接GETのクエリで通知する方法もある。以下参照。
サイトマップの作成と送信 - ウェブマスター ツール ヘルプ
参考
サイトマップの整備でインデックス数急上昇!
検索エンジンから見たerockr, erockr | |
site:erockr.com
03/17 | 03/19 | 03/20 | 03/23 | 03/27 | 03/30 | 04/04 | 04/08 | 04/18 | 04/28 | 05/07 | 05/12 | 05/15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
296 | 804 | 690 | 1010 | 1300 | 2700 | 5010 | 5600 | 2050 | 3230 | 5560 | 15700 | 18900 | |
Yahoo! | 1 | 41 | 40 | 75 | 210 | 355 | 383 | 451 | 482 | 429 | 1380 | 1390 | 2670 |
Bing | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 5 |
Baidu | 100 | 102 | 102 | 103 | 103 | 105 | 127 | 124 | 7 | 3 | 9 | 9 | 3490 |
実はこの一週間ほどで、サイトマップ(sitemap.xml)をちゃんと整備したのだった。
詳細は別のエントリにまとめておく。
erockrにレコメンド機能をつけるための38時間の計算開始!
さて、昨日、おとといの実験で、割とうまくレコメンドされることがわかった!
そこで早速erockr登録キーワードの類似度を計算することにした。
erockr登録キーワードは全部で630件あるので、組み合わせの総数は198,135通りもある。
ここで僕の書いたSQL文たど、1つの組み合わせの計算に約0.7秒ほどかかる。
ということは、全部計算するのに38時間かかるorz
うぇー!
とりあえず、ランキングの上位100件の分の表を優先課題ということにして、バッチ処理するPHPプログラム書いてcronで回すことにしてみます。
3,4日でデータの計算が終わるでしょう!
最初1件だけ処理するPHPプログラムをおいて、ターミナルからシェルスクリプトでアクセスする方法とっていたら、coreserverのDNSサーバーに弾かれるようになってしまったので、やっぱ上の方法に変更した。
そっちの方が効率よさそう。
というわけで、来週末ぐらいに「このページを見た人はこのページも見ています」機能をリリースします!
*1:coreserverだと1時間に1回、3分しか動かせない
2010年05月14日
jaccard係数によるerockr検索キーワードの分析
昨日やったtanimoto係数によるerockrの検索キーワード間の類似度の計算の続き。
昨日はjaccard係数よりtanimoto係数のほうが名前に親近感がもてるとかいって、tanimoto係数がいいとか言ったが、jaccard係数の方が得られる数値がイメージしやすい。jaccard係数は「和集合に対する積集合の割合」で表されるものなので、頭にベン図が思い浮かぶ。
さて、早速jaccard係数でerockrの表示ランキング上位20位間の類似度を考えてみた。
結果
種類の違う「エロ」
まず際立って目立つのが「エロ」だ。
全ての組み合わせで類似度が低いという評価が出ている。「エロ」だけは人間の名前ではなく、少し種類の違うデータなのでこれは妥当だろう。
類似度の高い組が多いアイテム
新垣結衣、佐々木希、上戸彩、南明奈、長澤まさみ、深田恭子、ほしのあき
これらは知名度も高く、万人受けする人たちのようだ。浅く広くまんべんなく多くのユーザに見られている。
類似度の低い組が多いアイテム
堀北真希以外は、知名度が低く、かなり排他的な傾向が強い。
特に篠崎愛はひどいw
得られたデータのうち、使えそうなデータ
アイテム | 類似度の高いアイテム | 考察もどき |
---|---|---|
堀井美月 | 篠崎愛、川村ゆきえ、仲村みゆ | ロリ巨乳系 |
篠崎愛 | 堀井美月 | ロリ巨乳系 |
安めぐみ | 井上和香、磯山さやか、深田恭子 | なんか同じ香りの人たちw |
蒼井優 | 綾瀬はるか、小阪由佳、広末涼子、深田恭子 | 清純派? |
結論
この方法はロリ巨乳系の人たちの類似アイテムを探すのに向いているw
類似度の分布
Rで、erockrの検索キーワード上位20件の類似度(jaccard係数)の分布をステムアンドリーフで書いてみたところ、以下の通り。
4 | 22356666788999 |
5 | 0011222234444455666678888889999 |
6 | 0000001111111122333333333444455556666666777777777788899999999 |
7 | 00000111111111111222222222233334444445555555556666667777777777777888888889999999 |
8 | 00000011111111111111122222222223333333334444445555555666666666777777777777888888889999999999 |
9 | 00000000111111111111122222222223333333334444444555555666666666777778889999 |
10 | 000111112222223333444455566666777777777778888999999 |
11 | 001222233344445688899 |
12 | 1134669 |
13 | 99 |
14 | 4 |
15 | 2 |
summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.04246 0.07064 0.08315 0.08362 0.09519 0.15270
2010年05月13日
tanimoto係数によるerockrの検索キーワード間の類似度の計算
amazonのレコメンデーションシステムのような、大量に蓄積したユーザが表示したり購入したデータから、ユーザの行動の傾向を統計学的に分析して、アイテムを推薦するような仕組みを、協調フィルタリングという。
これに興味を持ったことをtwitterに書いたら、「集合知プログラミング」という本を@clavicle_に紹介された*1ので、買ってみた。
- 作者: Toby Segaran,當山仁健,鴨澤眞夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/07/25
- メディア: 大型本
- 購入: 63人 クリック: 1,470回
- この商品を含むブログ (212件) を見る
内容は僕のような統計とか久しく使ってないような人間でもとてもわかりやすく、とても興味を持った。
erockrに協調フィルタリングを!
そして勉強も兼ねてerockrに「このアイドルを見た人はこの人も見ています」というレコメンデーションを実装してみることにした。
それで実はここ一週間ほど、以下のようなログを取ってデータを集めた。
これが大体25万行ほど集まった。
erockrの場合、ユーザが見るアイテム(=アイドル)の数はとても多い(データセットが「疎」)ので、アイテムベースのレコメンデーションにする。
レコメンデーションの流れ
大体以下のような流れでレコメンドする。
- アイテム間の類似度を計算。類似度の評価方法はいくつかあり、ユークリッド距離、ピアソン相関係数、Jaccard係数、Tanimoto係数などがある。
- 類似度で重み付けしてアイテムの推薦順番を決める。
類似度の計算
今日は類似度の計算を行ってみることにした。
いろいろな方法があるが、erockrの場合、ログはユーザがアイテムを見たというデータしかないので、
- ページを見たら1
- ページを見てなかったら0
ということになるので、ユークリッド距離、ピアソン相関係数よりも、Jaccard係数、Tanimoto係数などが向いている*2。
ここではTanimoto係数を用いる*3。
ここでMySQL上のログのテーブルから、計算に必要な表をつくる。
もとの表
uid | keyword |
---|---|
ユーザ1 | 新垣結衣 |
ユーザ3 | 新垣結衣 |
ユーザ4 | 新垣結衣 |
ユーザ1 | 上戸彩 |
ユーザ2 | 上戸彩 |
ユーザ5 | 上戸彩 |
作りたい表
s_and | s_xor | s_or |
---|---|---|
123 | 3456 | 4567 |
Tanimoto係数を求めるには、和集合、積集合、排他的論理和の集合を求めればよさそうだから*4
投げるSQL文
上の表を作るために、以下のSQL文を投げる。
SELECT (SUM(CASE WHEN tmp.a+tmp.b=2 THEN 1 ELSE 0 END) ) s_and, (SUM(CASE WHEN tmp.a+tmp.b=1 THEN 1 ELSE 0 END) ) s_xor, (SUM(CASE WHEN tmp.a+tmp.b>0 THEN 1 ELSE 0 END) ) s_or FROM( SELECT uid, CASE WHEN SUM(CASE WHEN keyword='{$keyword[0]}' THEN 1 ELSE 0 END)>0 THEN 1 ELSE 0 END a, CASE WHEN SUM(CASE WHEN keyword='{$keyword[1]}' THEN 1 ELSE 0 END)>0 THEN 1 ELSE 0 END b FROM `log` WHERE (keyword='{$keyword[0]}' OR keyword='{$keyword[1]}') AND uid!='' GROUP BY uid )tmp LIMIT 0,1
もっとスマートな書き方がありそうだけど、現状では1秒以内に帰ってくるし、期待通りに動くのでまぁいいやw
CASE文便利だなぁ。
とりあえず今日はここまでやりました。
結果は以下の通り。
青と赤は、それぞれ平均からの差が標準偏差*0.3以下、以上です。
ここまでやってだんだん本を読んだ直後の感動が薄れて、そして、この表が出来てなんだか満足してしまったので、ここまでにしておきます。
考察とかはまたそのうちやることにします。
注意
まだ20ページくらいしか読んでないので、ここらへん間違ってたらごめんなさい。
本読んでたらコード書きたくなっちゃって我慢できなくて書いちゃいました。
自分でも何やってるかわかんないなw
上で、全体の平均と全体の標準偏差を出してるけど、色を塗るなら、各アイテムごとの平均と標準偏差でやらないと意味ないような気がしてきた。
konisimpleでもサイトリンクが表示される!
konisimple, SEO, Google | |
erockrに続いてkonisimpleでもGoogle検索結果にサイトリンクが出現していた!!
サイトマップ送れば自動的に掲載されるものなのか!
*1:Twitter / クラビクル: @koni 集合知プログラミングなんか読むと結構面白いですよ
*2:たぶん。
*3:Jaccard係数より名前に親近感が持てたからです。何が違うかはよく知りませんwTanimoto係数もJaccard係数も計算方法はほとんど同じなので後から簡単にかきかえられる。
*4:tanimoto係数については、tanimoto係数 - 長岡技科大 自然言語処理研究室を参考にしました。
2010年05月12日
Google,インデックス数激増!
検索エンジンから見たerockr | |
site:erockr.com
03/17 | 03/19 | 03/20 | 03/23 | 03/27 | 03/30 | 04/04 | 04/08 | 04/18 | 04/28 | 05/07 | 05/12 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
296 | 804 | 690 | 1010 | 1300 | 2700 | 5010 | 5600 | 2050 | 3230 | 5560 | 15700 | |
Yahoo! | 1 | 41 | 40 | 75 | 210 | 355 | 383 | 451 | 482 | 429 | 1380 | 1390 |
Bing | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 2 |
Baidu | 100 | 102 | 102 | 103 | 103 | 105 | 127 | 124 | 7 | 3 | 9 | 9 |
Google激増!
一体何が起きたんだろう!
大体erockrに15,000もページないと思うんだけどな*1。
Yahoo!の一番上は、前々回調査時の優木まおみ、前回調査の松本さゆきに続き、優木まおみに戻っていた。
謎。
Alexa
03/23 | 03/27 | 03/30 | 04/04 | 04/08 | 04/18 | 04/28 | 05/07 | 05/12 | |
---|---|---|---|---|---|---|---|---|---|
Alexa Traffic Rank | 558251 | 475510 | 441724 | 381516 | 361389 | 293,927 | 259,291 | 237,970 | 235,585 |
Traffic Rank in JP | 11018 | 9213 | 8505 | 7991 | 7538 | 8700 | 10,792 | 12,611 | 15,551 |
Sites Linking In | No Data | No data | No data | No data | No data | No data | No data | No data | No data |
Traffic Rank in JPの低下が止まらない。
Yahoo! Site Explorer
03/23 | 03/27 | 03/30 | 04/04 | 04/08 | 04/18 | 04/28 | 05/07 | 05/12 | |
---|---|---|---|---|---|---|---|---|---|
Pages | 100 | 235 | 378 | 386 | 436 | 471 | 463 | 1312 | 1341 |
inlinks | 2880 | 4169 | 4435 | 4433 | 4550 | 4794 | 4681 | 4074 | 3752 |
減っちゃった!