fastText : Tutorials : テキスト分類 (翻訳)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/06/2018 (0.1.0)
FAIR の fastText は単語表現とセンテンス分類の効率的な学習のためのライブラリです。
0.1.0 でドキュメントが整備されましたので、再翻訳しています。
* 本ページは、github 上の facebookresearch/fastText の website の Tutorials : Text classification を
動作確認・翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
テキスト分類は、スパム検出、センチメント解析やスマート返信のような多くのアプリケーションへの中心的な問題です。このチュートリアルでは、fastText ツールでどのようにテキスト分類器を構築するかを説明します。
テキスト分類とは何か?
テキスト分類の目標は (電子メール、投稿、テキスト・メッセージ、製品レビュー, etc… のような) ドキュメントを一つまたは複数のカテゴリーに割り当てることです。そのようなカテゴリーはレビュー・スコア、スパム v.s. 非スパム、あるいはそのドキュメントが打ち込まれた言語です。現今では、そのような分類器を構築するための優勢なアプローチは機械学習で、それはサンプルから分類ルールを学習します。そのような分類器を構築するためには、ラベル付けされたデータが必要です、これはドキュメントと対応するカテゴリー (or タグやラベル) で構成されます。
例として、Stack Exchange の料理についての質問をポット、ボウルやパン焼きのような幾つかの可能なタグの一つに自動的に分類する分類器を構築します。
fastText をインストールする
このチュートリアルの最初のステップは fastText をインストールしてビルドすることです。それは c++11 の良いサポートを持つ c++ コンパイラを必要とするだけです。
最も最近のリリース をダウンロードすることから始めましょう :
$ wget https://github.com/facebookresearch/fastText/archive/v0.1.0.zip $ unzip v0.1.0.zip
fastText ディレクトリに移動してそれをビルドします :
$ cd fastText-0.1.0 $ make
どのような引数もなしでバイナリを実行すると高位ドキュメントをプリントして、fastText によりサポートされる異なるユースケースを示します :
>> ./fasttext usage: fasttextThe commands supported by fasttext are: supervised train a supervised classifier quantize quantize a model to reduce the memory usage test evaluate a supervised classifier predict predict most likely labels predict-prob predict most likely labels with probabilities skipgram train a skipgram model cbow train a cbow model print-word-vectors print word vectors given a trained model print-sentence-vectors print sentence vectors given a trained model nn query for nearest neighbors analogies query for analogies
このチュートリアルでは、主として supervised, test と predict サブコマンドを使用します、これらはテキスト分類器の学習 (そして利用) に対応します。fastText の他の機能へのイントロダクションについては、単語ベクトルの学習についてのチュートリアル を見てください。
データを取得して準備する
イントロダクションで言及したように、教師あり分類器を訓練するためにはラベル付けされたデータが必要です。このチュートリアルで私達は、料理についての Stack Exchange 質問のトピックを自動的に認識する分類器を構築することに興味があります。質問のサンプルとそれらの関連付けられたタグを Stack Exchange の料理セクション からダウンロードしましょう :
>> wget https://s3-us-west-1.amazonaws.com/fasttext-vectors/cooking.stackexchange.tar.gz && tar xvzf cooking.stackexchange.tar.gz >> head cooking.stackexchange.txt
テキストファイルの各行はラベルのリスト、続いて対応するドキュメントを含みます。総てのラベルは __label__ prefix から始まり、これが fastText がどれがラベルでどれが単語かをどのように認識するかです。そしてモデルはドキュメントの単語が与えられたときラベルを予測するために訓練されます。
最初の分類器を訓練する前に、データを訓練用と検証用に分割する必要があります。学習された分類器が新しいデータ上でどの程度良いかを評価するために検証セットを使用します。
>> wc cooking.stackexchange.txt 15404 169582 1401900 cooking.stackexchange.txt
full データセットは 15404 サンプルを含みます。それを 12404 サンプルの訓練セットと 3000 サンプルの検証セットに分割しましょう :
>> head -n 12404 cooking.stackexchange.txt > cooking.train >> tail -n 3000 cooking.stackexchange.txt > cooking.valid
最初の分類器
最初の分類器を訓練する準備が今整いました :
>> ./fasttext supervised -input cooking.train -output model_cooking Read 0M words Number of words: 14598 Number of labels: 734 Progress: 100.0% words/sec/thread: 75109 lr: 0.000000 loss: 5.708354 eta: 0h0m
-input コマンドライン・オプションはファイルが訓練サンプルを含むことを示し、一方で -output オプションはモデルをどこにセーブするかを示します。訓練の最後に、訓練された分類器を含む、ファイル model_cooking.bin がカレント・ディレクトリ内に作成されます。
次のコマンドを実行して反復的に私達の分類器を直接テストすることが可能です :
>> ./fasttext predict model_cooking.bin -
そしてセンテンスをタイプします。最初に次のセンテンスを試しましょう :
Which baking dish is best to bake a banana bread ?
予測されたタグは baking でこれはこの質問に良く適合しています。2 番目のサンプルを試してみましょう :
Why not put knives in the dishwasher?
モデルにより予測されたラベルは food-safety で、これは関連性がありません。どういうわけか、モデルは単純なサンプル上で失敗するようです。その品質についてより良い感覚を得るために、次を実行することにより検証データ上でそれをテストしましょう :
>> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.124 R@1 0.0541 Number of examples: 3000
fastText の出力は適合率 (= precision) at one (P@1) と再現率 (= recall) at one (R@1) です :
>> ./fasttext test model_cooking.bin cooking.valid 5 N 3000 P@5 0.0668 R@5 0.146 Number of examples: 3000
上級読者のために: 適合率と再現率
適合率は fastText により予測されたラベル内で正しいラベルの数です。再現率は、実際のラベルの中で、成功的に予測されたラベルの数です。
これをより明瞭にするためにサンプルを考えましょう :
Why not put knives in the dishwasher?
Stack Exchange では、このセンテンスは 3 つのタグでラベル付けされています : equipment, cleaning と knives です。モデルに予測される top 5 ラベルは次で得られます :
>> ./fasttext predict model_cooking.bin - 5
その結果は food-safety, baking, equipment, substitutions そして bread です。
このように、モデルにより予測された 5 つのラベルから 1 つが正しいので、0.20 の適合率を与えます。3 つの実際のラベルからは、モデルから 1 つだけが予測されましたので、0.33 の再現率を与えます。
より詳細については、関連 Wikipedia ページ を見てください。
モデルをより良くする
デフォルト引数で fastText を実行することにより得られたモデルは新しい質問の分類について非常に悪いです。デフォルト・パラメータを変更することにより、パフォーマンスを改良してみましょう。
データを前処理する
データを見ますと、幾つかの単語が大文字と句読点を含んでいることを観察できます。モデルのパフォーマンスを改良するための最初のステップの一つは何某かの単純な前処理を適用することです。大雑把な正規化は sed と tr のようなコマンドライン・ツールを使用して得られます :
>> cat cooking.stackexchange.txt | sed -e "s/\([.\!?,'/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > cooking.preprocessed.txt >> head -n 12404 cooking.preprocessed.txt > cooking.train >> tail -n 3000 cooking.preprocessed.txt > cooking.valid
前処理されたデータ上で新しいモデルを訓練しましょう :
>> ./fasttext supervised -input cooking.train -output model_cooking Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 82041 lr: 0.000000 loss: 5.671649 eta: 0h0m h-14m >> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.164 R@1 0.0717 Number of examples: 3000
前処理のおかげで、語彙がより小さい (14k 単語から 9k) ことを観察します。適合率もまた 4% 上昇し始めています!
より多いエポックとより大きな学習率
デフォルトでは、fastText は訓練中に 5 回だけ各訓練サンプルを見ますが、訓練セットが 12k 訓練サンプルだけを持つと仮定した場合、これは非常に少ないです。各サンプルが見られる回数 (エポック数としても知られています) は -epoch オプションを使用して増やすことができます :
>> ./fasttext supervised -input cooking.train -output model_cooking -epoch 25 Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 77633 lr: 0.000000 loss: 7.147976 eta: 0h0m
新しいモデルをテストしてみましょう :
>> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.501 R@1 0.218 Number of examples: 3000
これは遥かに良いです!モデルの学習スピードを変更する他の方法はアルゴリズムの学習率を増加 (or 減少) することです。これは各サンプルの処理後にモデルをどれだけ変更するかに相当します。0 の学習率はモデルが全く変わらず、従って何も学習しないことを意味します。学習率の良い値は 0.1 – 1.0 の範囲にあります。
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 81469 lr: 0.000000 loss: 6.405640 eta: 0h0m >> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.563 R@1 0.245 Number of examples: 3000
更に良いです! 両者を一緒に試してみましょう :
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 76394 lr: 0.000000 loss: 4.350277 eta: 0h0m >> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.585 R@1 0.255 Number of examples: 3000
パフォーマンスを更に改良するために更に幾つかの特徴を追加しましょう。
単語 n-gram
最後に、単なるユニグラムの代わりに単語バイグラムを使用することでモデルのパフォーマンスを改良できます。これはセンチメント解析のような分類問題のためには特に重要です、そこでは語順が重要です。
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2 Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 75366 lr: 0.000000 loss: 3.226064 eta: 0h0m >> ./fasttext test model_cooking.bin cooking.valid N 3000 P@1 0.599 R@1 0.261 Number of examples: 3000
幾つかのステップで、12.4 % から 59.9 % の適合率 (@1) へと進むことができました。重要なステップは以下を含みます :
- データを前処理する ;
- エポック数を変更する (オプション -epoch を使用、標準的な範囲は [5 – 50]) ;
- 学習率を変更する (オプション -lr を使用、標準的な範囲は [0.1 – 1.0]) ;
- 単語 n-gram を使用する (オプション -wordNgrams を使用、標準的な範囲は [1 – 5]) ;
上級読者のために: バイグラムとは何か?
「ユニグラム」は単一の分割されないユニット、またはトークンとして参照され、通常はモデルへの入力として使用されます。例えばユニグラムはモデルに依拠して単語か文字であり得ます。fastText では、私達は単語レベルで作業しますので従ってユニグラムは単語になります。
同様に「バイグラム」により 2 つの連続するトークンあるいは単語の連結を示します。同様に任意の n 個の連続するトークンの連結を参照するためにしばしば n-gram について言及します。
例えば、センテンス ‘Last donut of the night’ 内で、ユニグラムは ‘last’, ‘donut’, ‘of’, ‘the’ そして ‘night’ です。バイグラムは : ‘Last donut’, ‘donut of’, ‘of the’ そして ‘the night’ です。
バイグラムは特に興味深いです、何故ならば殆どのセンテンスについて、bag of n-grams を見るだけで語順を再構築することができるからです。
これを単純な課題で示しましょう、次のバイグラムが与えられたとき、元のセンテンスを再構築してみましょう : ‘all out’, ‘I am’, ‘of bubblegum’, ‘out of’ そして ‘am all’。単語をユニグラムとして参照することは一般的です。
スケールアップ
モデルを数千のサンプル上で訓練していますので、訓練は数秒しかかかりません。しかし更に多いラベルを持つ、より巨大なデータセット上でのモデルの訓練は非常に遅くなり始める可能性があります。訓練をより速くするための可能性のある解法は通常の softmax の代わりに、階層的 softmax を使用することです。これはオプション -loss hs で成されます :
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2 -bucket 200000 -dim 50 -loss hs Read 0M words Number of words: 9012 Number of labels: 734 Progress: 100.0% words/sec/thread: 2199406 lr: 0.000000 loss: 1.718807 eta: 0h0m
今では訓練は 1 秒もかからないはずです。
結論
このチュートリアルでは、パワフルなテキスト分類器を訓練するために fastText をどのように使用するかの短い概要を与えました。調整するための最も重要なオプションの幾つかの軽い概要も含んでいます。
以上