29
Hadoop/Mahout/HBaseテキスト分類器を作ったよ 2011/04/10(日) #TokyoWebmining10-2 yanaoki 2011418日月曜日

Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Hadoop/Mahout/HBaseでテキスト分類器を作ったよ

2011/04/10(日) #TokyoWebmining10-2

yanaoki

2011年4月18日月曜日

Page 2: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

目次

• 自己紹介• HBase• Mahout• Naive Bayes• システム構成• Web上のサンプルデータでの分類結果

2011年4月18日月曜日

Page 3: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

自己紹介• 名前

• naoki yanai• 職業

• ネット広告エンジニア

• データに溢れた仕事だけど…

• データマイニング

• 昨年の春くらいから

• 最近Hadoopやデータマイニングの勉強会に参加してます

• おまけ

• 「さまったー」の作者

2011年4月18日月曜日

Page 4: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

HBase• KeyValueストア

• 大規模なデータに対しランダムなread/writeに優れている• goal is the hosting of very large tables -- billions of rows ,

millions of columns ...

• Hadoopのファイルシステムを利用

• CAP定理ではC,P

• C:一貫性,A:可用性,P:ネットワーク分断耐性

• 自動Sharding

• Hadoop/MapReduceとの連携2011年4月18日月曜日

Page 5: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

HBase• データモデル• 列ファミリ―は、テーブル作成時に指定• 列ファミリ―内のメンバーを動的追加可能• 各セルにはタイムスタンプを持ち世代の値を取り出すことも可能

セル

メンバー(qualifier)

2011年4月18日月曜日

Page 6: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Mahout• データマイニングのライブラリ• Hadoopと組み合わせて分散並列処理

• 大規模データを想定• アルゴリズムによってHBaseに対応

• アルゴリズムによってはローカルでも直列でも実行可能• 多数のアルゴリズムをサポート• Classifier / Clustering / Pattern Mining

• Recommenders / Collaborative Filtering

• Evolutionary Algorithms ... などなど

マホート?マハウト?

2011年4月18日月曜日

Page 7: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Mahout

• まだまだ情報は少ない• 参考にしたもの• 公式サイト• Mahoutのソースコード

• Mahout in Action(PDF)

• hamadakoichiさんのブログ

• TokyoWebminingの過去資料

2011年4月18日月曜日

Page 8: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Naive Bayes• 特徴変数「F1,...,Fn」が与えたられた時のクラスCの確率。ベイズの定理より、

• 分母はC に依存しないので考慮しない。また分子は乗法定理から次のように変形、

条件付き独立性を仮定すると、

• 事後確率が最大となるクラスを選択

2011年4月18日月曜日

Page 9: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Naive Bayes• ドキュメントのカテゴリ分類にも応用

• モデルの複雑化

• 各単語の相関をとるとモデルが複雑になるため、独立性を仮定

• アンダーフロー問題

• 各単語の確率は一般に小さく、その積は非常に小さい値のため対数をとる

• ゼロ頻度問題

• 訓練データに現れない単語の確率はゼロのため、ある程度の値を与える(スムージング)

2011年4月18日月曜日

Page 10: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Naive Bayes

• 1.データ準備(訓練データ、評価データ)• フォーマット、ノイズ除去、など

• 2.訓練フェーズ(パラメータを与える)• モデルを作成

• 3.評価フェーズ• 精度が悪ければ、前フェーズに戻る

• 4.推定• 作成したモデルを用い未知のデータのカテゴリ推定

2011年4月18日月曜日

Page 11: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

インターネット上のサイトの自動カテゴリ分類

• あるWebサイトが、どのカテゴリに属するのか判定

• サイトを分類

• 訪問者を分類

• サイトをリンクしているツイート分類

• なんのために?

• サジェスト、アイテムレコメンド、効果的な広告など、サービスの付加価値

2011年4月18日月曜日

Page 12: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

システムフォーマット処理

クローラー

訓練・評価処理

・ドキュメント・訓練したモデル

推定処理2011年4月18日月曜日

Page 13: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

クローラー• Rubyで作成

• ExtractContentで本文抽出

テキストrequire "open-uri"require "extractcontent"

html = open("http://news.nifty.com/....htm").readbody, title = ExtractContent::analyse(html)

puts body.toutf8 #=> 本文のHTML

2011年4月18日月曜日

Page 14: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

クローラー• Rubyで作成

• scrAPIでお手軽スクレイピング

テキストrequire 'scrapi'require 'open-uri'

scr = Scraper.define do process "div.tweet", "tweets[]"=> :text result :tweetsend

tweets = scr.scrape(URI.parse("http://togetter.com/li/121476"), :parser_options => {:char_encoding => 'utf8'})

tweets.each{ |tw| puts tw } #=> まとめツイートのみ

2011年4月18日月曜日

Page 15: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

クローラー

行キー(URL)列ファミリー列ファミリー

行キー(URL)content categories

http://togetter/1.html 都知事選の候補者... category:src=”togetter”category:cat=”social”

http://news.nifty.com/....html AKB卒業の... category:src=”nifty”

category:cat=”entertainment”

http://groups.google.com/group/webmining-tokyo/

【開催日程確定】 第10回 データマイニング…

http://ameblo.jp/....html KARAの…

• カテゴリやジャンルが付与されたRSSをクロールし、HBaseに書きこむ

• 同じサイトを2度クロールしないように、行キーでチェック

2011年4月18日月曜日

Page 16: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

フォーマット処理• HBase上の文書をベイズ分類器の訓練・評価データ用に整形

category_id <TAB> 本文

• HBaseからMaprReduceで以下の処理して、HDFS上に出力

• 形態素解析• 分かち書き• 精度をあげるために辞書を改良• Wikipediaのタイトルをダウンロードし辞書に追加

• 品詞を限定(名詞・動詞)し、それ以外の情報を落とす2011年4月18日月曜日

Page 17: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

訓練・評価処理• mahoutコマンドを使用

訓練$ mahout trainclassifier オプション...評価$ mahout testclassifier オプション…

• mahoutコマンドのオプション

• --input/--output:入力パス/出力パス

• --dataSource:モデルの出力場所。HDFSまたはHBase。

• --gramSize:N-gramのサイズ

• --classifierType:分類器のアルゴリズムタイプ。ベイズまたは補完ベイズ。

• --alpha:スムージング

• --minDF/--minSupport:ドキュメントの最小頻度/単語の最小頻度

2011年4月18日月曜日

Page 18: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

訓練・評価処理• 訓練されたモデルはHBase上のテーブルに保存される。がキーのテーブルが自動生成される)

• 評価結果の見方=======================================================Summary-------------------------------------------------------Correctly Classified Instances          :       1884       82.2348%Incorrectly Classified Instances        :        407       17.7652%Total Classified Instances              :       2291=======================================================Confusion Matrix-------------------------------------------------------a       b       c       d       e       <--Classified as216     32      22      155     0        |  425         a     = t0       514     13      70      0        |  597         b     = s0       2       514     9       0        |  525         c     = e1       8       13      638     0        |  660         d     = b0       0       67      15      2        |  84          e     = aDefault Category: unknown: 5

2011年4月18日月曜日

Page 19: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

推定処理• バッチ処理にて、カテゴリ未知のドキュメントを推定する。• 今回のシステム構成では、reducerの中で処理し、HBaseを更新するようにした。

// 分類器のインスタンス生成BayesParameters params = new BayesParameters();params.set("alpha_i", "1");algorithm = new CBayesAlgorithm();datastore = new HBaseBayesDatastore("model_table_name", params);classifier = new ClassifierContext(algorithm, datastore);

// カテゴリ推定ClassifierResult category = classifier.classifyDocument(doc.toArray(new String[doc.size()]), "default");

String label = category.getLabel();

2011年4月18日月曜日

Page 20: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

推定処理

行キー(URL)列ファミリー列ファミリー

行キー(URL)content categories

http://togetter/1.html 都知事選の候補者... category:src=”togetter”category:cat=”social”

http://news.nifty.com/....html AKB卒業の... category:src=”nifty”

category:cat=”entertainment”

http://groups.google.com/group/webmining-tokyo/

【開催日程確定】 第10回 データマイニング…

category:cat=”technology”

http://ameblo.jp/....html KARAの… category:cat=”entertainment”

• 未分類のサイトのカテゴリを推定し、更新する

2011年4月18日月曜日

Page 21: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサンプルデータでの分類結果

2011年4月18日月曜日

Page 22: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類• Google NewsやTogetterなど、カテゴリやジャンルがが付与されているRSSをもとにクロール

• 2月~4月くらいのデータ• データ量が少なくてすみません…。

• 内容は恐ろしく地震と原発に偏ってます…。

• データの7割を訓練に使う。残り3割を評価に使うカテゴリ名 文書数 文書量

a アニメ 935 5.2Mb ビジネス 5,112 7.2Me エンタメ 3,746 8.1Ms 社会 4,737 12Mt 技術 3,969 9.2M

2011年4月18日月曜日

Page 23: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類• 結果• 学習データと評価データで同じデータ

4/18追加スライド

=======================================================Summary-------------------------------------------------------Correctly Classified Instances          :      13388        91.6798%Incorrectly Classified Instances        :       1215         8.3202%Total Classified Instances              :      14603

=======================================================Confusion Matrix-------------------------------------------------------a         b         c         d         e         <--Classified as2328      19        515       250       0          |  3112       a     = t3         2939      54        20        0          |  3016       b     = e32        3         3542      109       0          |  3686       c     = s33        16        128       3877      0          |  4054       d     = b1         27        2         3         702        |  735        e     = aDefault Category: unknown: 5

2011年4月18日月曜日

Page 24: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類

• 結果• 訓練・評価ポイント• スムージング(パラメータalpha)の値を変える

1 0.5 0.1 0.01 0.001

正解率

65.38% 65.83% 66.73% 66.82% 67.02%

2011年4月18日月曜日

Page 25: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類

• 結果• 訓練・評価ポイント• N-Gramの値を変える

unigram bigram

正解率 63.57% 66.09%

4/18追加スライド

2011年4月18日月曜日

Page 26: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類

• 結果• 訓練・評価ポイント• 文書の形態素解析にて、名詞/動詞のみを使用

全品詞 名詞+動詞のみ

正解率 56.8% 65.38%

2011年4月18日月曜日

Page 27: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

Web上のサイトを分類

• 結果• 訓練・評価ポイント• 名詞動詞のみ、かつ形態素の原形を使う

そのまま 原形に変換

正解率 67.02% 67.88%

4/18追加スライド

2011年4月18日月曜日

Page 28: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

まとめ• 精度はまだまだ低い気がする• 元データ量を増やしたり、フォーマットを工夫する

• 分類器をHBase/Mahoutで行うメリット

• 各処理がスケールするため、最適なモデルを作る時間的計画がたてやすい

• HBaseは大量のクローラーの書き込みにも耐えられる(はず)

2011年4月18日月曜日

Page 29: Hadoop/Mahout/HBaseで テキスト分類器を作ったよ

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

2011年4月18日月曜日