#清除內存空間 rm(list=ls()) #導入tm包 library(tm) library(SnowballC) #查看tm包的文檔 #vignette("tm") ##1.Data Import 導入自帶的路透社的20篇xml文檔 #找到/texts/crude的目錄,作為DirSource的輸入,讀取20篇xml文檔 reut21578 <- system.file("texts", "crude", package = "tm") reuters <- Corpus(DirSource(reut21578), readerControl = list(reader = readReut21578XML)) ##2.Data Export 將生成的語料庫在磁盤上保存成多個純文本文件 writeCorpus(reuters) ##3.Inspecting Corpora 查看語料庫 #can use inspect(),print(),summary() #由於是從xml讀取過來,所以現在的corpus還是非常雜亂 inspect(reuters) print(reuters) summary(reuters) ##4.Transformations #對於xml格式的文檔用tm_map命令對語料庫文件進行預處理,將其轉為純文本並去除多余空格, #轉換小寫,去除常用詞匯、合並異形同意詞匯,如此才能得到類似txt文件的效果 #可以用inspect(reuters)查看此時的效果,明顯好很多 reuters <- tm_map(reuters, as.PlainTextDocument)#將reuters轉化為純文本文件,去除標簽 reuters <- tm_map(reuters, stripWhitespace)#去掉空白 reuters <- tm_map(reuters, tolower)#轉換為小寫 reuters <- tm_map(reuters, removeWords, stopwords("english"))#去停用詞 #采用Porter's stemming 算法 提取詞干 #Stem words in a text document using Porter's stemming algorithm #install.packages("SnowballC") tm_map(reuters, stemDocument) ##5.Creating Term-Document Matrices #將處理后的語料庫進行斷字處理,生成詞頻權重矩陣(稀疏矩陣)也叫詞匯文檔矩陣 dtm <- DocumentTermMatrix(reuters) #查看詞匯文檔矩陣 inspect(dtm[1:5, 100:105]) #Non-/sparse entries: 1990/22390 ---非0/是0 #Sparsity : 92% ---稀疏性 稀疏元素占全部元素的比例 #Maximal term length: 17 ---切詞結果的字符最長那個的長度 #Weighting : term frequency (tf) #如果需要考察多個文檔中特有詞匯的出現頻率,可以手工生成字典, #並將它作為生成矩陣的參數 d<-c("price","crude","oil","use") inspect(DocumentTermMatrix(reuters,control=list(dictionary=d))) ##6.Operations on Term-Document Matrices #找出次數超過5的詞 findFreqTerms(dtm, 5) #找出與‘opec’單詞相關系數在0.8以上的詞 findAssocs(dtm,"opec",0.8) #因為生成的矩陣是一個稀疏矩陣,再進行降維處理,之后轉為標准數據框格式 #我們可以去掉某些出現頻次太低的詞。 dtm1<- removeSparseTerms(dtm, sparse=0.6) inspect(dtm1) data <- as.data.frame(inspect(dtm1)) #再之后就可以利用R語言中任何工具加以研究了,下面用層次聚類試試看 #先進行標准化處理,再生成距離矩陣,再用層次聚類 data.scale <- scale(data) d <- dist(data.scale, method = "euclidean") fit <- hclust(d, method="ward.D") #繪制聚類圖 #可以看到在20個文檔中,489號和502號聚成一類,與其它文檔區別較大。 plot(fit,main ="文件聚類分析") #主成分分析 ozMat <- TermDocumentMatrix(makeChunks(reuters, 50), list(weighting = weightBin)) k <- princomp(as.matrix(ozMat), features = 2) screeplot(k,npcs=6,type='lines') windows() biplot(k)