fastText文本分類算法


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)

 

參考論文:Bag of Tricks for Efficient Text Classification


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM