lispmeetup48 cl-online-learningによる文書分類

20
cl-online-learning による文書分類 Satoshi Imai Twitter: @masatoi 0 Github: masatoi

Upload: satoshi-imai

Post on 13-Apr-2017

457 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Lispmeetup48 cl-online-learningによる文書分類

cl-online-learningによる文書分類

Satoshi Imai Twitter: @masatoi0 Github: masatoi

Page 2: Lispmeetup48 cl-online-learningによる文書分類

文書分類

● 文書をカテゴリに分類するのが目標

– 応用例

● ニュース記事のジャンル分け

● スパムフィルタ

● SNSの感情分析

● 経済予測

● Common Lispのみでわりと簡単にできる!

Page 3: Lispmeetup48 cl-online-learningによる文書分類

どういうデータになる?

● 文書の中で単語が出現する回数をカウントしたベク

トル

● 文書群全体で出てくる単語の数が次元数になる

● 一つの文書の中で出現する単語は少ない

→ 高次元でかつ疎なベクトル

Page 4: Lispmeetup48 cl-online-learningによる文書分類

疎ベクトルの扱い方

● 値の入っている要素のインデックスとその値のペアを保

存しておけばいい (数十〜数百倍の高速化)

● 疎ベクトルの演算をいろいろ定義しておく

– 疎ベクトルと密ベクトルとの和、差、要素積

– 疎ベクトルの定数倍

(defstruct (sparse­vector (:constructor %make­sparse­vector))  (length 0 :type fixnum)  (index­vector #() :type (simple­array fixnum))  (value­vector #() :type (simple­array double­float)))

Page 5: Lispmeetup48 cl-online-learningによる文書分類

形態素解析器: cl-igo

● MeCab互換の形態素解析器

– MeCabの辞書をJavaプログラムで変換して使う

– 解析時はCommon Lispのみ

CL­USER> (igo:load­tagger "/path/to/igo/ipadic/")#<IGO::TAGGER {1003B89C43}>CL­USER> (igo:parse "隣の客はよく柿食う客だ。")(("隣" "名詞,一般,*,*,*,*,隣,トナリ,トナリ" 0) ("の" "助詞,連体化,*,*,*,*,の,ノ,ノ" 1) ("客" "名詞,一般,*,*,*,*,客,キャク,キャク" 2) ("は" "助詞,係助詞,*,*,*,*,は,ハ,ワ" 3) ("よく" "副詞,一般,*,*,*,*,よく,ヨク,ヨク" 4) ("柿" "名詞,一般,*,*,*,*,柿,カキ,カキ" 6) ("食う" "動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ" 7) ("客" "名詞,一般,*,*,*,*,客,キャク,キャク" 9) ("だ" "助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ" 10) ("。" "記号,句点,*,*,*,*,。,。,。" 11))

Page 6: Lispmeetup48 cl-online-learningによる文書分類

単語とインデックスの対応を取るハッシュ表

● 単語にインデックスを振りたい

– 単語の文字列をキーとするハッシュ表をつくる

– ハッシュ表に登録されていない単語に出会ったらカウン

タをインクリメントしてハッシュ表に登録していく

Page 7: Lispmeetup48 cl-online-learningによる文書分類

特徴量: TF-IDF

● Term Frequency–Inverse Document Frequency

● t: 単語、 d: 文書

● :文書d中の単語tの出現回数

● D : 全文書数

● df(t) : 単語tが出現する文書数

● 文書分類でよく使われる特徴量

Page 8: Lispmeetup48 cl-online-learningによる文書分類

特徴量: TF-IDF

● Term Frequency–Inverse Document Frequency

● t: 単語、 d: 文書

● :文書d中の単語tの出現頻度

● D : 全文書数

● df(t) : 単語tが出現する文書数

ある1文書の中で単語tがどれだけ重要か (dを固定すると疎ベクトル)

全文書を横断して単語tがどれだけ一般的か (密ベクトル)

Page 9: Lispmeetup48 cl-online-learningによる文書分類

線形分類器: cl-online-learning

● 線形分類の割と最近の手法までをカバー

– Quicklispから入る

– 二値分類器を複数個組み合わせてマルチクラス分類で

きる

– データが疎ベクトルの場合にも対応

– かなり速い

Page 10: Lispmeetup48 cl-online-learningによる文書分類

線形分類器: cl-online-learning

● 一個のデータ点の形式

– ラベル(二値分類の場合は+1/-1、マルチクラス分類の場

合は整数)とデータベクトル(密or疎)のcons

● データ点のシーケンス(リストorベクタ)がデータセッ

トになる

Page 11: Lispmeetup48 cl-online-learningによる文書分類

cl-online-learning: 使い方

(defparameter a9a­dim 123)(defparameter a9a­train (read­data "/path/to/a9a" a9a­dim))(defparameter a9a­test (read­data "/path/to/a9a.t" a9a­dim))

(defparameter arow­learner (make­arow a9a­dim 10d0))(train arow­learner a9a­train)(test arow­learner a9a­test)

データ読み込み

モデル定義、訓練、テスト

Page 12: Lispmeetup48 cl-online-learningによる文書分類

マルチクラス、疎ベクトルのとき

(defparameter mnist­dim 780)(defparameter mnist­train.sp  (read­data "/path/to/mnist.scale" mnist­dim :sparse­p t :multiclass­p t))(defparameter mnist­test.sp  (read­data "/path/to/mnist.scale.t" mnist­dim :sparse­p t :multiclass­p t))

(defparameter mnist­arow  (make­one­vs­one mnist­dim 10 'sparse­arow 10d0))

(defparameter mnist­arow  (make­one­vs­rest mnist­dim 10 'sparse­arow 10d0))

(train mnist­arow mnist­train)(test mnist­arow mnist­test)

データ読み込み

モデル定義、訓練、テスト one-vs-oneはクラス数KのときK(K-1)/2個の二値分類器が必要

Page 13: Lispmeetup48 cl-online-learningによる文書分類

マルチクラス、疎ベクトルのとき

(defparameter mnist­dim 780)(defparameter mnist­train.sp  (read­data "/path/to/mnist.scale" mnist­dim :sparse­p t :multiclass­p t))(defparameter mnist­test.sp  (read­data "/path/to/mnist.scale.t" mnist­dim :sparse­p t :multiclass­p t))

(defparameter mnist­arow  (make­one­vs­one mnist­dim 10 'sparse­arow 10d0))

(defparameter mnist­arow  (make­one­vs­rest mnist­dim 10 'sparse­arow 10d0))

(train mnist­arow mnist­train)(test mnist­arow mnist­test)

データ読み込み

モデル定義、訓練、テスト

one-vs-restはクラス数KのときK-1個の二値分類器が必要

Page 14: Lispmeetup48 cl-online-learningによる文書分類

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%

Page 15: Lispmeetup48 cl-online-learningによる文書分類

文書分類の例: 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年ぶりの新顔”が出た一般選出部門は、全国からの一般投票で選ばれる、とされている。

ところが、男性はジャニーズ事務所の、女性はエイベックスの芸能人ばかりが選出されていることがわかる。

Page 16: Lispmeetup48 cl-online-learningによる文書分類

文書分類の例: livedoorニュースコーパス

● 73021次元のデータが7367個

– 実際にはほとんどのデータで数百次元しか値が入ってい

ない疎なデータ

Page 17: Lispmeetup48 cl-online-learningによる文書分類

livedoorニュースコーパスの分類サンプルコード

● https://github.com/masatoi/cl-docclass

– ファイルのリストからtf-idfのリストを作る

– ディレクトリ構造からクラスラベルをつける

– 同じクラスラベルが連続すると学習に悪影響なので順序を

シャッフルする

● 7367個のデータのうち1000個をテストデータ、残りを訓

練データとして学習

– 10回平均でテストデータの正答率が95.5%

Page 18: Lispmeetup48 cl-online-learningによる文書分類

学習の進行過程

Page 19: Lispmeetup48 cl-online-learningによる文書分類

深層学習での例

● 深層学習でニュース記事を分類する

– http://qiita.com/hogefugabar/items/c27ed578717c

5e7288c0

– Denoising Autoencoderを3層重ねて事前学習してから

ファインチューニング

– テストデータで95%

● 線形分類器とほぼ同等。しかし計算速度は線形分

類器の方がはるかに速い

Page 20: Lispmeetup48 cl-online-learningによる文書分類

まとめ

● livedoorニュースコーパスからTF-IDFで特徴量を

作って線形分類器でマルチクラス分類した

● 高次元データでも疎なデータは効率的に計算でき

● 文書分類では深層学習でも線形分類器と大して差

はない。問題に応じて適切なモデルを選ぼう