R文本挖掘之三文本聚類

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

Part3文本聚類

分類和聚類算法,都是數據挖掘中最常接觸到的算法,分類聚類算法分別有很多種。可以看下下面兩篇文章對常見的分類聚類算法的簡介:

分類算法:http://blog.csdn.net/chl033/article/details/5204220

聚類算法:http://blog.chinaunix.net/uid-10289334-id-3758310.html

文本分類聚類會要用到這些算法去實現,暫時不用深究算法細節,R中已經有成熟的可以直接調用的這些算法了。大概說下分類和聚類的差異,照我的理解,分類算法和聚類算法最後實現的效果是相同的,都是給一個集合劃分成幾個類別。不同的是分類算法是根據已知的確定類別去做劃分,所以分類需要訓練集,有訓練、測試、預測這個過程;而聚類則未規定類別,它是基於給定集合的裏面的內容,根據內容的相似度去給集合劃分成指定的幾個類(你可以指定劃分成多少個類,而不是指定有哪些類),這些相似度的測量就是聚類算法的核心,這個度量標準可以是歐幾里得距離、是曼哈頓距離、是切比雪夫距離等等。它們分別叫做有監督分類和無監督分類,這種說法不是很確切,參考這個文章分類與聚類,監督學習與無監督學習,有其差異的說明。

還是用Part2裏面的例子。做聚類不需要訓練集,將文本內容做完分詞處理,也就是Part2裏面2.對某品牌官微做分詞,這裏處理完得到的結果hlzjTemp,用這個做接下來的聚類工作。下圖(圖片來源:玩玩文本挖掘)是一個文本挖掘的過程,不管是分類還是聚類,都要經歷前面一個過程將文本轉爲爲Tem-Document Matrix。然後再做後續分析Analysis,及分類或者聚類。另一個參考:R語言進行中文分詞和聚類


聚類算法是針對數值型變量的,先要將文本數據轉換爲matrix—數據矩陣。過程如下,這裏需要用到tm軟件包,先安裝該軟件包並加載。tm包中的Corpus()方法就是用來將文本轉換爲語料庫的方法。DocumentTermMatrix()方法,顯然就是將語料庫轉換爲文檔-詞條矩陣,然後再將文檔-詞條矩陣轉換爲普通矩陣,過程如下:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. library(tm)  
  2. corpus  <-Corpus(VectorSource(hlzjTemp))  
  3. hlzj.dtm<- DocumentTermMatrix(corpus,control=list(wordLengths=c(1,Inf)))  
  4. hlzj.matrix <- as.matrix(hlzj.dtm)  
補充說明:這個過程可能會遇到很多問題,沒有詳細的說明,附上兩個參考:用tm進行文本挖掘R語言文本挖掘

接下來就是做聚類了,聚類算法有很多,常見的幾種做聚類的方法

1.      kmeans()

方法的介紹參考:http://blog.sina.com.cn/s/blog_4ac9f56e0101h8xp.html。運行結果kmeansRes是一個list,names方法可以查看到kmeansRes的所有維度或者說組件,其中第一個cluster就是對應的分類結果,我們可以查看到前三十個聚類的結果,第一排對應着行號,第二排對應着聚類的結果1-5分別代表1-5類。然後我們可以將原始微博和聚類結果賦值給一個新的list變量,這樣我們就能看到聚類結果和每條微博對應的關係了。最後將這個新的list變量hlzj.kmeansRes導出到本地,就能很方便地查看到聚類結果了。當然我們也可以通過fix()方法查看hlzj.kmeansRes的內容,如圖所示,content是原微博內容,type是聚類結果。每個類別對應的文本數據的特點就要靠我們自己來總結了,這是聚類的一個不足的地方。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. k <- 5  
  2. kmeansRes <- kmeans(hlzj.matrix,k) #k是聚類數  
  3. mode(kmeansRes)#kmeansRes的內容  
[1]"list"

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. names(kmeansRes)  
[1]"cluster"     "centers"     "totss"       "withinss"   

[5]"tot.withinss" "betweenss"    "size"         "iter"       

[9]"ifault"

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. head(kmeansRes$cluster,10)  
1 2  3  4 5  6  7 8  9 10

 1 1  1  2 1  5  2 1  1  5

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. kmeansRes$size #每個類別下有多少條數據  
[1]  327  1159   63  63   27

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj.kmeansRes <- list(content=hlzj,type=kmeansRes$cluster)  
  2. write.csv(hlzj.kmeansRes,"hlzj_kmeansRes.csv")  
  3. fix(hlzj.kmeansRes)  

2.      hclust()。

方法詳細介紹,過程不再細說http://blog.sina.com.cn/s/blog_615770bd01018dnj.html,這個方法可以用plot()來查看聚類結果圖,但是在數據量挺多的時候,圖的上面的內容都擠在一起看不清楚了,這種情況下,還是直接查看聚類結果比較好。同樣,將原始數據hlzj和分類結果放在一起hlzj.hclustRes來看。可以看出類跟kmeans的聚類結果有些接近,說明微博的特徵還是挺明顯的。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. d <- dist(hlzj.matrix,method="euclidean")  
  2. hclustRes <- hclust(d,method="complete")  
  3. hclustRes.type <- cutree(hclustRes,k=5) #按聚類結果分5個類別  
  4. length(hclustRes.type)  
[1] 1639

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hclustRes.type[1:10]  
 1 2  3  4 5  6  7 8  9 10

 1 1  1  2 1  2  3 1  1  2

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

3.      kernel聚類,方法specc()

軟件包kernlab中的specc()方法可以實現kernel聚類算法。查看這個包的說明文檔,見鏈接http://127.0.0.1:25210/library/kernlab/doc/kernlab.pdf,這是本機的幫助文檔,不知道大家的地址是不是都一致的,也可以輸入??kernel查看幫助文檔能看到。網上能夠找到的翻譯後的方法說明http://www.biostatistic.net/thread-49108-1-1.html。這個聚類結果五個分類的統計如下,第四個類別有1402個,其他分類分別是135,55,24和23,所以截圖中看到前面23個都是4類下,用這個聚類可能效果不是很理想。具體實現過程如下:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. stringkern <-stringdot(type="string")  
  2. kernelRes <-specc(hlzj.matrix,centers=5,kernel=stringkern)  
  3. mode(kernelRes)  
[1] "numeric"

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

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. kernelRes[1:10]  
 1  2 3  4  5  6  7 8  9 10

 4  4 4  4  4  4  4 4  4  4

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

   1    2   3    4    5

 135   55  24 1402   23

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. temp <-t(kernelRes) #行列轉換  
  2. hlzj.kernelRes<-list(cotent=hlzj,type=temp[1:1639]  
  3. hlzj.kernelRes <-as.data.frame(hlzj.kernelRes)  
  4. fix(hlzj. kernelRes)  

4.      除此之外。

fpc軟件包中的dbscan()方法可以實現dbscan聚類,還有其他的聚類方法,就不一一介紹了,優劣取捨要在實際應用中去控制了。

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