LDA是一个生成式过程,他按照下面的步骤进行迭代,直到达到一个平稳状态
我们使用的基础软件包是tm,这是专门的文本挖掘软件包。还需要SnowballC包进行词干提取,使用RColorBrewer包进行上色,当然还有wordcloud包
install.packages("tm")
install.packages("wordcloud")
install.packages("RColorBrewer")
library(tm)
library(wordcloud)
library(RColorBrewer)
数据文件的下载地址
或者使用百度网盘下载:链接:
提取码:99o4
别忘了把文件放在工作路径下
getwd()
name <- file.path("E:/r1/text")
dir(name)
这里的text是一个单独的文件夹
将语法资料库命名为docs,并使用Corpus()函数建立语料库。函数包装了DirSource函数,他是tm包的一部分
docs <- Corpus(DirSource(name))
现在,使用tm包中的tm_map函数进行文本转换
docs <- tm_map(docs,tolower)#小写
docs <- tm_map(docs,removeNumbers)#去掉数字
docs <- tm_map(docs,removePunctuation)#去掉标点符号
docs <- tm_map(docs,removeWords,stopwords("english"))#剔除停用词
docs <- tm_map(docs,stripWhitespace)#删除空白字符
此时,应该删除不必要的词。例如,在演讲过程中,当国会议员对于某个部分鼓掌欢呼的时候,文本中就会出现(Applause),这是必须要删除的:
docs <- tm_map(docs,removeWords,c("applause","can","cant","will",
"that","weve","dont","wont","youll","youre"))
结束文本和冗余词后,请确认文档还是纯文本形式,然后将其放入文档—词矩阵并查看维度:
dtm <- DocumentTermMatrix(docs)
dim(dtm)
rownames(dtm) <- c("2010","2011","2012","2013","2014","2015","2016")
inspect(dtm[1:7,1:5])
首先建立一个对象,计算每列综合,然后按照降序重新排列。要计算每列总合,要在代码中使用as.matrix函数。默认的排序方式是升序,所以在freq前面加一个负号就变成了降序
freq <- colSums(as.matrix(dtm))
ord <- order(-freq)
freq[head(ord)]
freq[tail(ord)]
wordcloud(names(freq),freq,min.freq = 70,scale=c(3,0.5),
colors = brewer.pal(6,"Dark2"))
gg <- data.frame(freq[head(ord,10)])
colnames(gg) <-" Frequency"
x <- rownames(gg);x
y <- gg[,1]
library(ggplot2)
ggplot(gg)+geom_col(aes(x,y,fill=x))+
labs(x="Words",y="Frenquency",title="Word Frenquency")+
theme(plot.title = element_text(hjust = 0.5,size=15),
legend.position = "none")
ggplot(gg,aes(x,y,fill=x))+geom_bar(stat="identity")
下面使用topicmodels包建立主题模型,这个包提供了LDA函数。问题在于建立多少个主题,看上去3个比较合适,当然也可以尝试其他的:
install.packages("topicmodels")#如果安装失败则按照下面的方法
#先安装pacman包
library(pacman)
p_install("topicmodels")
library(topicmodels)
lda <- LDA(dtm,k=3,method="Gibbs")
topics(lda)
terms(lda,25)