lispmeetup48 cl-online-learningによる文書分類
TRANSCRIPT
cl-online-learningによる文書分類
Satoshi Imai Twitter: @masatoi0 Github: masatoi
文書分類
● 文書をカテゴリに分類するのが目標
– 応用例
● ニュース記事のジャンル分け
● スパムフィルタ
● SNSの感情分析
● 経済予測
● Common Lispのみでわりと簡単にできる!
どういうデータになる?
● 文書の中で単語が出現する回数をカウントしたベク
トル
● 文書群全体で出てくる単語の数が次元数になる
● 一つの文書の中で出現する単語は少ない
→ 高次元でかつ疎なベクトル
疎ベクトルの扱い方
● 値の入っている要素のインデックスとその値のペアを保
存しておけばいい (数十〜数百倍の高速化)
● 疎ベクトルの演算をいろいろ定義しておく
– 疎ベクトルと密ベクトルとの和、差、要素積
– 疎ベクトルの定数倍
(defstruct (sparsevector (:constructor %makesparsevector)) (length 0 :type fixnum) (indexvector #() :type (simplearray fixnum)) (valuevector #() :type (simplearray doublefloat)))
形態素解析器: cl-igo
● MeCab互換の形態素解析器
– MeCabの辞書をJavaプログラムで変換して使う
– 解析時はCommon Lispのみ
CLUSER> (igo:loadtagger "/path/to/igo/ipadic/")#<IGO::TAGGER {1003B89C43}>CLUSER> (igo:parse "隣の客はよく柿食う客だ。")(("隣" "名詞,一般,*,*,*,*,隣,トナリ,トナリ" 0) ("の" "助詞,連体化,*,*,*,*,の,ノ,ノ" 1) ("客" "名詞,一般,*,*,*,*,客,キャク,キャク" 2) ("は" "助詞,係助詞,*,*,*,*,は,ハ,ワ" 3) ("よく" "副詞,一般,*,*,*,*,よく,ヨク,ヨク" 4) ("柿" "名詞,一般,*,*,*,*,柿,カキ,カキ" 6) ("食う" "動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ" 7) ("客" "名詞,一般,*,*,*,*,客,キャク,キャク" 9) ("だ" "助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ" 10) ("。" "記号,句点,*,*,*,*,。,。,。" 11))
単語とインデックスの対応を取るハッシュ表
● 単語にインデックスを振りたい
– 単語の文字列をキーとするハッシュ表をつくる
– ハッシュ表に登録されていない単語に出会ったらカウン
タをインクリメントしてハッシュ表に登録していく
特徴量: TF-IDF
● Term Frequency–Inverse Document Frequency
● t: 単語、 d: 文書
● :文書d中の単語tの出現回数
● D : 全文書数
● df(t) : 単語tが出現する文書数
● 文書分類でよく使われる特徴量
特徴量: TF-IDF
● Term Frequency–Inverse Document Frequency
● t: 単語、 d: 文書
● :文書d中の単語tの出現頻度
● D : 全文書数
● df(t) : 単語tが出現する文書数
ある1文書の中で単語tがどれだけ重要か (dを固定すると疎ベクトル)
全文書を横断して単語tがどれだけ一般的か (密ベクトル)
線形分類器: cl-online-learning
● 線形分類の割と最近の手法までをカバー
– Quicklispから入る
– 二値分類器を複数個組み合わせてマルチクラス分類で
きる
– データが疎ベクトルの場合にも対応
– かなり速い
線形分類器: cl-online-learning
● 一個のデータ点の形式
– ラベル(二値分類の場合は+1/-1、マルチクラス分類の場
合は整数)とデータベクトル(密or疎)のcons
● データ点のシーケンス(リストorベクタ)がデータセッ
トになる
cl-online-learning: 使い方
(defparameter a9adim 123)(defparameter a9atrain (readdata "/path/to/a9a" a9adim))(defparameter a9atest (readdata "/path/to/a9a.t" a9adim))
(defparameter arowlearner (makearow a9adim 10d0))(train arowlearner a9atrain)(test arowlearner a9atest)
データ読み込み
モデル定義、訓練、テスト
マルチクラス、疎ベクトルのとき
(defparameter mnistdim 780)(defparameter mnisttrain.sp (readdata "/path/to/mnist.scale" mnistdim :sparsep t :multiclassp t))(defparameter mnisttest.sp (readdata "/path/to/mnist.scale.t" mnistdim :sparsep t :multiclassp t))
(defparameter mnistarow (makeonevsone mnistdim 10 'sparsearow 10d0))
(defparameter mnistarow (makeonevsrest mnistdim 10 'sparsearow 10d0))
(train mnistarow mnisttrain)(test mnistarow mnisttest)
データ読み込み
モデル定義、訓練、テスト one-vs-oneはクラス数KのときK(K-1)/2個の二値分類器が必要
マルチクラス、疎ベクトルのとき
(defparameter mnistdim 780)(defparameter mnisttrain.sp (readdata "/path/to/mnist.scale" mnistdim :sparsep t :multiclassp t))(defparameter mnisttest.sp (readdata "/path/to/mnist.scale.t" mnistdim :sparsep t :multiclassp t))
(defparameter mnistarow (makeonevsone mnistdim 10 'sparsearow 10d0))
(defparameter mnistarow (makeonevsrest mnistdim 10 'sparsearow 10d0))
(train mnistarow mnisttrain)(test mnistarow mnisttest)
データ読み込み
モデル定義、訓練、テスト
one-vs-restはクラス数KのときK-1個の二値分類器が必要
cl-online-learning: ベンチマーク
● a9aデータ (二値分類)
● MNIST (マルチクラス分類)
データ読み込みから学習完了までの時間
テストデータでの正答率
cl-online-learning(AROW, Sparse)
26.0 secs 94.65%
LIBLINEAR 146.8 secs 91.69%
データ読み込みから1000エポック学習するまでの時間
テストデータでの正答率
cl-online-learning(AROW, Sparse)
3.829 secs 84.964066%
AROW++ (C++) 58.328 secs 84.989%
文書分類の例: livedoorニュースコーパス
● livedoorニュースの記事を9カテゴリに分けたもの
– http://www.rondhuit.com/download.html#ldcc
●http://news.livedoor.com/article/detail/5914835/2011-10-05T18:12:00+0900毎年話題になるベストジーニスト賞の偏り今年のベストジーニスト一般選出部門に相葉雅紀、黒木メイサが選出された。その選出が“5年ぶりの新顔”と話題になっている。
・ベストジーニスト2011に相葉雅紀&黒木メイサ 5年ぶり“新顔”
“5年ぶりの新顔”とは一体どういうことなのか、過去の記録を確認してみたところ、驚くべき結果が明らかになった。
ベストジーニストには、一般選出部門と協議会選出部門がある。“5年ぶりの新顔”が出た一般選出部門は、全国からの一般投票で選ばれる、とされている。
ところが、男性はジャニーズ事務所の、女性はエイベックスの芸能人ばかりが選出されていることがわかる。
文書分類の例: livedoorニュースコーパス
● 73021次元のデータが7367個
– 実際にはほとんどのデータで数百次元しか値が入ってい
ない疎なデータ
livedoorニュースコーパスの分類サンプルコード
● https://github.com/masatoi/cl-docclass
– ファイルのリストからtf-idfのリストを作る
– ディレクトリ構造からクラスラベルをつける
– 同じクラスラベルが連続すると学習に悪影響なので順序を
シャッフルする
● 7367個のデータのうち1000個をテストデータ、残りを訓
練データとして学習
– 10回平均でテストデータの正答率が95.5%
学習の進行過程
深層学習での例
● 深層学習でニュース記事を分類する
– http://qiita.com/hogefugabar/items/c27ed578717c
5e7288c0
– Denoising Autoencoderを3層重ねて事前学習してから
ファインチューニング
– テストデータで95%
● 線形分類器とほぼ同等。しかし計算速度は線形分
類器の方がはるかに速い
まとめ
● livedoorニュースコーパスからTF-IDFで特徴量を
作って線形分類器でマルチクラス分類した
● 高次元データでも疎なデータは効率的に計算でき
る
● 文書分類では深層学習でも線形分類器と大して差
はない。問題に応じて適切なモデルを選ぼう