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先生が圧倒的ダントツでトップなのがなかなか感慨深いです。
ま、簡単に集計とかはできるよんねってことで今日はねむい。