Hatena::ブログ(Diary)

不可視点 このページをアンテナに追加 RSSフィード

2012-01-27

Solrを使ったレシピ検索のプロトタイピング

モーショノロジー#1で発表してきました http://atnd.org/events/23608

資料: http://www.slideshare.net/penguinana/solr-11287004


他の発表の資料は順次以下から見れるようになるようです。

クックパッドではchankoという仕組みを使って本番で複数のバージョンを安全にデプロイできるようにしています。

これによって1つの場所を複数のチームが同時に改善したりできるようになりました。

chankoについては以下をお読みください。

2011-09-13

Solr@Cookpad」- Solr勉強会で発表してきました

9月12日にECナビにて第6回Solr勉強会がありました。事例紹介に「Solr@cookpad」という発表で参加させて頂いた時の資料を公開しておきます。

みなさんの発表が面白くてすごく勉強になりました。勉強会の様子はこちらに詳細に書かれています。 http://johtani.jugem.jp/?eid=26

スライド:Solr@cookpad

分かりにくいスライドかも…お気づきの点ありましたらコメント欄などでお知らせください。

ところで

また、スライドでも少し紹介したtwitter検索(yats)ですが、15億docのセットを150msで7000万req/月で返していて、Solrベンチマークにも役立っておったのですがAPIの規約にひっかかっている(第三者がオリジナルのAPIを無許諾で提供してはならない)部分があって、先月更新を止めました。今まで使ってくださっていたみなさんありがとうございました...!

2011-02-03

yatsが回収した2011年のお正月ダンプ

久しぶりにTwitter日本語圏のダンプを公開したいと思います。

2010年12月31日から2011年1月1日のつぶやきのMySQLダンプです(load dataで取り込むタイプ)

yatsの収集対象は

  • 公開ユーザー状態でつぶやかれたもののうち
    • 過去3週間以内につぶやいたユーザーからのもの、
    • 累積400〜つぶやきの日本語ユーザーからのもの

です。ベストエフォートです。

streaming apiで流れてくるつぶやきもだいたい記録しています。

スキーマ

CREATE TABLE `buffer_2011` (
  `id_autoinc` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `id` bigint(20) unsigned NOT NULL,
  `user` varchar(20) NOT NULL,
  `content` text NOT NULL,
  `source` text,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

記録されている内容:

CREATE TABLE `buffer_yyyymmdd` (
  `id_autoinc` yats内部ID,
  `id` ステータスID,
  `user` スクリーンネーム,
  `content` 本文,
  `source` 投稿に用いたクライアント情報,
  `time` つぶやかれた時刻,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

データ:

http://api.yats-data.com/data/20101231-201101.bz2

使い方:

$ wget http://api.yats-data.com/data/20101231-201101.bz2
$ bunzip2 20101231-201101.bz2
$ mysql -u hoge
mysql > use hogebase;
mysql > CREATE TABLE `buffer_2011` (
  `id_autoinc` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `id` bigint(20) unsigned NOT NULL,
  `user` varchar(20) NOT NULL,
  `content` text NOT NULL,
  `source` text,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
mysql > LOAD DATA INFILE 'buffer_20101231-201101' INTO TABLE buffer_2011;
mysql> select * from buffer_2011 where user like 'fuba' limit 1\G
...

その他の使い方:

MySQLダンプですがスキーマは必要以上にインデックスを張っていません。

用途に応じて張ってみてください。

MySQLに入れずに使うことも出来ます。

bunzip2後のファイルは以下のようになっています。

$ bzcat 20101231-201101.bz2 |head
id_autoinc	id    user    content    source    time
id_autoinc	id    user    content    source    time
id_autoinc	id    user    content    source    time

本文などに改行が入る場合など例外もありますのでちょっと処理が面倒かもですが、

違うデータベースに入れてもいいし、そのまま使っても良いと思います。

2011-01-30

twitter日本語ユーザーのソーシャルグラフダンプ

twitter日本語ユーザー100万人分のフォローイングとプロフィールのダンプを作成しました。

レコメンデーションの実験や分析に使えるかもしれません。

プロフィール:

108万人分のスクリーンネームや自己紹介文

フォローイング:

103万人分のフォローイング先ID一覧です。

展開すると300万ノード 2.8億エッジになります。(※被フォローエッジを含みません)

以下のURLからダウンロードできます

今回はMongoDBをストレージにしました。ダンプの利用にはMongoDBのインストールが必要となります。

https://github.com/penguinco/yats-socialgraph-dump

使い方:

$ git clone git://github.com/penguinco/yats-socialgraph-dump.git
$ cd yats-socialgraph-dump/
$ less README.md
$ bundle # scripts/tutorial.rbを使うために必要なgemが入ります。

データの準備ができるとこんな感じで使えます。

pp profiles.find_one("screen_name" => 'fuba')

fuba_internal_id = profiles.find_one("screen_name" => "fuba")["internal_id"]
fuba_following = friends.find_one("internal_id" => fuba_internal_id)
shokai_internal_id = profiles.find_one("screen_name" => "shokai")["internal_id"]

#is shokai followed by fuba?
pp fuba_following["ids"].include?(shokai_internal_id)
=> true
#output id csv
friends.find("internal_id" => fuba_internal_id).each do |me|
  puts me["ids"].map{|id| id.to_s}.join(",")[0,100]
end
=> 164743710,51774619,18574112,6064612,175079593,99697384,101801049,123140561,15210265,180215207,156135
#output screen_name csv
friends.find("internal_id" => fuba_internal_id).each do |me|
  result = []
  me["ids"].each do |id|
    prof = profiles.find_one("internal_id" => id)
    if prof != nil
      result << prof["screen_name"]
    else
      result << id.to_s
    end
  end
  puts result.join(",")[0,100]
end
=>164743710,51774619,umaiboo,6064612,kanda_daisuke,bolze_doujin,KEUMAYA,Joey__Jones,0mg,ma2omat2,amasa

便利〜

レコメンデーションの実験とか、プロフィールから分類器とか

Pagerank求めるとかできるのかもしれないですね。

何か面白いものができたら教えてください!

TODO

  • リプライの頻度情報を追加する
  • 定期的に更新される

oonooono 2011/05/17 13:58 はじめまして。
私はWeb Miningの研究をしているものです。
たいへん不躾なお願いなのですが、このTwitterダンプを研究目的に使わせて頂いてよろしいでしょうか?基本的に利益などが発生する研究ではありませんが、念のため、提供者様から許可をいただきたいと考えています。
よろしければ、私までメールを頂ければ幸いです。

code46code46 2011/06/07 21:58 はじめまして。おおのさん。利用していただいて構いません。

nakamuranakamura 2011/08/09 16:30 大変興味深いデータですね。今、ネットワークの次数分布について研究しておりまして、ぜひデータを使わせて頂きたく存じます。集計結果等は公開していきたいと思います。よろしくお願いします。

2010-09-19

yatsが回収したTwitter日本語圏 9月(1/2)

久しぶりにTwitter日本語圏のダンプを公開したいと思います。

9/1-9/16の1.77億つぶやきのMySQLダンプです(load dataで取り込むタイプ)

yatsの収集対象は

  • 公開ユーザー状態でつぶやかれたもののうち
    • 過去3週間以内につぶやいたユーザーからのもの、
    • 累積200〜400つぶやきの日本語ユーザーからのもの

です。ベストエフォートです。

streaming apiで流れてくるつぶやきもだいたい記録しています。

スキーマ

CREATE TABLE `buffer_20100916` (
  `id_autoinc` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `id` bigint(20) unsigned NOT NULL,
  `user` varchar(20) NOT NULL,
  `content` text NOT NULL,
  `source` text,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2179575472 DEFAULT CHARSET=utf8

記録されている内容:

CREATE TABLE `buffer_yyyymmdd` (
  `id_autoinc` yats内部ID,
  `id` ステータスID,
  `user` スクリーンネーム,
  `content` 本文,
  `source` 投稿に用いたクライアント情報,
  `time` つぶやかれた時刻,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=x DEFAULT CHARSET=utf8

データ:

http://yats-api.no-ip.org/data/buffer_20100916.bz2 8.7G (36GB)

使い方:

$ wget http://yats-api.no-ip.org/data/buffer_20100916.bz2
$ bunzip2 buffer_20100916.bz2
$ mysql -u hoge
mysql > use hogebase;
mysql > CREATE TABLE `buffer_20100916` (
  `id_autoinc` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `id` bigint(20) unsigned NOT NULL,
  `user` varchar(20) NOT NULL,
  `content` text NOT NULL,
  `source` text,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_autoinc`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2179575472 DEFAULT CHARSET=utf8;
mysql > LOAD DATA INFILE 'buffer_20100916' INTO TABLE buffer_20100916;
mysql> select * from buffer_20100916 where user like 'fuba' limit 1\G
id_autoinc: 1979328940
        id: 22534370639
      user: fuba
   content: 当分夏だろ
    source: <a href="http://sites.google.com/site/peraperaprv/Home" rel="nofollow">P3:PeraPeraPrv</a>
      time: 2010-08-31 00:39:46
1 row in set (19.56 sec)

その他の使い方:

MySQLダンプですがスキーマは必要以上にインデックスを張っていません。

用途に応じて張ってみてください。

MySQLに入れずに使うことも出来ます。

bunzip2後のファイルは以下のようになっています。

$ bzcat buffer_20100916.bz2 |head
id_autoinc	id    user    content    source    time
id_autoinc	id    user    content    source    time
id_autoinc	id    user    content    source    time

本文などに改行が入る場合など例外もありますのでちょっと処理が面倒かもですが、

違うデータベースに入れてもいいし、そのまま使っても良いと思います。