2010年3月21日日曜日

twitter searchからデータを拾ってほげほげする話(2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
http://viratter.jp/なるものを発見し、やる気喪失。
のこりの残骸を放置する。ahooonがアカウント削除したおかげで、あとからデータとるやり方では
どうしても追跡できない部分ができてしまう。viratterは定期的にデータをとっているので
そのようなことは起こらない。しかしどんだけのtweetをDLして持っているのだろう?

どうguessして埋めるかを考えるモノまた楽しみではあるが。

#!/usr/bin/python
# coding:utf8

import pickle
import re

#def make_strucure(

f = open('data.pkl')
try:
  all = pickle.load(f)
finally:
  f.close()


peopleTweet = {}
users = {}

for tweet in all.values():
  user_id = tweet['from_user_id']
  tweeted = peopleTweet.get(user_id, None)
  if not tweeted:
    tweeted = []
  tweeted.append(tweet['id'])
  peopleTweet[user_id] = tweeted

  user_name = tweet['from_user']
  possible = users.get(user_name, None)
  if not possible:
    possible = []
  if user_id not in possible:
    possible.append(user_id)
  users[user_name] = possible


USERNAME_PATTERN = r'(?P[_A-Za-z0-9]+)'
RETWEET_PATTERN = r'(RT )?@' + USERNAME_PATTERN + r':'

RETWEET_RE = re.compile(RETWEET_PATTERN)

def GuessParent(tweet):
  text = tweet['text']
  m = RETWEET_RE.match(text)
  if not m:
    return None
  n = (m.groupdict()['username']).encode('ascii')
  from_parent = text[len(n):]
  if n not in users:
    #this means that n is a special user ! 
    users[n] = [n,]
  candidates = users[n]
  if not len(candidates) == 1:
    print n, candidates
  c = candidates[0]

  try:
    ts = peopleTweet[c]
  except:
    return c #ugh!
    
  for t in ts:
    t = all[t]
    if t['text'].startswith(from_parent):
      return t['id']
  return None

RT = {}
for tweet in all.values():
  parent = GuessParent(tweet)
  if not parent:
    continue
  children = RT.get(parent, None)
  if not children:
    children = []
  children.append(tweet['id'])
  RT[parent] = children

print RT

0 件のコメント: