ランダムフォレスト(機械学習)による文章分類
前置き
今回はランダムフォレストという手法で機械学習を行い文章の分類を行おうと思います。
例えばこのような生物医療に使われるデータベースがあったとします。
name of enzyme
alkaline phosphatases
comment
Comparison with alkaline phosphatases and 5-nucleotidase
name of enzyme
は酵素の名前で comment
はその酵素についてのコメントです。
このようなデータベースを普通使うことはないと思うのですが、とりあえずこちらを使います。
想像してみてください。
あなたは生物学者です。
あなたは研究で扱った酵素について一つ一つコメントをつけ、データベースに保存していました。
しかし、ある日不運なことに一部酵素の名前データーが破損してしまいました。
この時、あなたは酵素とコメントがセットになっているデータとコメントのみのデータを持っています。
そこであなたは紛失してしまった酵素の名前をコメントを元に復元したいと考えました。
そこで扱うのが機械学習ランダムフォレストです。
機械にコメントと酵素の名前を学習させて、その後コメントから酵素の名前を予測してもらいましょう。
ツール
機械学習するためのツールを準備します。
使用する言語はpythonで、ライブラリーとして gensim
と sklearn
を使用します
gensim
これはのちに説明するのですが、特徴ベクトルを作成するために使います。 特徴ベクトルとは機械がコメントを学習できるようにするために数値のベクトルで表されたものです。
sklearn
このライブラリーは機械学習などを行うために必要となるモジュールが豊富に含まれているものです。 今回はsklearnのランダムフォレストを使って学習を行います。
これらのライブラリーは pip install gensim
pip install sklearn
でインストールすることができます。とても簡単ですね!
それではまず、コメントから重要そうな単語を取り出します。
from gensim import corpora import mysql mysql = mysql.MySql() words = [] for line in mysql.read_medtag(): words.append(line["comment"].split(" ")) dictionary = corpora.Dictionary(words) dictionary.filter_extremes(no_below=3, no_above=0.3) dictionary.save_as_text('dict.txt')
このコードで何をしているか説明すると、
mysql = mysql.MySql() words = [] for line in mysql.read_medtag(): words.append(line["comment"].split(" "))
ここでデータベースからコメントを読み込み、スペースを区切りに文章を単語に分解して words
という配列に格納していきます。
そして残りのコード
dictionary = corpora.Dictionary(words) dictionary.filter_extremes(no_below=3, no_above=0.3) dictionary.save_as_text('dict.txt')
では特徴語を作成し、dict.txt
に保存しておきます。テキストに保存することで再度データベースを呼び出すことがなく、学習時間が節約できます。特にデータベースが大きいときには有効です。
corpora
とはgensim
に含まれているクラスでこちらを使い特徴語の辞書を作成します。
dictionary.filter_extremes(no_below=3, no_above=0.3)
では特徴語として相応しくない単語を除いております。 no_below
で指定された数値より下回る頻度で出現した単語は特徴語としてみなされず、また逆に no_above
で書かれた割合より多く出現している単語は除かれます。ただ単に出現頻度が高い単語を特徴後とするのはあまり良い考えではないからです。(I
He
などの単語は出現頻度は高いが重要ではない)
少し長くなってしまったので、次回にランダムフォレストの実装について説明しようと思います。