frequency with nltk

45
さくさくテキストマイニング勉強会 条件付き頻度分布 with NLTK ーコーパスの比較ー 早川 敦士

Upload: atsushi-hayakawa

Post on 05-Jul-2015

5.588 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Frequency with nltk

さくさくテキストマイニング勉強会

条件付き頻度分布 with NLTKーコーパスの比較ー

早川 敦士

Page 2: Frequency with nltk

http://www.slideshare.net/gepuro/に資料が公開されています。

Page 3: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 4: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 5: Frequency with nltk

自己紹介

早川 敦士電気通信大学電気通信学部

システム工学科 三年TwitterID: @gepuro

統計に興味津々なお年頃コンピュータサークルに所属

さくさくテキストマイニング勉強会の初心者代表

Page 6: Frequency with nltk

自己紹介

はてなダイアリーを始めました。http://d.hatena.ne.jp/gepuro/

サークルMicrocomputer Making Association

http://wiki.mma.club.uec.ac.jp/http://wiki.mma.club.uec.ac.jp/hayakawa

Page 7: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 8: Frequency with nltk

前回の反省

ツイートの取得を windows アプリケーション任せ↓

Tweepy に挑戦

グラフをプロットする時に助詞等が残ったまま↓

必要の無い語を削除

Page 9: Frequency with nltk

前回の反省

前回の反省を踏まえて、

4/9 〜 4/14 の間の自分のタイムラインとパブリックなタイムライン

の比較をしてみます。

Page 10: Frequency with nltk

前回の反省

テキストマイニングの成果がでるよう

意外な発見を期待して、

取り組みました。

Page 11: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 12: Frequency with nltk

ツイートの取得

●パブリックなタイムラインの取得

Api.public.timeline()なるものを使って

過去のパブリックタイムラインを取得しようとした。

Page 13: Frequency with nltk

ツイートの取得

●パブリックなタイムラインの取得

出来なかった。

パブリックタイムラインに対しては、過去のツイートに遡るような事が出来ない。

Page 14: Frequency with nltk

ツイートの取得

●パブリックなタイムラインの取得

現在から未来へかけて取得する方針に変更↓

VPS 上で5日間取得し続けました。

Page 15: Frequency with nltk

ツイートの取得

5日後

Page 16: Frequency with nltk

ツイートの取得

●自分のタイムラインの取得

比較が出来ることを楽しみにしながら、

自分の TL を過去に遡って取得を試みました。

Page 17: Frequency with nltk

ツイートの取得

API 制限

\ (^o^) /

Page 18: Frequency with nltk

ツイートの取得

●自分のタイムラインの取得

自分のタイムラインに対しては、

過去 800 件までしか取得できない。( 4/15 現在)

Page 19: Frequency with nltk

ツイートの取得

●自分のタイムラインの取得

涙を拭いながら、

http://dev.twitter.com/doc

を見てみると、ユーザー毎のタイムラインなら、

3200 件まで取得できる。

Page 20: Frequency with nltk

ツイートの取得

●自分のタイムラインの取得

フォローしている人のタイムラインを

順番に取得することに変更

Page 21: Frequency with nltk

ツイートの取得

予定が次々と変更したものの、

2種類のテキストが手に入った。

Page 22: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 23: Frequency with nltk

ゴミ取り

パブリックなタイムラインは複数の言語を含む↓

日本語だけに

形態素解析↓

名詞だけを残す(代名詞は除く)

Page 24: Frequency with nltk

ゴミ取り

●多言語を含むテキストから日本語を抽出

1行1ツイートのテキストファイル各行に対して、文字コードを変更する(例: shift-jis)

変更できなければ、日本語以外変更できれば、日本語 or英語

Page 25: Frequency with nltk

ゴミ取り

●多言語を含むテキストから日本語を抽出

アスキーコードに変更してみる。

出来なければ、日本語

Page 26: Frequency with nltk

ゴミ取り

●多言語を含むテキストから日本語を抽出

一部のツイートに対して、うまく作用しないものがありました。

↓大体OK

Page 27: Frequency with nltk

ゴミ取り

            /)

           ///)

          / ,.=゙ ''" /   

   /     i f   ,.r='"- '‐ つ___ _   こまけぇこたぁいいんだよ!!

   /       /     _,.- '~‐ /⌒  ⌒\

    /    ,i     , ⊃ ●二ニ ( ) . ● ( )\

    /     ノ    il゙フ ::::::⌒ ( __ 人 __ )⌒ ::::: \

       , イ「ト、   ,!,!|       |r┬-|       |

      /   i トヾヽ _/ ィ " \      ` ー '´     /

Page 28: Frequency with nltk

ゴミ取り

●テキストから名詞を取り出す

おなじみの

MeCabを使いました。

Page 29: Frequency with nltk

AGENDA

●自己紹介●前回の反省●ツイートの取得●ゴミ取り●条件付き頻度分布のプロット●参考資料

Page 30: Frequency with nltk

条件付き頻度分布のプロット

ここからは、

NLTK が使える。

頼むぞ!

Page 31: Frequency with nltk

条件付き頻度分布のプロット

●実行したこと その1テキストを読み込み、トークン化させる

@やRT 、 http といった必要の無いものを取り除く

1文字の語を取り除く

頻度の多い順にソート (vcb_tl)

Page 32: Frequency with nltk

条件付き頻度分布のプロット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()

Page 33: Frequency with nltk

条件付き頻度分布のプロット

●実行したこと その2PlaintextCorpusReader で

テキストを読み込む。

ConditionalFreqDist() で条件付き頻度分布の準備

Page 34: Frequency with nltk

条件付き頻度分布のプロット

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))

Page 35: Frequency with nltk

条件付き頻度分布のプロット

●実行したこと その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])

Page 36: Frequency with nltk

条件付き頻度分布のプロット

Page 37: Frequency with nltk

条件付き頻度分布のプロット

パブリックと比較して、地震というワードが多いが、

大震災が少ない。

tl_for_kaiseki.txt は 88,861 outcomespublic_for_kaiseki.txt は 447,175 outcomes

を考慮すれば、 TL にはかなりの頻度で大震災というワードが流れたことになる。

Page 38: Frequency with nltk

条件付き頻度分布のプロット

「こと」、「さん」、「今日」などの

一般的な言葉が含まれるので、

グラフの面白さが半減してしまう。

Page 39: Frequency with nltk

条件付き頻度分布のプロット

パブリックの上位100語に含まれる語を取り除いてみる

change = []for w in tl_utf: if not w in public_utf[:100]: change.append(w)

cfd.plot(samples=change[1:30])

Page 40: Frequency with nltk

条件付き頻度分布のプロット

Page 41: Frequency with nltk

条件付き頻度分布のプロット

特徴的に感じた語

知事、被災、震災、調布、必要、首相、普通

Page 42: Frequency with nltk

条件付き頻度分布のプロット

パブリックなタイムラインと自分のタイムラインを比較すると、違いを確認する事ができた。

特に、地域に関する部分で大きな違いを観測できた。

Page 43: Frequency with nltk

参考資料

出版 O'RELLY 入門 自然言語処理

Steven Bird, Ewan Klein, Edward Loper 著萩原 正人、中山 敬広、水野 貴明 訳

Page 44: Frequency with nltk

バイト及びインターンシップ先を探しています。

関心のある事柄テキストマイニング、データマイニング、

マーケティング、自然言語処理、統計学が関わる仕事、

Python,R言語

よろしくお願いします。

連絡先: hayakawa アットマーク mma.club.uec.ac.ジェイピー

Page 45: Frequency with nltk

おわり

ご清聴ありがとうございました。