BoW+SVMで文書分類(1)


はじめに

機械学習を用いドキュメント分類を行う為には、文書自体を数値(ベクトル)として扱う必要がある。文書を数値として扱う代表的な方法としては、Bag of Words(BoW)がある。これは、全文書中に登場する単語を並べて、各単語の出現頻度をベクトルで表す表現である。
今回、Livedoor Newsコーパスの各文書をBoWでベクトル化し、そのデータを用いて、カテゴリ分けする文書分類器を作成してみる。

Livedoor Newsコーパスについて

以下のURLよりLivedoor Newsコーパスをダウンロードできる。
Livedoor Newsコーパスは、ニュースカテゴリ毎にディレクトリが分かれている為、文書分類器作成の学習データとして適している。

Livedoor Newsコーパス
9カテゴリ、7386文書

各種インストール

Python3及び以下のライブラリ群を用いて実装した。

  • Mecab、mecab-python: 形態素解析
  • Gensim: Python用トピックモデルライブラリ
  • scikit-learn:Python用機械学習ライブラリ

手順

BoW+SVMでの文書分類器作成までの大まかな手順は以下の通り。

  1. Livedoor Newsコーパスの各文書をベクトル表現に変換
  2. Livedoor Newsコーパスをトレーニングデータとテストデータに分割
  3. SVMを使い学習
  4. SVMのパラメータ調整
  5. テストデータに適用

Livedoor Newsコーパスの各文書をベクトル表現に変換

BoWで各文書をベクトル表現に変換

機械学習を行う前準備として、各文書をBoWにてベクトル表現に変換する。
「はじめに」でも述べた通り、BoWとは全文書中に登場する単語を並べて、各文章でのそれぞれの単語の出現頻度を表したものである。
例えば、以下の2つの文書から各文書のベクトルを求めてみる。

これら2つの文書に登場する全単語を並べると以下の通りとなる。

上記から各文章のベクトルは、1番目の要素=単語”John”の出現回数、2番目の要素=単語”likes”の出現回数、、、といった形で表せる。
ちなみに上記(1)、(2)をベクトルで表すと以下の通りとなる。

実際には、文書量が多いと登場する単語数も膨大となる為、「全文書での出現頻度が極端に少ない単語」「どの文書にも登場するような一般的すぎるような単語」などは外してベクトルを作成する。
今回は、「出現頻度が20文書未満の単語」及び、「30%以上の文書で登場する単語」を排除した。この時点で、登場する総単語数は約9000となり、9000次元のベクトルとなった。

TF-IDFによる重み付け

ここで作成したBoWモデルに対して、より文書の特徴を捉えられるようTF-IDFを用いて重み付けを行った。
TFとはTerm Frequencyの略で、ある文書中の単語の出現頻度を表している。
DFとはDocument Frequencyの略で、どれくらいの文書でその単語が現れたのかを表しており、IDFとは、DFに対して対数を取ったものである。
この2つの値を掛けたものをそれぞれの単語の重みとしている。

LSIによる次元削減

さて、これである文書の特徴を表しているベクトルが作成できたわけであるが、このままではベクトルの次元数が大きすぎる為、学習コストが非常にかかってしまう。また有益な結果を得る為のサンプル数も非常に多くなってしまうのも問題である。
その為、文章の特徴を損なわなずにベクトルの次元削減を行う必要がある。

今回は、LSI(Latent Semantic Indexing)を用いて、次元削減を行ってみる。
LSIとは、SVD(Singular Value Decomposition:特異値分解)を用いた次元圧縮の方法で、単語の持つ潜在的な意味を軸に取ろうという発想である。
LSIを用いて、9000次元から300次元まで圧縮を行った。

今回は、機械学習の前準備として、文書群をそれぞれの文書の特徴を表しているベクトルに変換するところまでを行った。
次回は、これらのデータを用いて、学習及びパラメータ調整を行ってみる。

“BoW+SVMで文書分類(1)” への 1 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です