1 问题描述
为了演示LDA主题模型,我们将词云分析中的《政府工作报告》拆成3个txt文档,存放在report文件夹下(在实际文本挖掘中,大部分都需要读取多个文档),以此为例来演示LDA主题模型的操作!
2 中文预处理
安装加载用到的包
> install.packages("SnowballC")
> library(SnowballC)
> install.packages("topicmodels")
> library(topicmodels)
> library(Rwordseg)
> library(tm)
> library(tidyverse)
> library(wordcloud2)
> install.packages("tidytext")
> library(tidytext)
读取文本数据
> setwd("D:/Desktop/report")
> filenames=list.files(getwd(),pattern="txt")
> files=lapply(filenames,readLines)
> files=files[!is.na(files)]
说明:report文件夹下面有三个文档,所以读取到files中也包含三个文档!
中文分词
> words=segmentCN(as.character(files),returnType="tm") ## 注意加returnType="tm"
说明:注意加returnType="tm",否则输出的是中文词语向量,不是自然语言!
生成语料库
> words_corpus=Corpus(VectorSource(words)) ## 生成语料库
说明:“语料库是包含(自然语言)文本的文档集合。”生成语料库后可以对其进行一些操作,如去掉停词,数字等。这里不再演示!(本例中读取了三个文档)
生成DTM文件
> words_dtm=DocumentTermMatrix(words_corpus,control = list(wordLengths=c(1,Inf)))
说明:“DTM矩阵是每个文档中每个term(单词,或是词汇表vocab)出现的次数。”(本例中读取了三个文档)
统计词汇数量并绘制词云图
> word_freq=sort(colSums(as.matrix(words_dtm)),decreasing=TRUE)
> word_freq=data.frame(词汇=names(word_freq),频率=word_freq,row.names = NULL)
> head(word_freq)
词汇 频率
1 和 189
2 发展 150
3 的 137
4 建设 85
5 经济 67
6 推进 64
> word_freq[word_freq$频率>30,] %>% wordcloud2(color="random-dark",size=0.5,backgroundColor="white")
说明:注意词云需要通过调整size参数,否则可能不会绘制成设置的图形!
3 LDA主题模型
去除稀疏词汇
> words_dtm2=removeSparseTerms(words_dtm,sparse = 0.98)
构建LDA模型
> words_lda=LDA(words_dtm2,k=2,control = list(seed=1234))
说明:这里设置了两个主题(k=2)
> words_topic=as.matrix(topics(words_lda))
> words_topic
[,1]
1 1
2 2
3 2
说明:3个文档和两个主题的对应关系!
> words_term=as.matrix(terms(words_lda,5))
> words_term
Topic 1 Topic 2
[1,] "和" "和"
[2,] "的" "发展"
[3,] "是" "的"
[4,] "人民" "建设"
[5,] "就业" "经济"
说明:两个主题中排名靠前的5个关键词。
> words_tlda=tidy(words_lda)
> top_terms <- words_tlda %>% group_by(topic) %>% top_n(5, beta) %>% ungroup() %>% arrange(topic, -beta)
> top_terms
# A tibble: 10 x 3
topic term beta
<int> <chr> <dbl>
1 1 和 0.0161
2 1 的 0.0154
3 1 是 0.00926
4 1 人民 0.00741
5 1 就业 0.00741
6 2 和 0.0236
7 2 发展 0.0201
8 2 的 0.0162
9 2 建设 0.0106
10 2 经济 0.00825
说明:两个主题中排名靠前的5个关键词及其概率。
> top_terms %>% mutate(term = reorder(term, beta)) %>% ggplot( aes(term, beta, fill = factor(topic))) + geom_bar(alpha = 0.8, stat = "identity", show.legend = FALSE) + facet_wrap(~ topic, scales = "free") + coord_flip()
说明:绘制5个关键词的柱状图。
> words_glda=tidy(words_lda,matrix = "gamma")
> words_glda
# A tibble: 6 x 3
document topic gamma
<chr> <int> <dbl>
1 1 1 1.00
2 2 1 0.0000238
3 3 1 0.00000697
4 1 2 0.0000230
5 2 2 1.00
6 3 2 1.00
说明:3个文档和2个主题之间对应关系及概率!
> words_glda = words_glda %>% separate(document, c("title", "chapter"), sep = "_", convert = TRUE)
> ggplot(words_glda, aes(gamma, fill = factor(topic))) + geom_histogram() + facet_wrap(~ title, nrow = 2)
说明:绘制3个文档和2个主题之间对应关系图!如主题1和文档1对应的概率约为1,主题2和文档2和文档3对应的概率约为1