1. 程式人生 > >FastText 文字分類使用心得

FastText 文字分類使用心得

最近在一個專案裡使用了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%),尤其是對縮寫地名,或者漏寫了市級行政區、區縣級行政區的情況也都可以正確處理。

引數方面

  1. loss function選用hs(hierarchical softmax)要比ns(negative sampling) 訓練速度要快很多倍,並且準確率也更高。

  2. wordNgrams 預設為1,設定為2以上可以明顯提高準確率。

  3. 如果詞數不是很多,可以把bucket設定的小一點,否則預留會預留太多bucket使模型太大。

因為facebook提供的只是C++版本的程式碼,原本還以為要自己封裝一個python介面,結果上github一搜已經有封裝的python介面了[2]。用起來特別方便,覺得還不能滿足自己的使用要求,修改原始碼也非常方便。

對於同樣的文字分類問題,後來還用單向LSTM做了一遍,輸入pre-trained的embedding詞向量,並且在訓練的時候fine-tune,與fasttext對比,即使使用了GTX 980的GPU,訓練速度還是要慢很多,並且,準確準確率和fasttext是差不多的。

所以對於文字分類,先用fasttext做一個簡單的baseline是很適合的。