pei’s blog

情報系の大学を出たSE1年生。主にプログラミング(機械学習寄り)の話題を書いていきます。

機械学習でテキスト分類器を作る


 今回は私が作った機械学習を使った教師ありデータを用いるテキスト分類器(ざっくりいうと例えばテキストがスパムかそうでないかを自動で識別するなど)のシステム構成について説明します。

 教師ありデータとは答えとデータがセットになっているデータのことです(例えばこのテキストはスパム、このテキストはスパムじゃないっていう答えがテキストと組みになったデータ)。

 機械学習を知らない人ややり始めたばかりの人の参考になれば嬉しいです。
 また、使うと容易に機能を実現できるライブラリについても書いておきました。

流れ


ドキュメントの下処理


ベクトル化


分類器を学習・推論


 全体の流れは右の図の通りです。
 ドキュメントの下処理とは、記号や数字など分類に不要な情報を取り除くことです。
 次にその下処理したドキュメントを分類器が処理できるようなデータの形に変換します。
 最後に分類器を学習させます。実際に分類する場合はここで推論を行います。
 ここからそれぞれの工程を詳しく見ていきます。
 データセットどうするの?とか交差検証など性能評価については長くなるので省略します。

ドキュメントの下処理

 ここでは単語に分割、記号・数字の除去、ストップワードの除去などを行います。ストップワードとは「私」、「です」、「ます」などの不要な情報です。
 単語の分割にはjanomeMeCabといったライブラリを用います。英語であればもともと単語の間に空白があるので分割が容易です。

ベクトル化



 前の段階で単語に分割され、不要な情報が除去されたデータをベクトル化します。ベクトル化の対象とする単語を選び、その単語をベクトル化(重み付け)します。今回は単語の順序を考えず出現回数のみを考えるBaf of Words手法を使います。

 ここのベクトル化の仕方で性能が非常に変わってしまいます。また、選ぶ単語の個数によって分類器全体の実行時間、性能が大きく変わります。
 単語の選び方、ベクトル化方法は右の表の通りです。今回は構成についての記事のため詳しいことは書きません。

 PythonであればsklearnのVectorizerを使うと簡単にTFIDFや出現確率のベクトルが生成できるのでおすすめです。

 相互情報量を使った単語の選び方とOkapi BM25については詳しく書いた記事があるのでそちらを見てください。
 ちなみに私が作ったシステムでは単語の選び方は相互情報量、ベクトル化はOkapi BM25+を使い、単語数を2000個にしました。

peiprog.hatenablog.com
peiprog.hatenablog.com

分類器の学習・推論

 前の段階でベクトル化したデータを分類器に学習・推論させます。今回は教師あり学習の手法を使います。これは答えとデータがセットになっているデータを使って学習する手法です(例えばこのテキストはスパム、このテキストはスパムじゃないっていう答えがテキストと組みになったデータ)。

 分類器にはBag of Words手法で生成したベクトルならベイジアンフィルタサポートベクターマシンSVM)、(全結合)ニューラルネットワークなどが使えます。それぞれの仕組みについては超長くなるので省略します。
 SVMベイジアンフィルタリングならsklearn、ニューラルネットワークならkerasなどを使うと容易に実現できます。

 ちなみに私は3層の全結合ニューラルネットワークを使いました。全結合層とDropout層、活性化関数を3層重ねたオーソドックス?なネットワーク構成です。


まとめ

 テキスト分類システムの構成についてざっくり書いてみました。
 工程が多く、ベクトル化にも様々な方法があったり、分類器も多くの種類があったり大変に見えますが、sklearnやtensorflowなど非常に便利なライブラリがあり容易にシステムが実現できるので是非手を動かして楽しんで見てください!