Upload
naoki-yanai
View
14.859
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Hadoop/Mahout/HBaseでテキスト分類器を作ったよ
2011/04/10(日) #TokyoWebmining10-2
yanaoki
2011年4月18日月曜日
目次
• 自己紹介• HBase• Mahout• Naive Bayes• システム構成• Web上のサンプルデータでの分類結果
2011年4月18日月曜日
自己紹介• 名前
• naoki yanai• 職業
• ネット広告エンジニア
• データに溢れた仕事だけど…
• データマイニング
• 昨年の春くらいから
• 最近Hadoopやデータマイニングの勉強会に参加してます
• おまけ
• 「さまったー」の作者
2011年4月18日月曜日
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日月曜日
HBase• データモデル• 列ファミリ―は、テーブル作成時に指定• 列ファミリ―内のメンバーを動的追加可能• 各セルにはタイムスタンプを持ち世代の値を取り出すことも可能
セル
メンバー(qualifier)
2011年4月18日月曜日
Mahout• データマイニングのライブラリ• Hadoopと組み合わせて分散並列処理
• 大規模データを想定• アルゴリズムによってHBaseに対応
• アルゴリズムによってはローカルでも直列でも実行可能• 多数のアルゴリズムをサポート• Classifier / Clustering / Pattern Mining
• Recommenders / Collaborative Filtering
• Evolutionary Algorithms ... などなど
マホート?マハウト?
2011年4月18日月曜日
Mahout
• まだまだ情報は少ない• 参考にしたもの• 公式サイト• Mahoutのソースコード
• Mahout in Action(PDF)
• hamadakoichiさんのブログ
• TokyoWebminingの過去資料
2011年4月18日月曜日
Naive Bayes• 特徴変数「F1,...,Fn」が与えたられた時のクラスCの確率。ベイズの定理より、
• 分母はC に依存しないので考慮しない。また分子は乗法定理から次のように変形、
条件付き独立性を仮定すると、
• 事後確率が最大となるクラスを選択
2011年4月18日月曜日
Naive Bayes• ドキュメントのカテゴリ分類にも応用
• モデルの複雑化
• 各単語の相関をとるとモデルが複雑になるため、独立性を仮定
• アンダーフロー問題
• 各単語の確率は一般に小さく、その積は非常に小さい値のため対数をとる
• ゼロ頻度問題
• 訓練データに現れない単語の確率はゼロのため、ある程度の値を与える(スムージング)
2011年4月18日月曜日
Naive Bayes
• 1.データ準備(訓練データ、評価データ)• フォーマット、ノイズ除去、など
• 2.訓練フェーズ(パラメータを与える)• モデルを作成
• 3.評価フェーズ• 精度が悪ければ、前フェーズに戻る
• 4.推定• 作成したモデルを用い未知のデータのカテゴリ推定
2011年4月18日月曜日
インターネット上のサイトの自動カテゴリ分類
• あるWebサイトが、どのカテゴリに属するのか判定
• サイトを分類
• 訪問者を分類
• サイトをリンクしているツイート分類
• なんのために?
• サジェスト、アイテムレコメンド、効果的な広告など、サービスの付加価値
2011年4月18日月曜日
システムフォーマット処理
クローラー
訓練・評価処理
・ドキュメント・訓練したモデル
推定処理2011年4月18日月曜日
クローラー• 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日月曜日
クローラー• 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日月曜日
クローラー
行キー(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日月曜日
フォーマット処理• HBase上の文書をベイズ分類器の訓練・評価データ用に整形
category_id <TAB> 本文
• HBaseからMaprReduceで以下の処理して、HDFS上に出力
• 形態素解析• 分かち書き• 精度をあげるために辞書を改良• Wikipediaのタイトルをダウンロードし辞書に追加
• 品詞を限定(名詞・動詞)し、それ以外の情報を落とす2011年4月18日月曜日
訓練・評価処理• mahoutコマンドを使用
訓練$ mahout trainclassifier オプション...評価$ mahout testclassifier オプション…
• mahoutコマンドのオプション
• --input/--output:入力パス/出力パス
• --dataSource:モデルの出力場所。HDFSまたはHBase。
• --gramSize:N-gramのサイズ
• --classifierType:分類器のアルゴリズムタイプ。ベイズまたは補完ベイズ。
• --alpha:スムージング
• --minDF/--minSupport:ドキュメントの最小頻度/単語の最小頻度
2011年4月18日月曜日
訓練・評価処理• 訓練されたモデルは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日月曜日
推定処理• バッチ処理にて、カテゴリ未知のドキュメントを推定する。• 今回のシステム構成では、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日月曜日
推定処理
行キー(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日月曜日
Web上のサンプルデータでの分類結果
2011年4月18日月曜日
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日月曜日
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日月曜日
Web上のサイトを分類
• 結果• 訓練・評価ポイント• スムージング(パラメータalpha)の値を変える
1 0.5 0.1 0.01 0.001
正解率
65.38% 65.83% 66.73% 66.82% 67.02%
2011年4月18日月曜日
Web上のサイトを分類
• 結果• 訓練・評価ポイント• N-Gramの値を変える
unigram bigram
正解率 63.57% 66.09%
4/18追加スライド
2011年4月18日月曜日
Web上のサイトを分類
• 結果• 訓練・評価ポイント• 文書の形態素解析にて、名詞/動詞のみを使用
全品詞 名詞+動詞のみ
正解率 56.8% 65.38%
2011年4月18日月曜日
Web上のサイトを分類
• 結果• 訓練・評価ポイント• 名詞動詞のみ、かつ形態素の原形を使う
そのまま 原形に変換
正解率 67.02% 67.88%
4/18追加スライド
2011年4月18日月曜日
まとめ• 精度はまだまだ低い気がする• 元データ量を増やしたり、フォーマットを工夫する
• 分類器をHBase/Mahoutで行うメリット
• 各処理がスケールするため、最適なモデルを作る時間的計画がたてやすい
• HBaseは大量のクローラーの書き込みにも耐えられる(はず)
2011年4月18日月曜日
ありがとうございました。
2011年4月18日月曜日