在提取文本LDA时,需要先生成文档的DTM矩阵。
对于DTM矩阵,维基百科上给出了详细的解释。
有两个document分别名为D1,D2:
也就是说DTM矩阵是每个Document中每个term(单词,或是词汇表vocab)出现的次数。
R语言的tm包给出了直接求取dtm的接口
library(SnowballC)
library(NLP)
library(tm)
#vignette("tm") #调用函数包文件
##1.Data Import 导入自带的路透社的20篇xml文档
#找到/texts/crude的目录,作为DirSource的输入,读取20篇xml文档
reut21578 <- system.file("texts", "wiki_sentence", package = "tm")
reuters <- Corpus(DirSource(reut21578), readerControl = list(language = "english"))
##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, PlainTextDocument)#将reuters转化为纯文本文件,去除标签
reuters <- tm_map(reuters, stripWhitespace)#去掉空白
reuters <- tm_map(reuters, tolower)#转换为小写
reuters <- tm_map(reuters, removeWords, stopwords("english"))#去停用词
tm_map(reuters, stemDocument)
##5.创建文档矩阵 Creating Term-Document Matrices
#将处理后的语料库进行断字处理,生成词频权重矩阵(稀疏矩阵)也叫词汇文档矩阵
reuters <- tm_map(reuters, PlainTextDocument)#将reuters转化为纯文本文件,去除标签
dtm <- DocumentTermMatrix(reuters)
#查看词汇文档矩阵内容
#inspect(dtm[1:5, 100:105])
#d<-c("price","crude","oil","use") #以这几个关键词为查询工具
#inspect(DocumentTermMatrix(reuters,control=list(dictionary=d)))
inspect(dtm)
#dtm1<- removeSparseTerms(dtm, sparse=0.2)
#inspect(dtm1)
dtmm<-as.matrix(dtm)
coln = colnames(dtmm)
write.table(coln, file = "D:/vocab.txt",row.names = FALSE,col.names = FALSE)
#行数和列数
dtmm_r<-nrow(dtmm)
dtmm_c<-ncol(dtmm)
write.table(dtmm, file = "D:/dtm.txt",row.names = FALSE,col.names = FALSE)
#write.table(dtmm[2,], file = "C:/Users/Mandy/Desktop/5.txt")
但是,从vocab.txt中可以看出,R语言的分词效果并不好。因此在做LDA时,不建议利用R的接口生成DTM矩阵。