基于深度學習的文本分類
與傳統(tǒng)機器學習不同撤嫩,深度學習既提供特征提取功能,也可以完成分類的功能。從本章開始我們將學習如何使用深度學習來完成文本表示常柄。
學習目標
- 學習FastText的使用和基礎原理
- 學會使用驗證集進行調(diào)參
文本表示方法 Part2
現(xiàn)有文本表示方法的缺陷
在上一章節(jié),我們介紹幾種文本表示方法:
- One-hot
- Bag of Words
- N-gram
- TF-IDF
也通過sklean進行了相應的實踐搀擂,相信你也有了初步的認知西潘。但上述方法都或多或少存在一定的問題:轉(zhuǎn)換得到的向量維度很高,需要較長的訓練實踐哨颂;沒有考慮單詞與單詞之間的關系喷市,只是進行了統(tǒng)計。
與這些表示方法不同威恼,深度學習也可以用于文本表示品姓,還可以將其映射到一個低緯空間寝并。其中比較典型的例子有:FastText、Word2Vec和Bert腹备。在本章我們將介紹FastText衬潦,將在后面的內(nèi)容介紹Word2Vec和Bert。
FastText
FastText是一種典型的深度學習詞向量的表示方法植酥,它非常簡單通過Embedding層將單詞映射到稠密空間镀岛,然后將句子中所有的單詞在Embedding空間中進行平均,進而完成分類操作惧互。
所以FastText是一個三層的神經(jīng)網(wǎng)絡哎媚,輸入層、隱含層和輸出層喊儡。
下圖是使用keras實現(xiàn)的FastText網(wǎng)絡結構:
FastText在文本分類任務上拨与,是優(yōu)于TF-IDF的:
- FastText用單詞的Embedding疊加獲得的文檔向量,將相似的句子分為一類
- FastText學習到的Embedding空間維度比較低艾猜,可以快速進行訓練
如果想深度學習买喧,可以參考論文:
Bag of Tricks for Efficient Text Classification, https://arxiv.org/abs/1607.01759
基于FastText的文本分類
FastText可以快速的在CPU上進行訓練,最好的實踐方法就是官方開源的版本: https://github.com/facebookresearch/fastText/tree/master/python
- pip安裝
pip install fasttext
兩種安裝方法都可以安裝匆赃,如果你是初學者可以優(yōu)先考慮使用pip安裝淤毛。
- 分類模型
import pandas as pd
from sklearn.metrics import f1_score
# 轉(zhuǎn)換為FastText需要的格式
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=15000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text','label_ft']].iloc[:-5000].to_csv('train.csv', index=None, header=None, sep='\t')
import fasttext
model = fasttext.train_supervised('train.csv', lr=1.0, wordNgrams=2,
verbose=2, minCount=1, epoch=25, loss="hs")
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))
# 0.82
此時數(shù)據(jù)量比較小得分為0.82,當不斷增加訓練集數(shù)量時算柳,F(xiàn)astText的精度也會不斷增加5w條訓練樣本時低淡,驗證集得分可以到0.89-0.90左右。
如何使用驗證集調(diào)參
在使用TF-IDF和FastText中瞬项,有一些模型的參數(shù)需要選擇蔗蹋,這些參數(shù)會在一定程度上影響模型的精度,那么如何選擇這些參數(shù)呢囱淋?
- 通過閱讀文檔猪杭,要弄清楚這些參數(shù)的大致含義,那些參數(shù)會增加模型的復雜度
- 通過在驗證集上進行驗證模型精度妥衣,找到模型在是否過擬合還是欠擬合
這里我們使用10折交叉驗證皂吮,每折使用9/10的數(shù)據(jù)進行訓練,剩余1/10作為驗證集檢驗模型的效果税手。這里需要注意每折的劃分必須保證標簽的分布與整個數(shù)據(jù)集的分布一致蜂筹。
label2id = {}
for i in range(total):
label = str(all_labels[i])
if label not in label2id:
label2id[label] = [i]
else:
label2id[label].append(i)
通過10折劃分,我們一共得到了10份分布一致的數(shù)據(jù)芦倒,索引分別為0到9狂票,每次通過將一份數(shù)據(jù)作為驗證集,剩余數(shù)據(jù)作為訓練集熙暴,獲得了所有數(shù)據(jù)的10種分割闺属。不失一般性,我們選擇最后一份完成剩余的實驗周霉,即索引為9的一份做為驗證集掂器,索引為1-8的作為訓練集,然后基于驗證集的結果調(diào)整超參數(shù)俱箱,使得模型性能更優(yōu)国瓮。
本章小結
本章介紹了FastText的原理和基礎使用,并進行相應的實踐狞谱。然后介紹了通過10折交叉驗證劃分數(shù)據(jù)集乃摹。