tig.rb でとってる tiarra のログを tsv に変換して R に食わせる


そんなわけで。
Rの初学者として、まあ、Twitterあたりは身近なネタとして、いいのではないか、と思ったので。2008年11月から直近までのデータ。

眠いのでぶろぐてきとうかも。

# -*- coding: utf-8 -*-

import os, sys, glob
import datetime
import re

savefile = "twitter_log.txt"

with open(savefile, "w") as savefp:
  #savefp.write("\t".join(["tw_datetime", "tw_screenname", "tw_reply", "tw_message",]) + "\n")
  savefp.write("\t".join(["tw_datetime", "tw_screenname", "tw_reply", ]) + "\n")

  for filename in glob.glob('./data/*.txt'):
    print filename
    for line in file(filename, 'r'):
      line = line.decode('utf-8')

      # 空白による分解の前に両端の空白・改行コードを取り除く
      log_line = line.strip().split(' ')

      if (log_line[2].startswith("<") and log_line[2].endswith(">")) or (log_line[2].startswith(">") and log_line[2].endswith("<")):
        year, month, date = map(int, ('20' + log_line[0]).split("/"))
        hour, minute = map(int, log_line[1].split(":"))

        tw_datetime = datetime.datetime(year, month, date, hour, minute)
        tw_screenname = log_line[2].replace("#twitter@twitter:", "").replace("<","").replace(">","")

        if len(log_line) == 3:
          log_line.append("-")
          log_line.append("-")
        else:
          if log_line[3].startswith("@"):
            # @hoge のあとにスペースがなかったら、それは @hoge とメッセージに分解
            try:
              tw_reply_name = re.search("^@[0-9a-zA-Z_]+", log_line[3].strip()).group().replace("@", "")
              log_line[3] = log_line[3].replace("@" + tw_reply_name, "").strip()

            except AttributeError:
              tw_reply = "-"
            else:
              # 空になっていたらスペース含んだreplyであり、リストの要素であったと判断して消去
              if log_line[3] == "":
                log_line.pop(3)

              tw_reply = tw_reply_name

            #print tw_reply
          else:
            tw_reply = "-"

          if len(log_line) == 3:
            log_line.append("-")

        tw_message = " ".join(log_line[3:])
        save_line =  "\t".join([tw_datetime.strftime("%Y-%m-%d %H:%M:%S"), tw_screenname, tw_reply, ]) + "\n"
        savefp.write(save_line.encode('utf-8'))

とりあえず、tiarraのログをtsvに変換。なんかPythonすくりぷとも微妙?(つかdatetimeに変換する必要もない気がするが。)


で、で、tw_messageを含めてtsvにしたら、50万行 60MB くらいになって、それをRに read.table でつっこんだら 2GBくらいメモリ食って応答がなくなった。

てなわけで、とりあえず本文はいらねえだろ(ってかやるとしても形態素解析とかしないとどっちにしろ日本語は解析できないし、まずはおためしとしてscreennameとreplyだけみてみようぜ的な)ってことで、tw_messageをのぞいてtsvにした。*1

> tw <- read.table("twitter_log_without_message.txt", header=T, sep="\t")
> head(tw)
          tw_datetime tw_screenname  tw_reply
1 2008-11-19 15:31:00        zeni_s    Maglaw
2 2008-11-19 15:31:00      skylab13  lolipuni
3 2008-11-19 15:31:00        p4life         -
4 2008-11-19 15:31:00      ukstudio    wtnabe
5 2008-11-19 15:31:00      ukstudio       ynk
6 2008-11-19 15:31:00      ukstudio kazumi9do


んー、そんで、

> head(summary(tw))
              tw_datetime             tw_screenname             tw_reply       
 "2008-12-27 00:05:00:   119  " "syou6162     : 20916  " "-          :365699  "
 "2009-05-15 02:08:00:   118  " "_akko_       : 19309  " "syou6162   :  2108  "
 "2008-11-23 13:46:00:   117  " "takano32     : 16729  " "y_benjo    :  1450  "
 "2008-12-30 17:41:00:   117  " "zeni_s       : 15263  " "mickey24   :  1398  "
 "2009-01-08 23:22:00:   117  " "Makoto1987   : 14134  " "twneru     :  1302  "
 "2009-02-24 17:03:00:   117  " "YurineMashiro: 11884  " "Carpe__Diem:  1288  "
> head(summary(tw$tw_reply[tw$tw_reply != "-"]), 20)
     syou6162       y_benjo      mickey24        twneru   Carpe__Diem 
         2108          1450          1398          1302          1288 
       T_Hash       suztomo    norahmodel     limitusus       sotarok 
         1197           925           886           822           820 
       aya_no       hayamiz        yaotti        Maglaw      natsutan 
          810           699           677           673           666 
blanc_et_noir    sugarheart         tatsu     portable_         anemo 
          662           584           543           537           535 
> head(summary(tw$tw_screenname), 20)
     syou6162        _akko_      takano32        zeni_s    Makoto1987 
        20916         19309         16729         15263         14134 
YurineMashiro     syzfonics         anemo       replore      ukstudio 
        11884         11613         11249         10691          9710 
        totte      skylab13        mikiho        mootoh          _a_u 
         9409          9359          8166          7388          7298 
       sekido      monjudoh          undo          VoQn      supistar 
         6630          6441          6369          6286          6096


などを見つつ適当にニヤニヤするとする。

不本意にも名前が出てきてしまった人すみませぬ。

ちなみに @sotarok がわりかし上位に食い込んでるのは、自分のログファイルなのでそりゃそうかってかんじだけど、それはそうとしてsyou先生が圧倒的ダントツでトップなのがなかなか感慨深いです。

ま、簡単に集計とかはできるよんねってことで今日はねむい。

*1:で、本文抜きだとだいたいいけたかんじなので、syou先生に相談しつつ考えたところ、やっぱUTF-8文字列を全部食わすのは危ないんじゃねえか、って個人的な結論に至った。Rが内部でどう文字列もってるかわからんけど、UTF-8はバイト数食うしね。アスキーとnumだったらもっとデカいファイルいけると思うんだけどどうでしょうかね?まあいいか。