frequency with nltk
TRANSCRIPT
さくさくテキストマイニング勉強会
条件付き頻度分布 with NLTKーコーパスの比較ー
早川 敦士
http://www.slideshare.net/gepuro/に資料が公開されています。
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
自己紹介
早川 敦士電気通信大学電気通信学部
システム工学科 三年TwitterID: @gepuro
統計に興味津々なお年頃コンピュータサークルに所属
さくさくテキストマイニング勉強会の初心者代表
自己紹介
はてなダイアリーを始めました。http://d.hatena.ne.jp/gepuro/
サークルMicrocomputer Making Association
http://wiki.mma.club.uec.ac.jp/http://wiki.mma.club.uec.ac.jp/hayakawa
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
前回の反省
ツイートの取得を windows アプリケーション任せ↓
Tweepy に挑戦
グラフをプロットする時に助詞等が残ったまま↓
必要の無い語を削除
前回の反省
前回の反省を踏まえて、
4/9 〜 4/14 の間の自分のタイムラインとパブリックなタイムライン
の比較をしてみます。
前回の反省
テキストマイニングの成果がでるよう
意外な発見を期待して、
取り組みました。
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
ツイートの取得
●パブリックなタイムラインの取得
Api.public.timeline()なるものを使って
過去のパブリックタイムラインを取得しようとした。
ツイートの取得
●パブリックなタイムラインの取得
出来なかった。
パブリックタイムラインに対しては、過去のツイートに遡るような事が出来ない。
ツイートの取得
●パブリックなタイムラインの取得
現在から未来へかけて取得する方針に変更↓
VPS 上で5日間取得し続けました。
ツイートの取得
5日後
ツイートの取得
●自分のタイムラインの取得
比較が出来ることを楽しみにしながら、
自分の TL を過去に遡って取得を試みました。
ツイートの取得
API 制限
\ (^o^) /
ツイートの取得
●自分のタイムラインの取得
自分のタイムラインに対しては、
過去 800 件までしか取得できない。( 4/15 現在)
ツイートの取得
●自分のタイムラインの取得
涙を拭いながら、
http://dev.twitter.com/doc
を見てみると、ユーザー毎のタイムラインなら、
3200 件まで取得できる。
ツイートの取得
●自分のタイムラインの取得
フォローしている人のタイムラインを
順番に取得することに変更
ツイートの取得
予定が次々と変更したものの、
2種類のテキストが手に入った。
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
ゴミ取り
パブリックなタイムラインは複数の言語を含む↓
日本語だけに
形態素解析↓
名詞だけを残す(代名詞は除く)
ゴミ取り
●多言語を含むテキストから日本語を抽出
1行1ツイートのテキストファイル各行に対して、文字コードを変更する(例: shift-jis)
変更できなければ、日本語以外変更できれば、日本語 or英語
ゴミ取り
●多言語を含むテキストから日本語を抽出
アスキーコードに変更してみる。
出来なければ、日本語
ゴミ取り
●多言語を含むテキストから日本語を抽出
一部のツイートに対して、うまく作用しないものがありました。
↓大体OK
ゴミ取り
/)
///)
/ ,.=゙ ''" /
/ i f ,.r='"- '‐ つ___ _ こまけぇこたぁいいんだよ!!
/ / _,.- '~‐ /⌒ ⌒\
/ ,i , ⊃ ●二ニ ( ) . ● ( )\
/ ノ il゙フ ::::::⌒ ( __ 人 __ )⌒ ::::: \
, イ「ト、 ,!,!| |r┬-| |
/ i トヾヽ _/ ィ " \ ` ー '´ /
ゴミ取り
●テキストから名詞を取り出す
おなじみの
MeCabを使いました。
AGENDA
●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料
条件付き頻度分布のプロット
ここからは、
NLTK が使える。
頼むぞ!
条件付き頻度分布のプロット
●実行したこと その1テキストを読み込み、トークン化させる
@やRT 、 http といった必要の無いものを取り除く
1文字の語を取り除く
頻度の多い順にソート (vcb_tl)
条件付き頻度分布のプロットf = open('tl.txt')raw = f.read()f.close()
token = re.split(' ', raw)
ngword = ['.', '/', '@', '://', 'http', '#', 'RT', '_', ':', '(', ')', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',']
clean = []for w in token: if not w in ngword: clean.append(w)
tl = []for w in clean: if len(w) > 3: tl.append(w)
fdist = nltk.FreqDist(tl)vcb_tl = fdist.keys()
条件付き頻度分布のプロット
●実行したこと その2PlaintextCorpusReader で
テキストを読み込む。
ConditionalFreqDist() で条件付き頻度分布の準備
条件付き頻度分布のプロット
from nltk.corpus import PlaintextCorpusReadercorpus_root = '.'wordlists = PlaintextCorpusReader(corpus_root, '.*', encoding='utf-8')
corpus = ['tl_for_kaiseki.txt', 'public_for_kaiseki.txt']
cfd = nltk.ConditionalFreqDist( (target, text) for target in corpus for text in wordlists.words(target))
条件付き頻度分布のプロット
●実行したこと その3
文字コードを utf-8 へ条件付き頻度分布表の表示
グラフの表示
tl_utf = [w.decode('utf-8') for w in voc_tl]
cfd.tabulate(samples=tl_utf[:20])cfd.plot(samples=tl_utf[:20])
条件付き頻度分布のプロット
条件付き頻度分布のプロット
パブリックと比較して、地震というワードが多いが、
大震災が少ない。
tl_for_kaiseki.txt は 88,861 outcomespublic_for_kaiseki.txt は 447,175 outcomes
を考慮すれば、 TL にはかなりの頻度で大震災というワードが流れたことになる。
条件付き頻度分布のプロット
「こと」、「さん」、「今日」などの
一般的な言葉が含まれるので、
グラフの面白さが半減してしまう。
条件付き頻度分布のプロット
パブリックの上位100語に含まれる語を取り除いてみる
change = []for w in tl_utf: if not w in public_utf[:100]: change.append(w)
cfd.plot(samples=change[1:30])
条件付き頻度分布のプロット
条件付き頻度分布のプロット
特徴的に感じた語
知事、被災、震災、調布、必要、首相、普通
条件付き頻度分布のプロット
パブリックなタイムラインと自分のタイムラインを比較すると、違いを確認する事ができた。
特に、地域に関する部分で大きな違いを観測できた。
参考資料
出版 O'RELLY 入門 自然言語処理
Steven Bird, Ewan Klein, Edward Loper 著萩原 正人、中山 敬広、水野 貴明 訳
バイト及びインターンシップ先を探しています。
関心のある事柄テキストマイニング、データマイニング、
マーケティング、自然言語処理、統計学が関わる仕事、
Python,R言語
よろしくお願いします。
連絡先: hayakawa アットマーク mma.club.uec.ac.ジェイピー
おわり
ご清聴ありがとうございました。