はじめに
こんにちは。分析基盤の構築などを担当しているnaganotです。
この記事はistyleアドベントカレンダーの16日目の記事です。
今回はFacebookが開発したfastTextを使ってカテゴリ分類器を作ってみようと思います。
またせっかくなので@コスメのクチコミデータを使ってネガポジ判定をやってみます。
作り方は公式githubを参考にしました。
環境
以下の環境で実施しました。
- CPU Intel Core i5-7200U CPU 2.50GHz 2コア
- メモリ 2GB
- ディスク SSD 40GB
- OS ubuntu 16.04
- 要MeCab
※virtualbox上の仮想マシンです。
データの準備
@コスメのクチコミは「おすすめ度」という評価が0~7までついているので、これをカテゴリにします。
データは多いほど精度が高くなりそうですが、メモリがそれほど多くないため今回は20万件使用しました。
まずfastTextの仕様として、データを以下のようなフォーマットに変換する必要があります。
____label____1, 分かち書きした文章分かち書きした文章分かち書きした文章
____label____2, 分かち書きした文章分かち書きした文章分かち書きした文章
____label____3, 分かち書きした文章分かち書きした文章分かち書きした文章
※__label__の後にある値が分類するカテゴリ。今回の場合は0~7までの数値
今回の場合もとのCSVデータが
1,文章文章文章文章文章
2,文章文章文章文章文章
3,文章文章文章文章文章
のような形なので以下のコマンドで変換します。
$ mecab base.csv -O wakati -o wakati.txt #MeCabで分かち書き
$ sed -e "s/^/__label__/g" wakati.txt > input.txt #先頭に__label__を付与
学習
以下のコマンドを実行すれば学習が始まります。
$ fasttext supervised -dim 300 -thread 2 -epoch 20 -input input.txt -output model
dimやepoch、その他のパラメータなどもいろいろ調整できます。
これで今回の環境だと2分くらいで作成が完了し、model.vecとmodel.binという二つのファイルができます。
めちゃくちゃ早いですね!
検証
以下のコマンドで学習後のモデルを使った分類ができます。
$ fasttext predict ./model.bin text.txt
※text.txtに分かち書きした文章が入る。
今回は以下のようなシェルを作りました。
#!/bin/bash
context={1}
echocontext | mecab -Owakati > ./test_contents
fasttext predict ./model.bin ./test_contents
rm ./test_contents
実際にやってみた結果です。
まずは極端な言い方で
「最高です」 ⇒ __label__7
「最悪です」 ⇒ __label__0
「最低です」 ⇒ __label__0
いい感じですね!
もう少し微妙な感じにすると、、
「普通でした」 ⇒ __label__3
「良かったです」 ⇒ __label__4
「良かったです!」 ⇒ __label__4
「すごい良かったです!」 ⇒ __label__5
「いまいちでした」 ⇒ __label__2
「今日はいい天気です」 ⇒ __label__4
これもそれっぽくできているような気がします。
せっかくなのでコスメのレビューっぽいことを言ってみます。
「リピします」 ⇒ __label__3
「リピ確定です。」 ⇒ __label__5
「二度と買いません」 ⇒ __label__0
「また買いたいと思います。」 ⇒ __label__5
「リピします」と「リピ確定です。」では後者のほうが強そうなのであっていることにします。
ややこしい感じにしてみます。
「結構よかったです。」 ⇒ __label__4
「割とよかったです。」 ⇒ __label__3
「思ったより悪かったです。」 ⇒ __label__1
「思ったより悪くなかったです。」 ⇒ __label__1
「悪くなかったです。」 ⇒ __label__3
「思ったより悪くなかった」が1は違う気がしますが、それ以外は何となくあってそうです。
この辺りも入力データを増やせば精度が上がるかもしれません。
最後に
簡単にネガポジの分類器が作れたのはfastTextの凄さもありますが、大量のデータがあったからこそですね!
そんなデータを使って分析したい方、ぜひご応募お待ちしています!