基于機器學(xué)習(xí)的文本分類
在本章我們將開始使用機器學(xué)習(xí)模型來解決文本分類旨指。機器學(xué)習(xí)發(fā)展比較廣肖粮,且包括多個分支砂蔽,本章側(cè)重使用傳統(tǒng)機器學(xué)習(xí),從下一章開始是基于深度學(xué)習(xí)的文本分類流码。
學(xué)習(xí)目標(biāo)
* 學(xué)會TF-IDF的原理和使用
* 使用sklearn的機器學(xué)習(xí)模型完成文本分類
機器學(xué)習(xí)是對能通過經(jīng)驗自動改進的計算機算法的研究又官。機器學(xué)習(xí)通過歷史數(shù)據(jù)訓(xùn)練出模型對應(yīng)于人類對經(jīng)驗進行歸納的過程,機器學(xué)習(xí)利用模型對新數(shù)據(jù)進行預(yù)測對應(yīng)于人類利用總結(jié)的規(guī)律對新問題進行預(yù)測的過程漫试。
機器學(xué)習(xí)有很多種分支六敬,對于學(xué)習(xí)者來說應(yīng)該優(yōu)先掌握機器學(xué)習(xí)算法的分類,然后再其中一種機器學(xué)習(xí)算法進行學(xué)習(xí)驾荣。由于機器學(xué)習(xí)算法的分支和細(xì)節(jié)實在是太多外构,所以如果你一開始就被細(xì)節(jié)迷住了眼普泡,你就很難知道全局是什么情況的。
如果你是機器學(xué)習(xí)初學(xué)者审编,你應(yīng)該知道如下的事情:
- 機器學(xué)習(xí)能解決一定的問題撼班,但不能奢求機器學(xué)習(xí)是萬能的;
- 機器學(xué)習(xí)算法有很多種垒酬,看具體問題需要什么砰嘁,再來進行選擇;
- 每種機器學(xué)習(xí)算法有一定的偏好勘究,需要具體問題具體分析矮湘;
文本表示方法 Part1
在機器學(xué)習(xí)算法的訓(xùn)練過程中,假設(shè)給定個樣本口糕,每個樣本有
個特征缅阳,這樣組成了
的樣本矩陣,然后完成算法的訓(xùn)練和預(yù)測景描。同樣的在計算機視覺中可以將圖片的像素看作特征十办,每張圖片看作hight×width×3的特征圖,一個三維的矩陣來進入計算機進行計算伏伯。
但是在自然語言領(lǐng)域橘洞,上述方法卻不可行:文本是不定長度的。文本表示成計算機能夠運算的數(shù)字或向量的方法一般稱為詞嵌入(Word Embedding)方法说搅。詞嵌入將不定長的文本轉(zhuǎn)換到定長的空間內(nèi)炸枣,是文本分類的第一步。
One-hot
這里的One-hot與數(shù)據(jù)挖掘任務(wù)中的操作是一致的弄唧,即將每一個單詞使用一個離散的向量表示适肠。具體將每個字/詞編碼一個索引,然后根據(jù)索引進行賦值候引。
One-hot表示方法的例子如下:
句子1:我 愛 北 京 天 安 門
句子2:我 喜 歡 上 海
首先對所有句子的字進行索引侯养,即將每個字確定一個編號:
{
'我': 1, '愛': 2, '北': 3, '京': 4, '天': 5,
'安': 6, '門': 7, '喜': 8, '歡': 9, '上': 10, '海': 11
}
在這里共包括11個字,因此每個字可以轉(zhuǎn)換為一個11維度稀疏向量:
我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
愛:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
...
海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
Bag of Words
Bag of Words(詞袋表示)澄干,也稱為Count Vectors逛揩,每個文檔的字/詞可以使用其出現(xiàn)次數(shù)來進行表示。
句子1:我 愛 北 京 天 安 門
句子2:我 喜 歡 上 海
直接統(tǒng)計每個字出現(xiàn)的次數(shù)麸俘,并進行賦值:
句子1:我 愛 北 京 天 安 門
轉(zhuǎn)換為 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
句子2:我 喜 歡 上 海
轉(zhuǎn)換為 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
在sklearn中可以直接CountVectorizer
來實現(xiàn)這一步驟:
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
vectorizer = CountVectorizer()
vectorizer.fit_transform(corpus).toarray()
N-gram
N-gram與Count Vectors類似辩稽,不過加入了相鄰單詞組合成為新的單詞,并進行計數(shù)从媚。
如果N取值為2逞泄,則句子1和句子2就變?yōu)椋?/p>
句子1:我愛 愛北 北京 京天 天安 安門
句子2:我喜 喜歡 歡上 上海
TF-IDF
TF-IDF 分?jǐn)?shù)由兩部分組成:第一部分是詞語頻率(Term Frequency),第二部分是逆文檔頻率(Inverse Document Frequency)。其中計算語料庫中文檔總數(shù)除以含有該詞語的文檔數(shù)量喷众,然后再取對數(shù)就是逆文檔頻率各谚。
TF(t)= 該詞語在當(dāng)前文檔出現(xiàn)的次數(shù) / 當(dāng)前文檔中詞語的總數(shù)
IDF(t)= log_e(文檔總數(shù) / 出現(xiàn)該詞語的文檔總數(shù))
基于機器學(xué)習(xí)的文本分類
接下來我們將對比不同文本表示算法的精度,通過本地構(gòu)建驗證集計算F1得分到千。
Count Vectors + RidgeClassifier
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=15000)
vectorizer = CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
# 0.74
TF-IDF + RidgeClassifier
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=15000)
tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
#0.8721598830546126
本章小結(jié)
本章我們介紹了基于機器學(xué)習(xí)的文本分類方法昌渤,并完成了兩種方法的對比。