http://blog.csdn.net/thriving_fcl/article/details/53239856
最近在一個項目里使用了fasttext[1], 這是facebook今年開源的一個詞向量與文本分類工具,在學術上沒有什么創新點,但是好處就是模型簡單,訓練速度又非常快。我在最近的一個項目里嘗試了一下,發現用起來真的很順手,做出來的結果也可以達到上線使用的標准。
其實fasttext使用的模型與word2vec的模型在結構上是一樣的,拿cbow來說,不同的只是在於word2vec cbow的目標是通過當前詞的前后N個詞來預測當前詞,在使用層次softmax的時候,huffman樹葉子節點處是訓練語料里所有詞的向量。
而fasttext在進行文本分類時,huffmax樹葉子節點處是每一個類別標簽的詞向量,在訓練的過程中,訓練語料的每一個詞也會得到對應的詞向量,輸入為一個window內的詞對應的詞向量,hidden layer為這幾個詞的線性相加,相加的結果作為該文檔的向量,再通過層次softmax得到預測標簽,結合文檔的真實標簽計算loss,梯度與迭代更新詞向量。
fasttext有別於word2vec的另一點是加了ngram切分這個trick,將長詞再通過ngram切分為幾個短詞,這樣對於未登錄詞也可以通過切出來的ngram詞向量合並為一個詞。由於中文的詞大多比較短,這對英文語料的用處會比中文語料更大。
此外,fasttext相比deep learning模型的優點是訓練速度極快。我們目前使用fasttext來進行客戶填寫的訂單地址到鎮這一級別的分類。每一個省份建立一個模型,每個模型要分的類別都有1000多類,200萬左右的訓練數據,12個線程1分鍾不到就可以訓練完成,最終的分類准確率與模型魯棒性都比較高(區縣級別分類正確准確率高於99.5%, 鎮級別高於98%),尤其是對縮寫地名,或者漏寫了市級行政區、區縣級行政區的情況也都可以正確處理。
參數方面
-
loss function選用hs(hierarchical softmax)要比ns(negative sampling) 訓練速度要快很多倍,並且准確率也更高。
-
wordNgrams 默認為1,設置為2以上可以明顯提高准確率。
-
如果詞數不是很多,可以把bucket設置的小一點,否則預留會預留太多bucket使模型太大。
因為facebook提供的只是C++版本的代碼,原本還以為要自己封裝一個python接口,結果上github一搜已經有封裝的python接口了[2]。用起來特別方便,覺得還不能滿足自己的使用要求,修改源碼也非常方便。
對於同樣的文本分類問題,后來還用單向LSTM做了一遍,輸入pre-trained的embedding詞向量,並且在訓練的時候fine-tune,與fasttext對比,即使使用了GTX 980的GPU,訓練速度還是要慢很多,並且,准確准確率和fasttext是差不多的。
所以對於文本分類,先用fasttext做一個簡單的baseline是很適合的。
[1]https://github.com/facebookresearch/fastText
[2]https://github.com/salestock/fastText.py