Hatena::Diary

konisimple log RSSフィード

このブログは、koniがkonisipmleの更新履歴と技術的メモ、思いつきなどを思いつくままに書き留めたものです。
koniの詳しいプロフィールはこちらです。

2010年05月18日

いくつか仕様変更しました

| 01:40 | いくつか仕様変更しました - konisimple log を含むブックマーク

最近表示されない画像が多いので、

  • 検索結果のキャッシュを10日間でリフレッシュするように変更しました。

表示高速化のため、

iPhone版Google音声検索について

| 22:22 | iPhone版Google音声検索について - konisimple log を含むブックマーク

iPohneのGoogle音声検索は

http://www.google.com/m/appreq/gmiphone

Google/0.5.0.3644 CFNetwork/459 Darwin/10.0.0d3

というUAでデータをPOSTで送ってるみてるみたいだけど、データ形式はよくわからなかった。

以上。

2010年05月15日

erockrにレコメンド機能を追加しました

| 02:19 | erockrにレコメンド機能を追加しました - konisimple log を含むブックマーク

予告より早く、erockrにレコメンド機能を追加しました。

f:id:konisimple:20100516021321p:image

●●を見た人は、このページも見ています、ってやつですね!

携帯版、PC版ともに本日導入しました。

仕組み

  1. ユーザの検索ログを分析。jaccard係数による類似度を計算してDBに格納しておく。
  2. DBから類似度の高い順に出力。

全ての組み合わせでは20万通りほどの計算が必要だが、今の所まだ3万通りしか計算できていない。

CRONじゃ遅すぎる*1ので、初回の計算は自分のPCからcurlサーバ上のプログラムにやってもらうことにした。


ちなみに名前付近の数字はおすすめ度です。高いものほどおすすめです!

おすすめ度は、今のところjaccard係数の1000倍から10を引いた値です。

サイトマップを送信してインデックスを激増させる方法のまとめ

| 19:34 | サイトマップを送信してインデックスを激増させる方法のまとめ - konisimple log を含むブックマーク

ページ数の多いサイトを運営していると気になるのがインデックス数。僕もerocrというサイトを運営していまして、無限増殖型サイトなので、特に気になるところ。

検索エンジンに「site:erockr.com」と入れてでてくる件数がインデックス数。実際にはこの数字には誤差があるらしいが、おそらく本当のインデックス数と比例するだろうし、参考になる数字だとは思う。

先日erocrサイトマップについて、いくつか対策を施したところ、インデックス数は3-5倍に増え*2Google検索結果ではサイトリンク*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

.htaccess

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^sitemap_pc.xml*$ sitemap_pc.php [L]

RewriteRule ^sitemap_m.xml*$ sitemap_m.php [L]

4.以後、サイトマップを更新したら検索エンジンに通知する

2.のツールからでもよいけど、直接GETのクエリで通知する方法もある。以下参照。

サイトマップの作成と送信 - ウェブマスター ツール ヘルプ

参考

sitemaps.org - プロトコル

サイトマップの整備でインデックス数急上昇!

| 19:03 | サイトマップの整備でインデックス数急上昇! - konisimple log を含むブックマーク

site:erockr.com
 03/1703/1903/2003/2303/2703/3004/0404/0804/1804/2805/0705/1205/15
Google296804690101013002700501056002050323055601570018900
Yahoo!1414075210355383451482429138013902670
Bing0000000011125
Baidu10010210210310310512712473993490

検索エンジンインデックス数が急上昇した。

実はこの一週間ほどで、サイトマップ(sitemap.xml)をちゃんと整備したのだった。

詳細は別のエントリにまとめておく。

erockrにレコメンド機能をつけるための38時間の計算開始!

| 17:23 | erockrにレコメンド機能をつけるための38時間の計算開始! - konisimple log を含むブックマーク

さて、昨日、おとといの実験で、割とうまくレコメンドされることがわかった!

そこで早速erockr登録キーワードの類似度を計算することにした。

erockr登録キーワードは全部で630件あるので、組み合わせの総数は198,135通りもある。

_{630}P_{2} = 198135

ここで僕の書いたSQL文たど、1つの組み合わせの計算に約0.7秒ほどかかる。

ということは、全部計算するのに38時間かかるorz

うぇー!

とりあえず、ランキングの上位100件の分の表を優先課題ということにして、バッチ処理するPHPプログラム書いてcronで回すことにしてみます。

3,4日でデータの計算が終わるでしょう!

最初1件だけ処理するPHPプログラムをおいて、ターミナルからシェルスクリプトアクセスする方法とっていたら、coreserverDNSサーバーに弾かれるようになってしまったので、やっぱ上の方法に変更した。

そっちの方が効率よさそう。


というわけで、来週末ぐらいに「このページを見た人はこのページも見ています」機能をリリースします!

2010年05月14日

jaccard係数によるerockr検索キーワードの分析

| 01:36 | jaccard係数によるerockr検索キーワードの分析 - konisimple log を含むブックマーク

昨日やったtanimoto係数によるerockrの検索キーワード間の類似度の計算の続き。

昨日はjaccard係数よりtanimoto係数のほうが名前に親近感がもてるとかいって、tanimoto係数がいいとか言ったが、jaccard係数の方が得られる数値がイメージしやすい。jaccard係数は「和集合に対する積集合の割合」で表されるものなので、頭にベン図が思い浮かぶ。

さて、早速jaccard係数でerockrの表示ランキング上位20位間の類似度を考えてみた。

結果

f:id:konisimple:20100515011608p:image

種類の違う「エロ」

まず際立って目立つのが「エロ」だ。

全ての組み合わせで類似度が低いという評価が出ている。「エロ」だけは人間の名前ではなく、少し種類の違うデータなのでこれは妥当だろう。

類似度の高い組が多いアイテム

新垣結衣佐々木希上戸彩南明奈長澤まさみ深田恭子ほしのあき

これらは知名度も高く、万人受けする人たちのようだ。浅く広くまんべんなく多くのユーザに見られている。

類似度の低い組が多いアイテム

堀北真希堀井美月篠崎愛鈴木茜安めぐみ

堀北真希以外は、知名度が低く、かなり排他的な傾向が強い。

特に篠崎愛はひどいw

得られたデータのうち、使えそうなデータ

アイテム類似度の高いアイテム考察もどき
堀井美月篠崎愛川村ゆきえ、仲村みゆロリ巨乳
篠崎愛堀井美月ロリ巨乳
安めぐみ井上和香磯山さやか深田恭子なんか同じ香りの人たちw
蒼井優綾瀬はるか小阪由佳広末涼子深田恭子清純派?

結論

この方法はロリ巨乳系の人たちの類似アイテムを探すのに向いているw

類似度の分布

Rで、erockrの検索キーワード上位20件の類似度(jaccard係数)の分布をステムアンドリーフで書いてみたところ、以下の通り。

422356666788999
50011222234444455666678888889999
60000001111111122333333333444455556666666777777777788899999999
700000111111111111222222222233334444445555555556666667777777777777888888889999999
800000011111111111111122222222223333333334444445555555666666666777777777777888888889999999999
900000000111111111111122222222223333333334444444555555666666666777778889999
10000111112222223333444455566666777777777778888999999
11001222233344445688899
121134669
1399
144
152
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の検索キーワード間の類似度の計算

| 03:47 | tanimoto係数によるerockrの検索キーワード間の類似度の計算 - konisimple log を含むブックマーク

amazonのレコメンデーションシステムのような、大量に蓄積したユーザが表示したり購入したデータから、ユーザの行動の傾向を統計学的に分析して、アイテムを推薦するような仕組みを、協調フィルタリングという。

協調フィルタリング - Wikipedia

これに興味を持ったことをtwitterに書いたら、「集合知プログラミング」という本を@clavicle_に紹介された*1ので、買ってみた。

集合知プログラミング

集合知プログラミング

内容は僕のような統計とか久しく使ってないような人間でもとてもわかりやすく、とても興味を持った。

erockrに協調フィルタリングを!

そして勉強も兼ねてerockrに「このアイドルを見た人はこの人も見ています」というレコメンデーションを実装してみることにした。

それで実はここ一週間ほど、以下のようなログを取ってデータを集めた。

これが大体25万行ほど集まった。

erockrの場合、ユーザが見るアイテム(=アイドル)の数はとても多い(データセットが「疎」)ので、アイテムベースのレコメンデーションにする。

レコメンデーションの流れ

大体以下のような流れでレコメンドする。

  1. アイテム間の類似度を計算。類似度の評価方法はいくつかあり、ユークリッド距離、ピアソン相関係数、Jaccard係数、Tanimoto係数などがある。
  2. 類似度で重み付けしてアイテムの推薦順番を決める。

類似度の計算

今日は類似度の計算を行ってみることにした。

いろいろな方法があるが、erockrの場合、ログはユーザがアイテムを見たというデータしかないので、

  • ページを見たら1
  • ページを見てなかったら0

ということになるので、ユークリッド距離、ピアソン相関係数よりも、Jaccard係数、Tanimoto係数などが向いている*2

ここではTanimoto係数を用いる*3

ここでMySQL上のログのテーブルから、計算に必要な表をつくる。

もとの表
uidkeyword
ユーザ1新垣結衣
ユーザ3新垣結衣
ユーザ4新垣結衣
ユーザ1上戸彩
ユーザ2上戸彩
ユーザ5上戸彩
作りたい表

新垣結衣上戸彩の類似度

s_ands_xors_or
12334564567

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文便利だなぁ。

とりあえず今日はここまでやりました。

結果は以下の通り。

f:id:konisimple:20100514034533p:image

青と赤は、それぞれ平均からの差が標準偏差*0.3以下、以上です。


ここまでやってだんだん本を読んだ直後の感動が薄れて、そして、この表が出来てなんだか満足してしまったので、ここまでにしておきます。

考察とかはまたそのうちやることにします。

注意

まだ20ページくらいしか読んでないので、ここらへん間違ってたらごめんなさい。

本読んでたらコード書きたくなっちゃって我慢できなくて書いちゃいました。

自分でも何やってるかわかんないなw

上で、全体の平均と全体の標準偏差を出してるけど、色を塗るなら、各アイテムごとの平均と標準偏差でやらないと意味ないような気がしてきた。

konisimpleでもサイトリンクが表示される!

| 11:03 | konisimpleでもサイトリンクが表示される! - konisimple log を含むブックマーク

erockrに続いてkonisimpleでもGoogle検索結果にサイトリンクが出現していた!!

サイトマップ送れば自動的に掲載されるものなのか!

f:id:konisimple:20100513110258p:image

*1Twitter / クラビクル: @koni 集合知プログラミングなんか読むと結構面白いですよ

*2:たぶん。

*3:Jaccard係数より名前に親近感が持てたからです。何が違うかはよく知りませんwTanimoto係数もJaccard係数も計算方法はほとんど同じなので後から簡単にかきかえられる。

*4:tanimoto係数については、tanimoto係数 - 長岡技科大 自然言語処理研究室を参考にしました。

2010年05月12日

Google,インデックス数激増!

| 13:49 | Google,インデックス数激増! - konisimple log を含むブックマーク

site:erockr.com
 03/1703/1903/2003/2303/2703/3004/0404/0804/1804/2805/0705/12
Google2968046901010130027005010560020503230556015700
Yahoo!141407521035538345148242913801390
Bing000000001112
Baidu1001021021031031051271247399

Google激増!

一体何が起きたんだろう!

大体erockrに15,000もページないと思うんだけどな*1

Yahoo!の一番上は、前々回調査時の優木まおみ、前回調査の松本さゆきに続き、優木まおみに戻っていた。

謎。

Alexa

 03/2303/2703/3004/0404/0804/1804/2805/0705/12
Alexa Traffic Rank558251475510441724381516361389293,927259,291237,970235,585
Traffic Rank in JP110189213850579917538870010,79212,61115,551
Sites Linking InNo DataNo dataNo dataNo dataNo dataNo dataNo dataNo dataNo data

Traffic Rank in JPの低下が止まらない。

Yahoo! Site Explorer

 03/2303/2703/3004/0404/0804/1804/2805/0705/12
Pages10023537838643647146313121341
inlinks288041694435443345504794468140743752

減っちゃった!

YSTにもサイトマップ送るか!

ついにGoogle SERP にサイトリンク登場!

| 13:18 | ついにGoogle SERP にサイトリンク登場! - konisimple log を含むブックマーク

ついに"erockr"のGoogle 検索結果にサイトリンク登場!

サイトリンクは最初の結果の下のサイト内リンクのようなもののこと。

f:id:konisimple:20100512131428p:image

サイトマップ送ったり、WEB標準に準拠したりしたのが効いたのかなぁ。

PageRankは3のまま。

ちなみにサイトリンクの内容は自分では選べないけど、ウェブマスターツールから消すことはできる。

f:id:konisimple:20100512131555p:image

*1:理屈では無限にページあるけど、ref="canonical"でURL正規化してるし、リンクだけでたどれるのは5000ページぐらいな気がする。