如何用機器學習對文字分類

超人汪小建發表於2019-02-20

需求

使用監督學習對歷史資料訓練生成模型,用於預測文字的類別。

樣本清洗

主要將重複的資料刪除掉,將錯誤無效的資料糾正或刪除,並檢查資料的一致性等。比如我認為長度小於少於13的資料是無效的遂將之刪掉。

def writeFile(text):
   file_object = open(`result.txt`,`w`)
   file_object.write(text)
   file_object.close()

def clear():
   text = ""
   file_obj = open("deal.txt")
   list_of_lines = file_obj.readlines()
   for line in list_of_lines:
     if(len(line)>13):
       text += line
   writeFile(text)
   file_obj.close()複製程式碼

定好類別集合

按照樣本集人工做好分類,比如分為以下幾類:

編號 類別
1 環保
2 交通
3 手機
4 法律
5 汽車

分類詞庫

特徵提取涉及到文字分詞,由搜狗pinyin.sogou.com/dict/可以搜尋各種…

如何用機器學習對文字分類
這裡寫圖片描述

常用演算法

  • 樸素貝葉斯
  • Rocchio
  • SVM
  • KNN
  • 決策樹
  • 神經網路

這裡選擇用SVM,SVM本質上其實也就是一種特殊的兩層神經網路,具有高效的學習演算法。

特徵集

使用SVM分類時其中一項重要的工作就是要確定特徵集,只有特徵集確定好了才能往下計算,那麼怎麼確定特徵集呢?一般的做法可以是將所有樣本的詞都提取出來作為特徵集。比如我們有兩個文字
“小學生上學”和“股票大跌”,那特徵集就是{“小學生”,”上學”,”股票”,”大跌”}。

特徵權重

特徵集確定就可以看成是向量的維數,而對於每個樣本來說就需要確定每個維度的值了,這個值可以看成是特徵的權重,常常用TF-IDF作為值。TF-IDF又是什麼?簡單來說TF就是某文件中某個term出現的次數,而IDF即逆文件頻率,可由下面公式計算:

如何用機器學習對文字分類

其中,T為統計樣本中總文件數,t為包含某term的文件數。
TF和IDF的相乘則為特徵權重。

特徵降維

當統計樣本越來越多且每個樣本都比較大時,這時可能會導致特徵維度特別大。所以可能會要對特徵集進行降維處理。特徵降維其實就是將一些幾乎沒影響的維度去掉,以避免維度災難。有比較多處理方式:比如可以直接定義一個無意義詞庫將一些沒意義的單詞去掉、或以詞頻作為依據選擇出代表性的單詞、或以其他演算法提取出若干熱詞作為代表性單詞、或用經典的卡方校驗演算法選擇代表性單詞,以上方式都可以達到降維效果。

程式碼

機器學習庫很多,可以選一個自己比較熟悉的且叫有名的庫來實現,關鍵的程式碼如下:

double[][] samples = 所有樣本特徵集及權重陣列
int labelInt[] = 分類標籤陣列
SVM<double[]> svm =
        new SVM<double[]>(new LinearKernel(), 1.0, 12, SVM.Multiclass.ONE_VS_ALL);
svm.learn(samples, labels);
svm.finish();

double[] test = 測試資料的特徵集及權重陣列
svm.predict(x)複製程式碼

引數

SVM引數需要選擇的主要有兩個:核函式和懲罰因子。主要的核函式包括RBF核、線性核、多項式核和Sigmoid核,文字分類中一般可選線性核。懲罰因子用來懲罰分錯的樣本,懲罰因子越大說明越重視損失,不斷增大它最終總能讓所有樣本都正確分類,但這可能會存在過擬合,影響後面的泛化能力。

====廣告時間,可直接跳過====

鄙人的新書《Tomcat核心設計剖析》已經在京東預售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。

=========================

歡迎關注:

如何用機器學習對文字分類
這裡寫圖片描述

相關文章