【NLP-06】fastText文本分類算法


目錄

  1. fastText概述
  2. 基礎知識
  3. LDA主題模型
  4. 總結

一句話簡述fastText提出了子詞嵌入(subword embedding)的方法。是一種監督學習方法。和word2vec 中的CBOW結構很相似。運行速度較快。

 

一、fastText概述

1.1 背景

在word2vec中,我們並沒有直接利用構詞學中的信息。無論是在跳字模型還是連續詞袋模型中,我們都將形態不同的單詞用不同的向量來表示。例如,"dog"和"dogs"分別用兩個不同的向量表示,而模型中並未直接表達這兩個向量之間的關系。 這里有一點需要特別注意,一般情況下,使用fastText進行文本分類的同時也會產生詞的embedding,即embedding是fastText分類的產物。除非你決定使用預訓練的embedding來訓練fastText分類模型,這另當別論。

1.2 n-gram表示單詞

word2vec把語料庫中的每個單詞當成原子的,它會為每個單詞生成一個向量。這忽略了單詞內部的形態特征,比如:"book" 和"books","阿里巴巴"和"阿里",這兩個例子中,兩個單詞都有較多公共字符,即它們的內部形態類似,但是在傳統的word2vec中,這種單詞內部形態信息因為它們被轉換成不同的id丟失了。

為了克服這個問題,fastText使用了字符級別的n-grams來表示一個單詞。對於單詞"book",假設n的取值為3,則它的trigram有:"<bo", "boo", "ook", "ok>",其中,"<"表示前綴,">"表示后綴。於是,我們可以用這些trigram來表示"book"這個單詞,進一步,我們可以用這4個trigram的向量疊加來表示"apple"的詞向量。

這帶來兩點好處:

  1. 對於低頻詞生成的詞向量效果會更好。因為它們的n-gram可以和其它詞共享
  2. 對於訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字符級n-gram向量。

1.3 什么是FastText

FastText 文本分類算法是由Facebook AI Research 提出的一種簡單的模型。實驗表明一般情況下,FastText 算法能獲得和深度模型相同的精度,但是計算時間卻要遠遠小於深度學習模型fastText 可以作為一個文本分類的 baseline 模型。

二、模型架構

fastText 的模型架構和 word2vec 中的CBOW結構很相似,具體的模型結構如下:

上面圖中 xi 表示的是文本中第 i 個詞的特征向量,該模型的負對數似然函數如下:

式子中的 B 是函數 f 的權重系數,上面式子中的矩陣 A 是詞查找表,整個模型是查找出所有的詞表示之后取平均值,用該平均值來代表文本表示,然后將這個文本表示輸入到線性分類器中,也就是輸出層的 softmax 函數。

三、分層 softmaxHierarchical softmax

首先來看看softmax 函數的表達式如下:

然而在類別非常多的時候,利用softmax 計算的代價是非常大的,時間復雜度為 O(kh) ,其中 k 是類別的數量,h 是文本表示的維度。而基於霍夫曼樹否建的層次 softmax 的時間復雜度為 O(h*log2(k)) (二叉樹的時間復雜度是 O(log2(k)) )。霍夫曼樹是從根節點開始尋找,而且在霍夫曼樹中權重越大的節點越靠近根節點,這也進一步加快了搜索的速度。

四、關於效果和應用

4.1 N-grams 特征

傳統的詞袋模型不能保存上下文的語義,例如"我愛你"和"你愛我"在傳統的詞袋模型中表達的意思是一樣的,N-grams 模型能很好的保存上下文的語義,能將上面兩個短語給區分開。而且在這里使用了 hash trick 進行特征向量降維。hash trick 的降維思想是講原始特征空間通過 hash 函數映射到低維空間。

4.2 效果比較

還有個問題,就是為何fastText的分類效果常常不輸於傳統的非線性分類器?假設我們有兩段文本:

1、我 來到 達觀數據

2、俺 去了 達而觀信息科技

這兩段文本意思幾乎一模一樣,如果要分類,肯定要分到同一個類中去。但在傳統的分類器中,用來表征這兩段文本的向量可能差距非常大。傳統的文本分類中,你需要計算出每個詞的權重,比如tf-idf值, "我"和"俺" 算出的tf-idf值相差可能會比較大,其它詞類似,於是,VSM(向量空間模型)中用來表征這兩段文本的文本向量差別可能比較大。

但是fastText就不一樣了,它是用單詞的embedding疊加獲得的文檔向量,詞向量的重要特點就是向量的距離可以用來衡量單詞間的語義相似程度,於是,在fastText模型中,這兩段文本的向量應該是非常相似的,於是,它們很大概率會被分到同一個類中。使用詞embedding而非詞本身作為特征,這是fastText效果好的一個原因;另一個原因就是字符級n-gram特征的引入對分類效果會有一些提升 。

4.3 應用

fastText作為誕生不久的詞向量訓練、文本分類工具得到了比較深入的應用。主要被用在以下兩個系統:

1. 同近義詞挖掘。Facebook開源的fastText工具也實現了詞向量的訓練,基於各種垂直領域的語料,使用其挖掘出一批同近義詞;

2. 文本分類系統。在類標數、數據量都比較大時,選擇fastText 來做文本分類,以實現快速訓練預測、節省內存的目的。

五、fastTextWord2Vec的不同

有意思的是,fastText和Word2Vec的作者是同一個人。

相同點:

  1. 圖模型結構很像,都是采用embedding向量的形式(這里我理解是訓練過程中產生這種效果,不是指輸入時,因為Word2Vec輸入時one-hot編碼),得到word的隱向量表達。
  2. 都采用很多相似的優化方法,比如使用Hierarchical softmax優化訓練和預測中的打分速度。
  3. 都有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。

之前一直不明白fasttext用層次softmax時葉子節點是啥,CBOW很清楚,它的葉子節點是詞和詞頻,看源碼可知,其實fasttext葉子節點里是類標和類標的頻數。

  

Word2Vec

fastText

輸入

one-hot形式的單詞的向量

embedding過的單詞的詞向量和n-gram向量

輸出

對應的是每一個term,計算某term概率最大

對應的是分類的標簽

類型

無監督學習

有監督學習

本質不同,體現在softmax的使用:

word2vec的目的是得到詞向量,該詞向量最終是在輸入層得到的,輸出層對應的h-softmax也會生成一系列的向量,但是最終都被拋棄,不會使用。

fastText則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label

fastText優點:

  1. 適合大型數據+高效的訓練速度:能夠訓練模型"在使用標准多核CPU的情況下10分鍾內處理超過10億個詞匯"
  2. 支持多語言表達:利用其語言形態結構,fastText能夠被設計用來支持包括英語、德語、西班牙語、法語以及捷克語等多種語言。FastText的性能要比時下流行的word2vec工具明顯好上不少,也比其他目前最先進的詞態詞匯表征要好。
  3. 專注於文本分類,在許多標准問題上實現當下最好的表現(例如文本傾向性分析或標簽預測)。

六、代碼實現

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)

參考文獻

1】英文的論文: Bag of Tricks for Efficient Text Classification

2】其他人的理解: http://www.52nlp.cn/fasttext

3】代碼: https://github.com/NLP-LOVE/ML-NLP/blob/master/NLP/16.2%20fastText/fastText.ipynb


免責聲明!

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



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