LoginSignup
18
28

More than 5 years have passed since last update.

fastTextのための前処理と使い方

Last updated at Posted at 2018-02-18

はじめに

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などがよく使われています。

wakati.py
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です。

model.py
import fastText as ft
ft.supervised('model.txt', 'model')    

分類

classifier.py
def predict(wakati):
    classifier = ft.load_model('model.bin')
    estimate = classifier.predict_proba([wakati], k=2)
    print(estimate)

感想

以上で簡単に分類ができます。
今回はデータがある前提で書きましたが、教師データを集める場合は、
TwitterAPIなどを利用するとすぐに集まりそうな気がします。
注意点として、Twitterで取得した場合、キレイな文章でないことが多いと思います。(文末に「。」がなかったり、正確な日本語になっていない)
形態素解析をする際に、記号などが含まれているとうまくいかないので、予め日本語のみを抽出するか、スペースや記号等を削除する必要がありますね。

ありがとうございました。

18
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
28