文字處理的第一步一般是要做分詞(也有部分文字處理演算法不需要做分詞,這裡不做討論),這裡介紹兩個分詞工具,其中最常用的是jieba,兩者有很多相似的地方。
在分詞後將中文句子轉換問多個詞語的序列,這一步需要做特徵提取,將文字轉換為模型可以使用的資料
詞向量的維度(與隱含層節點數一致)一般情況下要遠遠小於詞語總數 v 的大小,所以word2vec 本質上是一種降維操作——把詞語從 one-hot encoder 形式的表示降維到 word2vec 形式的表示。
詞向量可以自行訓練,但是一般不建議,因為需要很大的工作量,可以使用訓練好的詞向量:chinese word vectors 中文詞向量
# 使用上述訓練好的詞向量模型做測試
import gensim
baike_vec =
'resource/baike.vectors.bin'
w2v_model = gensim.models.keyedvectors.load_word2vec_format(baike_vec, binary=
true
)# 列印和「南京」相似的前3個詞及其相似度
print
(w2v_model.similar_by_word(
"南京"
, topn=3)
)# 結果[(
'蘇州'
,0.8196749687194824),
('無錫'
,0.7864724397659302),
('常州'
,0.7753453850746155
)]
詞向量在文字分類中的使用:如何用 word2vec 計算兩個句子之間的相似度?
樸素貝葉斯、支援向量機
上述兩種模型使用的都是python的sklearn庫:scikit-learn (sklearn) 官方文件中文版
以下是兩種模型的示例**:
from sklearn.svm import svc
from sklearn.*****_bayes import multinomialnb
from sklearn.feature_extraction.text import countvectorizer, tfidftransformer
from sklearn.metrics import confusion_matrix,classification_report
import numpy as np
# 每條文本為一行,分詞之間以空格分割,多行文字組成乙個list,get_file是自定義函式
train_text = np.asarray(get_file(train_data)
)train_label = np.asarray(get_file(train_label)
test_text = np.asarray(get_file(test_data)
)test_label = np.asarray(get_file(test_label)
)# 特徵數值計算類,可以使用自定義的詞表,也可以使用訓練資料生成詞表
count_v0 = countvectorizer(
)# 判斷countvectorizer的詞表是否為空,為空則生成詞表,並使用詞表將訓練文字轉化為詞頻
counts_train = count_v0.fit_transform(train_text)
# 使用已有的詞表將測試文字轉化為詞頻
counts_test = count_v0.transform(test_text)
# 將詞頻轉化為tf-idf
tfidftransformer = tfidftransformer(
)# fit會計算訓練文字中所有詞的idf,並儲存
train_data = tfidftransformer.fit_transform(counts_train)
# 這裡用transform處理測試文字,其中會直接使用訓練資料的idf
test_data = tfidftransformer.transform(counts_test)
# 多項式樸素貝葉斯
clf = multinomialnb(alpha=
0.01
)clf.fit(train_data, train_label)
pred = clf.predict(test_data)
preds = pred.tolist(
)# 模型效果評價:計算並列印混淆矩陣
c_matrix = confusion_matrix(test_label, preds)
for i in c_matrix:
print
(i)report = classification_report(test_label, preds)
print
(report)
# svm
svclf = svc(kernel=
'linear'
, class_weight=
'balanced'
)svclf.fit(train_data, train_label)
pred = svclf.predict(test_data)
preds = pred.tolist(
)# 模型效果評價:計算並列印混淆矩陣
c_matrix = confusion_matrix(test_label, preds)
for i in c_matrix:
print
(i)report = classification_report(test_label, preds)
print
(report)
精確率和召回率是一對矛盾的向量,通常在一些簡單的任務中才可能使查全率和查準率都很高。精確率、召回率、f1計算
訓練集和測試集的劃分:留出法、交叉驗證法、自助法
為了將樣本資料劃分為訓練集和測試集,同時避免樣本資料分布不均衡,需要使用合理的劃分方法,這裡使用交叉驗證法。
交叉驗證法是將樣本資料劃分為k個大小相同的子集,每次選取其中k-1個作為訓練集,剩下的乙個作為測試集,一般取k=10,稱為10折交叉驗證。
可以使用sklearn中的stratifiedkfold實現:模型選擇和評估
from sklearn.model_selection import stratifiedkfold
# 10折交叉驗證
skf = stratifiedkfold(n_splits=9)
for train_index, test_index in skf.split(vect, label)
:print
("train_index: "
,train_index.shape)
print
("test_index: "
,test_index.shape)
x_train, x_test = vect[train_index]
, vect[test_index]
y_train, y_test = label[train_index]
, label[test_index]
model_train(x_train, y_train, x_test, y_test)
二分類/多分類
以上**中的multinomialnb和svc實現的都是二分類演算法,類似的也可以使用二分類組合實現多分類:二分類實現多分類的兩種思路
sklearn中的多分類也是基於以上思想實現的,無論是one-versus-rest還是one-versus-one都有其固有的缺點,具體實踐中需要評估。
多分類效果的評價也可以使用sklarn:sklearn的多分類模型評價指標
資料不平衡問題
機器學習中常常會遇到資料的類別不平衡(class imbalance),也叫資料偏斜(class skew)。以常見的二分類問題為例,當正類和負類差距很大時,就是資料不平衡問題,對待不平衡問題一般有三中處理方法:過取樣、欠取樣和閾值調整:如何處理資料中的「類別不平衡」?
欠取樣(undersampling)和過取樣(oversampling)會對模型帶來怎樣的影響?
嘗試xgboost模型
使用過取樣(或smote)+強正則模型(如xgboost)可能比較適合不平衡的資料。拿到乙個新的資料時,可以不妨直接先試試這個方法,作為基準(baseline)。
異常資料識別
一般可以將異常檢測看成是資料不平衡下的分類問題。
資料探勘中常見的「異常檢測」演算法有哪些?
文字分類 特徵選擇
特徵選擇技術的比較 pso,pca和資訊增益 作為與基於pso的特徵選擇的比較,我們利用pca和資訊增益來減少我們問題的特徵空間的維度。主成分分析 pca 51 是一種有用的統計技術,通過減少維數來壓縮資料。它通過遺漏冗餘資訊找到高維資料中的模式並將其轉換為較低維度。pca通過計算協方差矩陣的特徵值...
文字分類特徵選擇方法
1 df documentfrequency 文件頻率 df 統計特徵詞出現的文件數量,用來衡量某個特徵詞的重要性 2 mi mutualinformation 互資訊法 互資訊法用於衡量特徵詞與文件類別直接的資訊量。如果某個特徵詞的頻率很低,那麼互資訊得分就會很大,因此互資訊法傾向 低頻 的特徵詞...
文字分類 特徵選擇方法
文字分類 特徵選擇方法 一 概念 特徵詞選擇和特徵詞權重 1.特徵詞選擇 特徵詞選擇是為了降低文字表示的維度,而特徵詞權重是為了表示文字表示中每乙個特徵項的重要程度。常見的且基礎的文字特徵選擇的演算法有基於文件頻率 documentfrequency 資訊增益 informationgain,ig ...