使用R語言進行主題發現(一)


寫作目的

最近由於研究需要,使用R語言對文本進行了主題發現,下面對具體過程進行記錄。

步驟一:讀取文本並進行預處理

本實驗中主要對從SCI引文數據庫中關於bigdata的索引記錄進行分析,文件后綴為,目錄為c:\\data\\,具體代碼為:

 

#獲取目錄下所有的txt文本路徑
fileList<-list.files(path = "C:/data",full.names= T,pattern=".txt")
#按行讀取該文本到變量file
file<-c(readLines(fileList[1]),readLines(fileList[2]))
#使用正則表達式對記錄中的摘要進行提取
index<-grep("^AB.*?",file)
doc<-file[index]
#刪除文件開頭的AB 字符,得到摘要列表
doc<-sub("^AB ","",doc)

  

步驟二:使用tm包建立DocumentTermMatrix矩陣

將摘要信息讀取doc變量后,接下來就需要使用tm包對文本進行處理了.

#加載tm包
library(tm)
#建立語料庫
doc.vec<-VectorSource(doc)
doc.corpus<-Corpus(doc.vec)
#進行預處理
doc.corpus<-tm_map(doc.corpus,tolower)
doc.corpus<-tm_map(doc.corpus,removePunctuation)
doc.corpus<-tm_map(doc.corpus,removeNumbers)
doc.corpus<-tm_map(doc.corpus,removeWords, stopwords("english"))
#加載SnowballC包
library(SnowballC)
#繼續進行預處理
doc.corpus <- tm_map(doc.corpus, stemDocument)
doc.corpus <- tm_map(doc.corpus, stripWhitespace)
#建立TermDocumentMatrix
TDM <- TermDocumentMatrix(doc.corpus)

  

步驟三:使用wordcloud查看詞語頻率分布情況

library(wordcloud)
m <- as.matrix(TDM)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
wordcloud(d$word,d$freq,c(8,.3),2)

  

經過上述步驟后,可以得到該語料的詞雲圖如下

步驟四:使用topicmodels包對文本進行主題挖掘

(一)確定主題個數

要在數據集中確定主題的個數,需要事先設定主題個數的搜索范圍,然后分別使用LDA計算主題模型在不同主題數目下的困惑度或者似然估計數值,最終能夠使得模型困惑度最低或者似然估計值最大的主題數即為最佳的主題個數,一般為了降低困惑度,通常還會采取交叉驗證的方法進行。下面給出基本代碼

#退出閾值
burnin = 1000
#迭代次數
iter = 1000
#保存記錄的步長
keep = 50
#主題范圍(從2到100,以步長5進行遞增)
sequ <- seq(2, 100, 5)
#迭代進行試驗
fitted_many <- lapply(sequ, function(k) LDA(TDM, k = k, method = "Gibbs",control = list(burnin = burnin, iter = iter, keep = keep) ))
#抽取每個主題的對數似然估計值
logLiks_many <- lapply(fitted_many, function(L)  L@logLiks[-c(1:(burnin/keep))])
#定義計算調和平均值的函數
harmonicMean <- function(logLikelihoods, precision=2000L) {
  library("Rmpfr")
  llMed <- median(logLikelihoods)
  as.double(llMed - log(mean(exp(-mpfr(logLikelihoods,
                                       prec = precision) + llMed))))
}
#計算各個主題的調和平均數,將其最為模型的最大似然估計
hm_many <- sapply(logLiks_many, function(h) harmonicMean(h))
#畫出主題數-似然估計曲線圖,用於觀察
plot(sequ, hm_many, type = "l")
# 計算最佳主題個數
sequ[which.max(hm_many)]

 結果分析:

 

  

根據分析,可以確定在當前參數設定下,最佳主題數目為57.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM