1. 程式人生 > 其它 >R語言做文字挖掘 Part4文字分類

R語言做文字挖掘 Part4文字分類

Part4文字分類

【發現有人轉載,決定把格式什麼重新整理一遍,有時間做個進階版文字挖掘,恩!原文地址:CSDN-R語言做文字挖掘 Part4文字分類】
Part3文字聚類裡講到過,分類跟聚類的簡單差異。所以要做分類我們需要先整理出一個訓練集,也就是已經有明確分類的文字;測試集,可以就用訓練集來替代;預測集,就是未分類的文字,是分類方法最後的應用實現。

1. 資料準備

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

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

預測集就是Part2裡面的hlzj。

hlzj.train <-read.csv("hlzj_train.csv",header=T,stringsAsFactors=F)
length(hlzj.train)
[1] 2
table(hlzj.train$type)
fashionNews life product
27 34 38

promotion publicWelfare showbiz

45 22 36

length(hlzj)
[1] 1639

2. 分詞處理

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

library(Rwordseg)
hlzjTrainTemp <- gsub("[0-90123456789 < > ~]","",hlzj.train$text)
hlzjTrainTemp <-segmentCN(hlzjTrainTemp)
hlzjTrainTemp2 <-lapply(hlzjTrainTemp,removeStopWords,stopwords)
hlzjTemp2 <-lapply(hlzjTemp,removeStopWords,stopwords)
3. 得到矩陣
在Part3中講到了,做聚類時要先將文字轉換為矩陣,做分類同樣需要這個過程,用到tm軟體包。先將訓練集和預測集去除停詞後的結果合併為hlzjAll,記住前202(1:202)條資料是訓練集,後1639(203:1841)條是預測集。獲取hlzjAll的語料庫,並且得到文件-詞條矩陣,將其轉換為普通矩陣。

hlzjAll <- character(0)
hlzjAll[1:202] <- hlzjTrainTemp2
hlzjAll[203:1841] <- hlzjTemp2
length(hlzjAll)
[1] 1841
corpusAll <-Corpus(VectorSource(hlzjAll))
(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)

dtmAll_matrix <-as.matrix(hlzjAll.dtm)
4. 分類

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

rownames(dtmAll_matrix)[1:202] <-hlzj.train$type
rownames(dtmAll_matrix)[203:1841]<- c("")
train <- dtmAll_matrix[1:202,]
predict <-dtmAll_matrix[203:1841,]
trainClass <-as.factor(rownames(train))
library(class)
hlzj_knnClassify <-knn(train,predict,trainClass)
length(hlzj_knnClassify)
[1] 1639
hlzj_knnClassify[1:10]
[1] product product product promotion product fashionNews life
[8] product product fashionNews

Levels: fashionNews life productpromotion publicWelfare showbiz

table(hlzj_knnClassify)
hlzj_knnClassify
fashionNews life product promotion publicWelfare showbiz

40 869 88 535 28 79

hlzj.knnResult <-list(type=hlzj_knnClassify,text=hlzj)
hlzj.knnResult <-as.data.frame(hlzj.knnResult)
fix(hlzj.knnResult)

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

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

5. 分類效果

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

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


有什麼可以改進的地方歡迎指正,轉載請註明來源,謝謝!
————————————————
版權宣告:本文為CSDN博主「EchoCaiCai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/cl1143015961/article/details/44413631