読者です 読者をやめる 読者になる 読者になる

不可視点

search guy at cookpad.com

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

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

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

本文などに改行が入る場合など例外もありますのでちょっと処理が面倒かもですが、
違うデータベースに入れてもいいし、そのまま使っても良いと思います。

第3回Solr勉強会に行ってきました

毎回勉強になります。前回ご挨拶させていただいた人の顔を忘れていて帰り道に思い出したり。名刺忘れるのも毎回やないか…
あと、すごい豪雨だった。

内容はスライドを公開されている方が多いので、なんとなく心に掛かったところだけメモ

株式会社ロンウイット 関口さま

質疑で次のリリース時期を聞くのはやめたほうがいいと思うw

・4からflexible indexing。再インデックスなどが必要になる
・作り直すのがよいといわれている
・byteで保存できるようになる。termがbyteになる(sort orderもcharからbyteになる)
・nested document query
・field collapsing
・solrcloud
・japanese tokenizer(aka tiny segmenter) 辞書なしらすい

株式会社サイバーエージェント 田代さま、安田さま

新規開発局という部門があるのだそう。
・もともとはluceneを使っていた
・2009年末から二ヶ月で作成。(その後一ヶ月でインポート
・つかえるディスク容量の話

マピオン 岩澤さま

マピオンさんはかなり長期間ZFS使っている気がする。簡単に使えるものなのだろうか?
・電話帳検索で三十分で落ちた。
・朝の十時にピークがあるらしい。(なんでだろう?)
ZFSのキャッシュを使っている
・1000万クエリ/日は四台で捌いている
・ピークは400クエリー/s

チームラボ 田村さま

これはSolrとは関係なかったけどおもしろかった。
・感覚とか数値をきちんと扱う検索が実は存在しない
・認識した情報をテキストに変換することで通常の検索ライブラリに載る
・色と形状と特徴量をOpenCVなどで取り出してテキスト化
・この服の色の靴を買うとかできるらしい。
・画像の類似度を使うということは採用しなかった
→理由:ユーザーの操作が難しくならないようにするため。
Q:こういうデザインのやつ!っていう検索は出来ないと思うが?
→A.商品の形状・魅力などはキーワードで十分説明されていると考えることもできる

LT Basis Technology 黒坂さま

lucid imaginationのサービスをベイシスさまが提供するとのこと。
魅力としては日本語サポートと時差の問題の解消、日本語や各種課題に対するノウハウが加わるというところかと思われます。SolrやLuceneの利用が加速するかな?
Tシャツいただきました!ありがとうございます!デザインはこんな感じ。僕の美的感覚からすると全然着れますw
(クリックするとでかくなります)

LT ECナビ 春山さま

JVMのチューニングのお話。GCとの戦いですね…
MaxTenuringThresholdってどうやって調整していけばいいのか分からない…他のオプションもそうだが…

勉強会に参加してみて

・個々の検索アプリケーションをどのように改善していくかという話が聞きたい。要求ごとにどのコンポーネントをいじりましたみたいなのとか
JVMの設定、複数台での運用が前提なのでSolrの分散構成のベストプラクティスをさぐる話
が聞けたと思いました。あと、開発者募集している方が多かったw

自然言語処理勉強会@東京で発表してきました

勉強会のなかみはid:hamadakoichiさんががっつりまとめてださっていますのでそちらをご参照ください。

この勉強会は@nokunoさんが発起人と思いますが以下のような範囲(形式)を対象としております。

輪読形式(教科書を1章ずつくらい発表)
論文紹介、手法紹介、ライブラリ紹介など
実装してみました系、コードリーディング、ライブコーディング
実験系、手持ちのデータに適用してみました系 ←今回ここを狙いました
研究紹介、システム紹介、実務経験のシェア
その他
自然言語処理勉強会@東京 | Google Groups

私はLDAを利用してつぶやきをタギングしてみようという「やってみた」系の発表をやらせてもらいました。

参加してみて

自然言語処理に限らずなんでもそうかとおもいますが、僕はついつい実現したいことから出発したりするので、モデルの改良には手が届きません。
こうした勉強会で基礎やモデルからの視点も得られたらと甘い期待をしております。
株式会社ミクシーさんの会議室にて開催されたのですが、ビルのかどに柱がなく視界を遮らない景色はすごかった…
次回は8月に開催されるそうで、ひとつ発表したい内容を思いついたので準備できたら手を上げてみたいと思いますー

日本語圏ではどんなTwitterクライアントが使われているか

先週アメリカで開催されたTwitterのカンファレンスchirpで、アクセスの75%は外部からくるという発表がありました。
何のことかわからなかったのですが、気になったのでクライアントTOP100を集計*1してみたところ、実際そうなってました。
純粋にブラウザから書き込まれたつぶやきは28%に過ぎません。書き込みに関しては72%がTwitter外部から行われていると言えます。

モバイルからつぶやかれている?

また、投稿の1%以上を占めるクライアントから、モバイルと思われるものを合計すると36%になりました。
携帯やiPhone,androidからも多く利用されていることが分かります。モバイルから多く利用されるのは自然なことと思いますがモバツイッターの普及率に驚きました。

今回集計した資料:

google スプレッドシート

*1:yatsで回収した2010年4月1日から同年4月14日のつぶやきから書き込みもとがはっきり分かるものを対象につぶやき数を集計しました。

Solr勉強会に行ってきました。2010

3月11日にECナビにて第2回Solr勉強会がありました。事例紹介に「Solr@twitter検索」という発表で参加させて頂いた時の資料を公開しておきます。すごく勉強になりました。皆さんの発表の内容とか感想はのちほど追記…twitter/#SolrJP,yats/#SolrJP

スライド:Solr@twitter検索2010

分かりにくいスライドですが「考え方が根本的に間違っている!」「これはこうすべきだし!」「これを使うべき。」「ここはどうなってるの?」などお気づきの点ありましたらコメント欄などでお知らせください。
もう少しSolrいじってみてまたブログに書いたりしてみようと思います。

メモ

追記予定

Solr勉強会に行ってきました。

7月21日にECナビにてSolr勉強会がありました。LTに「Solr@twitter検索」という発表で参加させて頂いた時の資料を公開しておきます。すごく勉強になりました。当日名刺をもってなかったり、遅刻してきたりいろいろご迷惑おかけしてしまって申し訳なかったです…!でもこりずに次も誘ってくださいw
当日の勉強会の様子:

スライド:Solr@twitter検索(.ppt)

分かりにくいスライドですが「考え方が根本的に間違っている!」「これはこうすべきだし!」「これを使うべき。」「ここはどうなってるの?」などお気づきの点ありましたらコメント欄などでお知らせください。
もう少しSolrいじってみてまたブログに書いたりしてみようと思います。

メモ

ついでに当日自分でとってたメモも書いておきます。遅刻した上に、全然内容に追いついてないんですが…
(しかも数字は聞きながら写しただけなので当てになりません…)

続きを読む