fastTextでカテゴリ分類してみた

はじめに

こんにちは。分析基盤の構築などを担当している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}
echo $context | 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の凄さもありますが、大量のデータがあったからこそですね!
そんなデータを使って分析したい方、ぜひご応募お待ちしています!

分析基盤の構築や抽出作業の自動化、ETL周り等を担当しています。 気づいたら入社して1年経ってました。