Task3 基于機器學(xué)習(xí)的文本分類
文本表示方式
- one-hot
- Bags of Words 詞袋模型
1.若采用只記錄是否出現(xiàn)蚪黑,即0/1的形式廓潜。只能表現(xiàn)出詞是否出現(xiàn)的差異迄本,并沒有刻畫詞出現(xiàn)次數(shù)多少的差異货徙。
2.若采用記錄頻數(shù)的方式澜躺,那么長文本的比短文本的出現(xiàn)次數(shù)可能更多。
3.若采取記錄頻率的方式淋纲,但并沒有刻畫出劳闹,獨特詞匯對文章的信息,有時低頻率的詞更能反映特定行業(yè)的文章洽瞬。 - N-gram
加入相鄰單詞組合成新的單詞本涕,加入滑窗,保留一定上下文信息伙窃。 - TF-IDF
TF-IDF由兩部分組成菩颖,詞語頻率TF(Term Frequency)和逆文檔頻率IDF(Inverse Document Frequency)。在詞袋模型(3)的基礎(chǔ)上为障,加入了逆文檔頻率晦闰,刻畫特定詞匯的信息。
其中是詞在文章中出現(xiàn)的頻率鳍怨,分子為在文章中出現(xiàn)的頻數(shù)呻右,分母為文章詞的總數(shù)。的分子為總文章數(shù)目鞋喇,分母為出現(xiàn)詞語的文章數(shù)目声滥。
TF-IDF的推導(dǎo)
TF-IDF通過TF刻畫了某一個詞匯在文章中出現(xiàn)的頻率,代表這個詞對于文章的貢獻侦香,通過IDF刻畫某一個詞在文章集中的獨特性落塑。
1.2.3的想法都是比較直觀的纽疟,TF-IDF的修正也比較直觀,但是形式上值得我們思考憾赁,為什么IDF不采用TF一樣的格式污朽,而是采用log的方式?
從信息熵的角度出發(fā):
其中是詞語在語料庫中的信息熵龙考,我們可以使用信息熵來判斷詞語的重要性蟆肆,但是可能存在這樣子的情況:兩個詞的出現(xiàn)總數(shù)相同,但是一個是集中于幾篇洲愤,另外一個詞語是均勻分散颓芭。盡管信息量相同,但是兩者的區(qū)分效果是天差地別的柬赐。在這基礎(chǔ)上亡问,我們基于如下假設(shè),做分析:
- 所有文本的長度均一致肛宋,為州藕。
- 某一個詞語,要么不出現(xiàn)在文章中酝陈,若出現(xiàn)床玻,則次數(shù)一定為。
記文章總數(shù)為沉帮,詞語出現(xiàn)的文章數(shù)為锈死。
推導(dǎo)
- 對于文章中的詞語,有
觀察上式,為定值喇勋,因此TF-IDF可以視為在一定條件下對詞語的信息熵的刻畫缨该。
參考《數(shù)學(xué)之美》
作業(yè)1, TF-IDF的參數(shù)
max_feature數(shù)目
分類器使用Ridge分類器的OvR
train_loss = []
val_loss = []
feature_num_arr = [1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000]
for feature_num in feature_num_arr:
tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=feature_num)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
train_pred = clf.predict(train_test[:10000])
train_loss.append(f1_score(train_df['label'].values[:10000], train_pred, average='macro'))
val_pred = clf.predict(train_test[10000:])
val_loss.append(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
結(jié)果圖如下:
從結(jié)果我們可以看出川背,提取的tf-idf詞越多贰拿,在一定范圍內(nèi)是會增加效果。但是熄云,當繼續(xù)增加時膨更,效果并不會增加,這是因為數(shù)據(jù)稀疏缴允。我們采取的模型還能有效得解決數(shù)據(jù)稀疏問題询一,如果選用深度模型,這可能會導(dǎo)致難以訓(xùn)練得問題。(下一步改進的方向)
N-gram數(shù)目
train_loss = []
val_loss = []
feature_num_arr = range(1, 10)
for feature_num in feature_num_arr:
tfidf = TfidfVectorizer(ngram_range=(1,feature_num), max_features=5500)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
train_pred = clf.predict(train_test[:10000])
train_loss.append(f1_score(train_df['label'].values[:10000], train_pred, average='macro'))
val_pred = clf.predict(train_test[10000:])
val_loss.append(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
通過實驗健蕊,我發(fā)現(xiàn)n>=2的時候效果均挺好,雖然這僅僅是在ridge分類下的結(jié)果踢俄,但我們也可以得到缩功,我們的文本,應(yīng)該是單個的字都办。因為當n=2嫡锌,就可以獲得前后文信息,由單字組成詞語琳钉,效果有著顯著的提升势木。
作業(yè)2:不同模型
為了比較不同模型,采用了Ridge分類歌懒,Logistic分類啦桌,隨機森林,SVM及皂。在n=3甫男,特征詞數(shù)目5500下,進行訓(xùn)練验烧。
可以發(fā)現(xiàn)板驳,隨機森林過擬合現(xiàn)象很嚴重,有可能是tf-idf過于稀疏導(dǎo)致的碍拆。