7. クリーニング用のスクリプト
import csv
import re
#TW本文で入ってしまいがちな改行やカラムの分割をクリーニングします。
with open("test_akb.csv","rb") as infile , open("outfile.csv","wb") as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
#つぶやき部分に出現する分割されたカラムを結合し
#正規表現でアルファベットと数字以外にマッチしたら
#本来先頭のカラムに有るべきtwアカウントではないとざっくり処理
#本当はラインのカラム数でフィルターしたが良いのだけど(実装方法が…)
pat = re.compile("^[a-zA-Z0-9]")
for line in reader:
item = line[0]
if pat.match(item):
newline = line[:4] +['-'.join(line[4:])]
writer.writerow(newline)
11. 単語の出現頻度の分布
#データフレームからTW本文のみ書き出し平文コーパスとして出力しておきます
tws = pd.DataFrame(df, columns = ['txt'])
tws.to_csv('akb482.csv', sep='t', header=False, index=False,
encoding='utf-8')
NLTK(Natural Language Toolkit - 自然言語ツールキット)
を使って、以後テキストを自然言語処理していきます。
# -*- coding: utf-8 -*import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import nltk
from nltk.corpus.reader import *
from nltk.corpus.reader.util import *
from nltk.text import Text
12. 平文コーパスからトークン化
#ひらがな/漢字のようにセンテンスの語種から単語に分割
jp_sent_tokenizer = nltk.RegexpTokenizer(u'[^ 「」!?。]*[!?。]')
jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([a-z]+¦[ぁ-んー]+¦[ァ-ンー]+¦
[u4e00-u9FFF]+¦[^ぁ-んァ-ンu4e00-u9FFF]+)')
corpus = PlaintextCorpusReader("", r'akb48.txt',
encoding='utf-8',
para_block_reader=read_line_block,
sent_tokenizer=jp_sent_tokenizer,
word_tokenizer=jp_chartype_tokenizer)
stopwords = nltk.corpus.stopwords.words('english')
symbols = ["'", '"', '`', '.', ',', '-', '!', '?', ':', ';', '(',
')','。','、','「','」','!','-',' ','【','】','。-',';',':','#','[',']']
#単語の出現数をカウントしてみる
text = nltk.Text(corpus.words())
freq = nltk.FreqDist(text)
print "n".join("%st%d" % (w,f) for w,f in freq.items()[:50] if w not in symbols)
#分布図の作図
fdist = nltk.FreqDist(w.lower() for w in text if w not in stopwords + symbols)
fdist.plot(50, cumulative=True)