#はじめに
Facebookが開発したfastText。
今までの自然言語ツールよりも高速で学習や分類をするらしいです。(この記事は速度比較ではありません)
以前は単語極性辞書を使って、文に含まれている単語を辞書と照らし合わせ、そのスコアの平均を出すという手法でやってみたことがあります。しかしこの方法だと「①この商品は値段が高い」と「②この商品は精度が高い」が同じようなスコアになってしまう可能性があります。
(①は値段が高いためネガティブな発言であるのに対し、②は精度が高いのでポジティブな発言)
fastTextはこれとは異なる手法であり、気になったので使ってみました。
今回は、分類です。
テキストの分類ができると、レビューの解析や、メールの仕分けなどが行えます。
#実行環境
- PCスペック
- OS : Ubuntu 16.04
- CPU : core i7 7700
- GPU : GeForce GTX 1080
- RAM : 32GB
- ソフトウェアバージョン
- python(Anaconda) => 3.6.1
- fasttext => 0.8.3
- pyknp => 0.3
#用意するもの
- 教師データ
- 分類したいデータ
#前処理
fastTextは以下のようなフォーマットでなければ読み込んでくれません。
__label__*, 今日 は 良い 天気 です 。
※「*」にはクラスナンバーを入れてください。
つまり、もしポジティブとネガティブの二値分類をしたい場合は、__label__1,
と__label__2,
の二種類が必要になります。
私はまずそれぞれのファイルを作成し、最後に1つにまとめました。
では早速、用意した教師データを上記のフォーマットにしましょう。
##手順① 形態素解析(分かち書き)
今回は形態素解析ツールはJUMAN++を使用します。
この他にもMeCabなどがよく使われています。
def make_wakati():
morps = pyknp.Jumanpp().analysis(sentence).mrph_list()
wakatis = [m.midasi for m in morps]
return " ".join(wakatis)
上記で分かち書きしたものをファイル出力しておきましょう。
##手順② ラベル付け
分かち書きした文の頭に__label__*,
を追加します。
※「*」には適切な数値を入れてください。
sed -i -e "s/^/__label__*,/" ファイル名
##手順③ ファイルを1つにまとめる
__label__1,
や__label__2,
が文頭に書かれたそれぞれのファイルを1つにまとめます。
ファイル名はmodel.txt
としました。
cat ファイル1 ファイル2 > model.txt
前処理は終了です!
#fastTextの使い方
##学習(model生成)
先ほど作成したmodel.txt
をfastTextに学習させましょう。
学習は簡単でsupervised
で読み込むだけ。
以下のコードで出力されるのはmodel.bin
です。
import fastText as ft
ft.supervised('model.txt', 'model')
##分類
def predict(wakati):
classifier = ft.load_model('model.bin')
estimate = classifier.predict_proba([wakati], k=2)
print(estimate)
#感想
以上で簡単に分類ができます。
今回はデータがある前提で書きましたが、教師データを集める場合は、
TwitterAPIなどを利用するとすぐに集まりそうな気がします。
注意点として、Twitterで取得した場合、キレイな文章でないことが多いと思います。(文末に「。」がなかったり、正確な日本語になっていない)
形態素解析をする際に、記号などが含まれているとうまくいかないので、予め日本語のみを抽出するか、スペースや記号等を削除する必要がありますね。
ありがとうございました。