LDA主题模型

Reads: 2114 Edit

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参数,否则可能不会绘制成设置的图形!

r-111

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个关键词的柱状图。

r-112

> 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

r-113



获取案例数据,请关注微信公众号并回复:R_dt17


Comments

Make a comment