FastText 文字分類使用心得

2021-09-07 22:50:11 字數 1321 閱讀 1038

最近在乙個專案裡使用了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][2]

FastText文字分類中的n grams

fasttext是facebook tomas mikolov提出的,也是在其word2vec的cbow模型的衍生物,該模型僅用乙個隱層 僅僅求了平均,並未使用啟用函式的非線性變換,故在word2vec模型中其實被叫做投影層project layer 乙個分層的softmax,可以媲美深度神經網路,...

帶監督的文字分類演算法FastText

該演算法由facebook在2016年開源,典型應用場景是 帶監督的文字分類問題 模型的優化目標如下 其中,是一條訓練樣本,y n 是訓練目標,x n 是normalized bag of features。矩陣引數a是基於word的look up table,也就是a是詞的embedding向量。...

python使用KNN文字分類

上次爬取的爸爸 媽媽 老師和自己的作文,利用sklearn.neighbors.kneighborsclassifier進行分類。import jieba import pandas as pd import numpy as np import osimport itertools import ...