Your SlideShare is downloading. ×
  • Like
Datamining04 textmining
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Datamining04 textmining

  • 6,015 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,015
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
80
Comments
0
Likes
16

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Wikipediaによるテキストマイニング入門 @nokuno #TokyoWebmining 2010/05/16
  • 2. アジェンダ 1. はじめに 2. テキストマイニング入門 3. Wikipediaデータの解析 4. まとめ 2
  • 3. 1. はじめに 3
  • 4. 自己紹介  Twitter: @nokuno  はてな:id:nokuno  Social IME開発者  自然言語処理とか  RとかPRMLとか  Web業界でプログラマをやってます 4
  • 5. 概要 「Wikipediaのデータ」を題材に、 「テキストマイニング」の基本について話します Wikipedia テキストマイニング Webテキスト 自然言語処理 中規模データ 機械学習 構造データ 知識発見 5
  • 6. Wikipediaデータベースとは Wikipediaの全記事データをXML形式で ダウンロードできる(無料)  圧縮状態で1.1GB、解凍後の本文だけで1.3GB  クローラを使わないでください  スパムサイトを作らないでください(泣 http://ja.wikipedia.org/wiki/Wikipedia:データベースダウンロード 6
  • 7. 結論 みんな寄付してね☆ 7
  • 8. 2. テキストマイニング入門 8
  • 9. テキストマイニングの流れ テキストデータを入力して、統計データを出力する 本文抽出 前処理 形態素解析 統計量の抽出 いろいろ変える 統計量の集計 定型処理 頻度順にソート 9
  • 10. 開発環境 LinuxやPythonを使ったことのない人は、 適宜置き換えて見てください  OS: CentOS 5.4 (64bit)  CPU: Dual-Core AMD Opteron 1210  Memory: 4GB  HDD: 1.5TB  プログラミング言語:Python 10
  • 11. Wikipediaデータベース ダウンロードして解凍してみても、 なんだかよく分からんXMLデータになってる $ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 $ ls –lh -rw-rw-r-- 1 nokuno nokuno 1.1G 3月 13 17:50 jawiki-latest-pages-articles.xml.bz2 $ bzip2 -d < jawiki-latest-pages-articles.xml.bz2 | head <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" <siteinfo> <sitename>Wikipedia</sitename> <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3 <generator>MediaWiki 1.16alpha-wmf</generator> 11
  • 12. 本文抽出 Wikipediaに特化したツールWP2TXTを使います http://wp2txt.rubyforge.org/ $ wp2txt jawiki-latest-pages-articles.xml.bz2 –o plain –l –d -t コマンド 元データ オプション $ ls -lh plain/ 合計 1.3G -rw-rw-r-- 1 nokuno nokuno 11M 3月 13 21:38 jawiki-latest-pages-articles.xml-001.txt -rw-rw-r-- 1 nokuno nokuno 11M 3月 13 21:39 jawiki-latest-pages-articles.xml-002.txt ・・・ -rw-rw-r-- 1 nokuno nokuno 5.1M 3月 13 22:33 jawiki-latest-pages-articles.xml-128.txt 12
  • 13. 本文抽出後のデータ 英語には単語がスペースでわかち書きされているが、 日本語なので単語に分割する必要がある。 $ head plain/jawiki-latest-pages-articles.xml-002.txt [[東京オリンピック]] 東京オリンピック(Games of the XVIII Olympiad)は、1964年に日本の東京で開か れた第18回夏季オリンピック。 日本で初めてのオリンピックである。また、アジア地域における初のオリンピックと なった。歴史的には、第二次世界大戦で敗戦した日本が、再び国際社会に復帰する シンボル的な意味を持った。 また、1940年代から1960年代にかけてヨーロッパ諸国やアメリカによる植民地支配 を破り、次々と独立を成し遂げたアジアやアフリカ諸国による初出場が相次ぎ、過去 最高の出場国数となった。 13
  • 14. 形態素解析 mecabを使ってわかち書きすると、 単語ごとにスペース区切りになります。 $ cat plain/*.txt | mecab -Owakati > wakati.txt $ head wakati.txt アンパサンド (, &) と は 「 ~ と … 」 を 意味 する 記号 で ある 。 英語 の に 相 当 する ラテン語 の の 合 字 で 、 を と 記述 する こと が ある の は その ため 。 Z に 続く ラテン 文字 アルファベ ット の 27 字 目 と さ れ た 時期 も ある 。 記号 名 の 「 アンパサンド 」 は 、 ラテン語 の 「 & は それ 自身 " and " を 表す 」 から き て いる 。 プログラミング 言語 で は 、 C など 多数 の 言語 で AND 演算 子 として 用い ら れる 。 以下 は C の 例 。 14
  • 15. 統計量の抽出 統計を取りたい単位で1行になるよう分解する。 今回は単語なので、単語の出現頻度が求まる。 $ sed -e “s/ /¥n/g” wakati.txt > unigram_raw.txt $ head unigram_raw.txt 統計量の例 アンパサンド (, 単語の出現頻度 &) と 単語の連接頻度 は 品詞の連接頻度 「 単語の長さの分布 ~ と … ※欲しい統計量によって処理が異なる 」 15
  • 16. 統計量の集計 sort と uniq –c で一発だが、 処理時間がかかるので注意 $ time sort unigram_raw.txt | uniq -c > unigram_count.txt real 858m21.881s user 634m50.300s sys 0m34.462s $ head -1000 unigram_count.txt | tail 4 (・∀・) 3( 9( ) 1 ( ^^ 367 (、 ※ここが遅ければHadoopで分散するのがおすすめ 16
  • 17. 頻度によるカットオフ 低頻度語は必要ないので切り捨てると、 この後の計算量を大幅に減らすことができる $ threshold.py < unigram_count.txt > unigram_threshold.txt threshold.py #!/usr/bin/python import sys for line in sys.stdin: (freq, word) = line.strip().split(" ", 1) if int(freq) >= 10: print freq, word 頻度10未満の単語をカットオフすると、 データ量が1.6GBから38MBに減少! 17
  • 18. 頻度順にソート 高頻度の語を知りたいので、頻度順にソートする $ sort –nr < unigram_threshold.txt > unigram.txt $ head unigram.txt 13299512 の 12465063 、 9252722 。 8292049 に 助詞の頻度が多い 7887615 は 日本語の性質を表 6665658 を している 6312389 た 5814518 が 5699061 で 4210801 て 出現頻度 単語 18
  • 19. 処理のまとめ 全部の処理をまとめると、以下のようになる cat plain/*.txt ¥ ← 入力:プレーンテキスト | mecab –Owakati ¥ ← 形態素解析 | sed -e "s/ /¥n/g" ¥ ← 単語ごとに出力 | sort ¥ ← 単語でソート | uniq –c ¥ ← 同じ単語をカウント | threshold.py ¥ ← 低頻度語をカット | sort –nr ¥ ← 出現頻度でソート > unigram.txt ← 出力:単語の出現頻度 19
  • 20. 3. Wikipediaデータの解析 20
  • 21. 単語の使用頻度 単語の使用頻度も、いろいろ比較してみると面白い 例1: YahooとGoogleを比較してみると… $ egrep "Yahoo|Google|ヤフー|グーグル" unigram.txt | head 1819 Google 1814 Yahoo 250 ヤフー 227 グーグル 例2: 曜日対決とか… 例3: 男性 VS 女性 $ egrep "曜日" unigram.txt | head $ egrep "男性|女性" unigram.txt 5188 日曜日 59747 女性 5129 土曜日 29723 男性 4437 金曜日 3087 月曜日 2153 木曜日 21
  • 22. 単語の連接頻度(Nグラム) 1行1単語にする代わりに、1行N単語にすればOK $ cat plain/*.txt | mecab -Owakati | ngram.py -n 2 | sort | uniq -c | threshold.py | sort -nr > bigram.txt $ head bigram.txt た 。 2533413 ngram.py(コア部分) は 、 1766469 for line in sys.stdin: て いる 1658736 words = line.split() さ れ 1557955 for i in range(len(words)-n): し た 1550797 print " ".join(words[i:i+n]) で ある 1248466 し て 1189456 ある 。 1174078 22
  • 23. 単語の関連度抽出(PMI) 相互情報量により関連語抽出 単独の出現頻度によるバイアスを取り除く $ head pmi2.txt P( x) P( y ) 語ろ う 14.914123 PMI ( x, y )   ln SANSPO . 14.904073 P( x, y) つけれ ば 14.894320 罪刑法定 主義 14.894222 x: 単語1 譲ろ う 14.884564 y: 単語2 ディレク TV 14.884564 P(x): 単語1の出現確率 P(y): 単語2の出現確率 一昔 前 14.884468 P(x,y): 単語1と単語2の連接確率 北蒲原 郡 14.884172 東蒲原 郡 14.883664 23
  • 24. 品詞の頻度/連接頻度 Mecabの機能で品詞を出力し、その頻度を集計 $ cat plain/*.txt | mecab -F “%f[0] “ | ngram.py -n 2 | sort | uniq -c | sort -nr > pos-bigram.txt $ cat plain/*.txt | mecab -F "%F-[0,1,2,3,4,5]¥n" | sort | uniq -c | sort -nr > detail-unigram.txt $ head pos-bigram.txt $ head detail-unigram.txt 57171199 名詞 名詞 52272673 名詞-一般 48260752 名詞 助詞 26332520 助詞-格助詞-一般 34616174 助詞 名詞 25200654 名詞-サ変接続 20892571 記号 名詞 12892080 助詞-連体化 15128482 助詞 動詞 12474855 記号-読点 13697491 名詞 記号 10718807 名詞-数 7260792 名詞 動詞 9714020 助詞-係助詞 6898083 動詞 助動詞 9254576 記号-句点 6042161 動詞 記号 8251500 名詞-接尾-一般 5835910 助詞 記号 6428869 助動詞特殊・タ-基本形 24
  • 25. 読み+単語の頻度 読みを付与して単語の頻度を求める $ cat plain/*.txt | mecab -F "%f[8]¥t%m¥n" -U "%m¥t%m¥n" | sort | uniq -c | threshold.py | sort -nr > yomi-unigram.txt $ head yomi-unigram.txt $ grep "^タン" yomi-unigram.txt | head ノ の 13406477 タントー 担当 55347 、 、 12466311 タンジョー 誕生 21875 。 。 9253307 タンイ 単位 20013 ニ に 8296579 タンドク 単独 11744 ワ は 7891955 タンニ 単に 11324 ヲ を 6668753 タン 単 10308 タ た 6316055 タンジュン 単純 9696 ガ が 5816995 タンマツ 端末 8048 デ で 5700954 タンコーボン 単行本 5854 タンペン 短編 5781 25
  • 26. 読み+単語の連接頻度 読み付きunigramとbigramを連結して辞書作成、 grepを駆使して予測変換・漢字変換もどき $ cat yomi-bigram.txt yomi-unigram.txt | sort -nr | combine.py > yomi.txt $ grep "^ニホン" yomi.txt | head $ grep "^ジショノ " yomi.txt | head ニホンゴ 日本語 24611 ジショノ 辞書 の 202 ニホンシャ に 本社 9701 ジショノ 地所 の 36 ニホンテレビ 日本テレビ 9501 ジショノ 字書 の 13 ニホンカイ 日本海 4266 ジショノ 自書 の 11 ニホンゴデ 日本語 で 4045 ニホンゴノ 日本語 の 3866 ※Ctrl+V <TAB>でタブ文字を入力できます ニホン に ほん 3386 ニホンゴバン 日本語 版 3189 ニホンショキ 日本書紀 2687 ニホンコークー 日本航空 2175 26
  • 27. 余談:ソースコード分析 LinuxカーネルのC言語のソースコード、 約300MBのテキストデータを分析した  人工言語に自然言語処理の手法を適用した  予約語の使用頻度ランキングとかが分かる $ grep -f clang.txt unigram.txt | head 744082 struct 640613 if 461066 int 361736 return 290246 static 226806 void 218881 unsigned 203139 for 27
  • 28. 4. まとめ 28
  • 29. Wikipediaのデータは便利 Wikipediaはテキストマイニングの題材の宝庫で、 無料でデータが手に入るので素晴らしい  今回使わなかった情報もいっぱい  リンク構造  カテゴリやリダイレクトなど  テキストマイニング以外にも使える  グラフマイニング  オントロジー生成 29
  • 30. テキストマイニングは簡単 頻度カウントという単純な手法でも、 それなりに面白い結果が出る  高度な手法は遅い  クラスター分析はかなり重い  SVMとかやらなくても、NaiveBayesで十分?  頻度カウントの特徴  離散データならではの性質を利用  低頻度のデータを捨てることで圧縮  数学的には多項分布の最尤推定 30
  • 31. ご清聴ありがとうございました 31
  • 32. テキストマイニングの流れ テキストデータを入力して、統計データを出力する 本文抽出 <mediawiki xmlns=~ 形態素解析 日本で初めてのオリンピックで~ 日本 で 初めて の オリンピック で~ 統計量の抽出 日本 統計量の集計 で 422363 日本 頻度順にソート 5699061で 32