TopPage

nltkでtwitterのログを処理する。

  1. TwitterLog20100805 を自分のディレクトリにコピーする
    	cp -r /home/maeda/TwitterLog/20100805/ .
  2. 参考サイト http://d.hatena.ne.jp/nokuno/20100123/1264239192
  3. 日本語テキストを読み込むサンプルプログラム
    	#! /usr/bin/env python
    	#encoding: utf-8
    	import nltk
    	raw = open('./sample.mecab').read()
    	words = raw.split();
    	print len(words)
    	text = nltk.Text(words)
    	gen = text.generate(300)
    	print gen
  4. bigrams
    	#!/usr/bin/python
    	#encoding: utf-8
    	import nltk
    	
    	raw = open('sample.dat').read()
    	words = raw.split();
    	bigrams = nltk.bigrams(words)
    	fd = nltk.FreqDist(bigrams)
    	for w in fd:
    	        if fd[w]==100 :
    	                break;
    	        print w[0],w[1],fd[w]
    	
    	#文字化けする
    	cfd = nltk.ConditionalFreqDist(bigrams)
    	print cfd['私']
  5. 24時間x60分=1440ファイルを分かち書きにする

ディレクトリ下の*.datファイルを読み込み、その中からtweetを抽出する。(筆跡:Ashihara)

  • 事前処理として.dat内の制御文字を削除する必要がある。
    • コマンド
      	find . -name "*.dat" | xargs sed -i "s/^M//g"
    • ^Mは[Ctrl]+[v] + [Ctrl] + [M]で入力する。直接入力してはいけない。
      	[Ctrl]+[v] + [Ctrl] + [M]
    • 他の制御文字が含まれている場合もある。適宜除去する必要がある。
  • tweetの抽出
    • データは生データを読み込む。それをsplit()でリストにする。
    • splitされたリストの要素中に'2010'の要素が必ず一つのtweetに存在し、その後はtweet内容となる。
    • これを利用し、index関数で'2010'が存在する箇所の添字を取得、それ以降の要素を全て結合しtweetとする。
    • 一つのtweetに対し一つずつ改行しつつファイルに書き込む。tweetList.txtというファイルが生成される。
    • このtweetList.txtをmecabにかける。今回はコマンドラインから直接実行した。
    • この処理は制御文字を削除しない限り、失敗する。以下ソースコード。
    • 出力が完全ではないかもしれません。
         #vim fileencoding:utf-8 
         import commands
         import codecs
         list = commands.getoutput('ls *.dat')
         fileList = list.split("\n")
         datList = []
         for file in fileList:
                 for dat in codecs.open(file,'r','utf-8'):
                         datList.append(dat.encode('utf-8'))
         tweetList = []
         swaplist = []
         tw = str()
         for dats in datList:
                 swaplist = dats.split()
                 index = swaplist.index('2010')#2010以下がtweet
                 tw = ""
                 for tweet in swaplist[index + 1:]:
                         tw += tweet
                 tweetList.append(tw)
         f = open('tweetList.txt', 'w')
         for tweet in tweetList:
                 f.write(tweet+'\n')
         f.close()

復習問題

  • "TwitterLog20100805-1600.dat" のファイルを読み込み、コメントだけを「Comment.txt」ファイルに書き出すプログラムを書け
    • ^M を削除すること
  • 必要な知識
    • ファイル読み込み
      	#!/usr/bin/env python
      	for line in open('TwitterLog20100805-1600.dat', 'r'):
      	    print line
    • ファイル書き込み
      	strs = "abc";
      	f = open('Comment.txt', 'w')
      	f.writelines(strs)
      	f.close()
    • "TwitterLog20100805-1600.dat" を読み込み "Comment.txt" にそのまま書き込む
      	#!/usr/bin/env python
      	
      	f = open('Comment.txt', 'w')
      	for line in open('TwitterLog20100805-1600.dat', 'r'):
      	        print line
      	        f.writelines(line)
      	f.close()
    • split 関数を利用して、タブで区切り、4番目の要素(つぶやきの内容)を"Comment.txt"に出力する
      	#!/usr/bin/env python
      	
      	f = open('Comment.txt', 'w')
      	for line in open('TwitterLog20100805-1600.dat', 'r'):
      	        print line
      	        items = line.split("\t")
      	        print items[3]
      	        f.writelines(items[3])
      	f.close()
    • 置換処理