1、概述
FastText 文本分類算法是有Facebook AI Research 提出的一種簡單的模型。實驗表明一般情況下,FastText 算法能獲得和深度模型相同的精度,但是計算時間卻要遠遠小於深度學習模型。fastText 可以作為一個文本分類的 baseline 模型。
2、模型架構
fastText 的模型架構和 word2vec 中的 CBOW 模型的結構很相似。CBOW 模型是利用上下文來預測中間詞,而fastText 是利用上下文來預測文本的類別。而且從本質上來說,word2vec是屬於無監督學習,fastText 是有監督學習。但兩者都是三層的網絡(輸入層、單層隱藏層、輸出層),具體的模型結構如下:
上面圖中 $x_i$ 表示的是文本中第 $i$ 個詞的特征向量,該模型的負對數似然函數如下:
上面式子中的矩陣 A 是詞查找表,整個模型是查找出所有的詞表示之后取平均值,用該平均值來代表文本表示,然后將這個文本表示輸入到線性分類器中,也就是輸出層的 softmax 函數。式子中的 B 是函數 $ f $ 的權重系數。
3、分層 softmax(Hierarchical softmax)
首先來看看softmax 函數的表達式如下:
然而在類別非常多的時候,利用softmax 計算的代價是非常大的,時間復雜度為 $O(kh)$ ,其中 $k$ 是類別的數量,$h$ 是文本表示的維度。而基於霍夫曼樹否建的層次 softmax 的時間復雜度為 $O(h;log_2(k))$ (二叉樹的時間復雜度是 $O(log_2(k))$ )。霍夫曼樹是從根節點開始尋找,而且在霍夫曼樹中權重越大的節點越靠近根節點,這也進一步加快了搜索的速度。
4、N-grams 特征
傳統的詞袋模型不能保存上下文的語義,例如“我愛你”和“你愛我”在傳統的詞袋模型中表達的意思是一樣的,N-grams 模型能很好的保存上下文的語義,能將上面兩個短語給區分開。而且在這里使用了 hash trick 進行特征向量降維。hash trick 的降維思想是講原始特征空間通過 hash 函數映射到低維空間。
5、代碼實現
import jieba import fasttext as ft from skllearn.model_selection import train_test_split ““ 分詞 去停用詞 把處理過后的詞寫入文本 ”” # 有監督的學習,訓練分類器 classifier = ft.supervised(filePath, "classifier.model") result = classifier.test(filePath) # 預測文檔類別 labels = classifier.predict(texts) # 預測類別+概率 labelProb = classifier.predict_proba(texts) # 得到前k個類別 labels = classifier.predict(texts, k=3) # 得到前k個類別+概率 labelProb = classifier.predict_prob(texts, k=3)