R文本挖掘之四文本分類

本文是轉載!原文地址:CSDN-R語言做文本挖掘 Part4文本分類

Part4文本分類

Part3文本聚類裏講到過,分類跟聚類的簡單差異。所以要做分類我們需要先整理出一個訓練集,也就是已經有明確分類的文本;測試集,可以就用訓練集來替代;預測集,就是未分類的文本,是分類方法最後的應用實現。

1.       數據準備

訓練集準備是一個很繁瑣的功能,暫時沒發現什麼省力的辦法,根據文本內容去手動整理。這裏還是使用的某品牌的官微數據,根據微博內容,我將它微博的主要內容分爲了:促銷資訊(promotion)、產品推介(product)、公益信息(publicWelfare)、生活雞湯(life)、時尚資訊(fashionNews)、影視娛樂(showbiz),每個分類有20-50條數據,如下可看到訓練集下每個分類的文本數目,訓練集分類名爲中文也沒問題。

訓練集爲hlzj.train,後面也會被用作測試集。

預測集就是Part2裏面的hlzj。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj.train <-read.csv("hlzj_train.csv",header=T,stringsAsFactors=F)  
  2. length(hlzj.train)  
[1] 2

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. table(hlzj.train$type)  
fashionNews      life         product

      27            34            38

promotion    publicWelfare     showbiz

      45            22            36

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. length(hlzj)  

[1] 1639

2.       分詞處理

訓練集、測試集、預測集都需要做分詞處理後才能進行後續的分類過程。這裏不再詳細說明,過程類似於Part2中講到的。訓練集做完分詞後hlzjTrainTemp,之前對hlzj文件做過分詞處理後是hlzjTemp。然後分別將hlzjTrainTemp和hlzjTemp去除停詞。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. library(Rwordseg)  
  2. hlzjTrainTemp <- gsub("[0-90123456789 < > ~]","",hlzj.train$text)  
  3. hlzjTrainTemp <-segmentCN(hlzjTrainTemp)  
  4. hlzjTrainTemp2 <-lapply(hlzjTrainTemp,removeStopWords,stopwords)  
  5. hlzjTemp2 <-lapply(hlzjTemp,removeStopWords,stopwords)  
3.      得到矩陣

在Part3中講到了,做聚類時要先將文本轉換爲矩陣,做分類同樣需要這個過程,用到tm軟件包。先將訓練集和預測集去除停詞後的結果合併爲hlzjAll,記住前202(1:202)條數據是訓練集,後1639(203:1841)條是預測集。獲取hlzjAll的語料庫,並且得到文檔-詞條矩陣,將其轉換爲普通矩陣。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzjAll <- character(0)  
  2. hlzjAll[1:202] <- hlzjTrainTemp2  
  3. hlzjAll[203:1841] <- hlzjTemp2  
  4. length(hlzjAll)  
[1] 1841

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. corpusAll <-Corpus(VectorSource(hlzjAll))  
  2. (hlzjAll.dtm <-DocumentTermMatrix(corpusAll,control=list(wordLengths = c(2,Inf))))  
<<DocumentTermMatrix(documents: 1841, terms: 10973)>>

Non-/sparse entries: 33663/20167630

Sparsity           : 100%

Maximal term length: 47

Weighting          : term frequency (tf)

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. dtmAll_matrix <-as.matrix(hlzjAll.dtm)  

4.      分類

用到knn算法(K近鄰算法),這個算法在class軟件包裏。矩陣的前202行數據是訓練集,已經有分類了,後面的1639條數據沒有分類,要根據訓練集得到分類模型再爲其做分類的預測。將分類後的結果和原微博放在一起,用fix()查看,可以看到分類結果,效果還是挺明顯的。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. rownames(dtmAll_matrix)[1:202] <-hlzj.train$type  
  2. rownames(dtmAll_matrix)[203:1841]<- c("")  
  3. train <- dtmAll_matrix[1:202,]  
  4. predict <-dtmAll_matrix[203:1841,]  
  5. trainClass <-as.factor(rownames(train))  
  6. library(class)  
  7. hlzj_knnClassify <-knn(train,predict,trainClass)  
  8. length(hlzj_knnClassify)  
[1] 1639

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj_knnClassify[1:10]  
[1] product    product     product     promotion  product     fashionNews life      

 [8] product    product     fashionNews

Levels: fashionNews life productpromotion publicWelfare showbiz

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. table(hlzj_knnClassify)  
hlzj_knnClassify

fashionNews    life   product     promotion   publicWelfare   showbiz

    40        869       88        535        28        79

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj.knnResult <-list(type=hlzj_knnClassify,text=hlzj)  
  2. hlzj.knnResult <-as.data.frame(hlzj.knnResult)  
  3. fix(hlzj.knnResult)  

Knn分類算法算是最簡單的一種,後面嘗試使用神經網絡算法(nnet())、支持向量機算法(svm())、隨機森林算法(randomForest())時,都出現了電腦內存不夠的問題,我的電腦是4G的,看內存監控時能看到最高使用達到3.92G。看樣子要換臺給力點的電腦了╮(╯▽╰)╭

在硬件條件能達到時,應該實現分類沒有問題。相關的算法可以用:??方法名,的方式來查看其說明文檔。

5.       分類效果

上面沒有講到測試的過程,對上面的例子來說,就是knn前兩個參數都用train,因爲使用數據集相同,所以得到的結果也是正確率能達到100%。在訓練集比較多的情況下,可以將其隨機按7:3或者是8:2分配成兩部分,前者做訓練後者做測試就好。這裏就不再細述了。

在分類效果不理想的情況下,改進分類效果需要豐富訓練集,讓訓練集特徵儘量明顯,這個在實際問題是一個很繁瑣卻不能敷衍的過程。


發佈了17 篇原創文章 · 獲贊 14 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章