需求
使用監督學習對歷史資料訓練生成模型,用於預測文字的類別。
樣本清洗
主要將重複的資料刪除掉,將錯誤無效的資料糾正或刪除,並檢查資料的一致性等。比如我認為長度小於少於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… 進行預定。感謝各位朋友。
=========================
歡迎關注: