2019-09-09 16:33:11
問題描述:fastText是如何進行文本分類的。
問題求解:
fastText是一種Facebook AI Research在16年開源的一個文本分類器。 其特點就是fast。相對於其它文本分類模型,如SVM,Logistic Regression和neural network等模型,fastText在保持分類效果的同時,大大縮短了訓練時間。
fastText專注於文本分類,在許多標准問題上的分類效果非常好。
- 訓練fastText
trainDataFile = 'train.txt'
classifier = fasttext.train_supervised(
input = trainDataFile,
label_prefix = '__label__',
dim = 256,
epoch = 50,
lr = 1,
lr_update_rate = 50,
min_count = 3,
loss = 'softmax',
word_ngrams = 2,
bucket = 1000000)
classifier.save_model("Model.bin")
在訓練fastText的時候有兩點需要特別注意,一個是word_ngrams,一個是loss,這兩個是fastText的精髓所在,之后會提到。
在使用fastText進行文本訓練的時候需要提前分詞,這里的ngrams是根據分詞的結果來組織架構的;
事實上在訓練文本分類的時候有個副產物就是word2vec,fastText在實現文本分類的時候其實和cbow非常類似,就是把word2vec求和之后過了一個fc進行的分類。
- 使用fastText進行預測
使用fastText進行預測是非常簡單的,可以直接使用下述的代碼進行預測。
testDataFile = 'test.txt'
classifier = fasttext.load_model('Model.bin')
result = classifier.test(testDataFile)
print '測試集上數據量', result[0]
print '測試集上准確率', result[1]
print '測試集上召回率', result[2]
- Bag of tricks for efficient text classification
1)分層softmax:對於類別過多的類目,fastText並不是使用的原生的softmax過交叉熵,而是使用的分層softmax,這樣會大大提高模型的訓練和預測的速度。
2)n-grams:fastText使用了字符級別的n-grams來表示一個單詞。對於單詞“apple”,假設n的取值為3,則它的trigram有
“<ap”, “app”, “ppl”, “ple”, “le>”
其中,<表示前綴,>表示后綴。於是,我們可以用這些trigram來表示“apple”這個單詞,進一步,我們可以用這5個trigram的向量疊加來表示“apple”的詞向量。
這帶來兩點好處:
1. 對於低頻詞生成的詞向量效果會更好。因為它們的n-gram可以和其它詞共享。
2. 對於訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字符級n-gram向量。
- fastText 運行速度快的原因
1)多線程訓練:fastText在訓練的時候是采用的多線程進行訓練的。每個訓練線程在更新參數時並沒有加鎖,這會給參數更新帶來一些噪音,但是不會影響最終的結果。無論是 google 的 word2vec 實現,還是 fastText 庫,都沒有加鎖。線程的默認是12個,可以手動的進行設置。
2)分層softmax:fastText在計算softmax的時候采用分層softmax,這樣可以大大提高運行的效率。
- fastText 所有可選參數
The following arguments are mandatory:
-input training file path
-output output file path
The following arguments are optional:
-verbose verbosity level [2]
The following arguments for the dictionary are optional:
-minCount minimal number of word occurrences [1]
-minCountLabel minimal number of label occurrences [0]
-wordNgrams max length of word ngram [1]
-bucket number of buckets [2000000]
-minn min length of char ngram [0]
-maxn max length of char ngram [0]
-t sampling threshold [0.0001]
-label labels prefix [__label__]
The following arguments for training are optional:
-lr learning rate [0.1]
-lrUpdateRate change the rate of updates for the learning rate [100]
-dim size of word vectors [100]
-ws size of the context window [5]
-epoch number of epochs [5]
-neg number of negatives sampled [5]
-loss loss function {ns, hs, softmax} [softmax]
-thread number of threads [12]
-pretrainedVectors pretrained word vectors for supervised learning []
-saveOutput whether output params should be saved [0]
The following arguments for quantization are optional:
-cutoff number of words and ngrams to retain [0]
-retrain finetune embeddings if a cutoff is applied [0]
-qnorm quantizing the norm separately [0]
-qout quantizing the classifier [0]
-dsub size of each sub-vector [2]
