按日期绘制单个 LDA 主题(在 R 中)

Graph a single LDA topic by date (in R)

我有一组来自多个期刊(我们称它们为期刊 A 和期刊 B)的文本文件,我正在尝试 运行 LDA。我将它们各自分成自己的语料库,然后将文件名附加到每个语料库中,将原始日志存储在 origin 标签下,最后将两个语料库合并为 myCorpus:

library(tm); library(topicmodels);

txtfolder <- "~/Path/to/txtfiles/"
source <- DirSource(txtfolder)
A.names <- list.files(path=txtfolder, pattern="A")
B.names <- list.files(path=txtfolder, pattern="B")
A.names <- lapply(X=A.names, FUN=function(i){gsub(".txt", '', x=i)})
B.names <- lapply(X=B.names, FUN=function(i){gsub(".txt", '', x=i)})
A.corpus <- Corpus(A.source, readerControl=list(reader=readPlain))
for (i in 1:length(A.corpus)){
  meta(A.corpus[[i]], tag = "origin") <- "A"
}
B.corpus <- Corpus(B.source, readerControl=list(reader=readPlain))
for (i in 1:length(B.corpus)){
  meta(B.corpus[[i]], tag = "origin") <- "B"
}
myCorpus <- c(A.corpus, B.corpus) # combining the two corpuses

从这里我 运行 LDA on myCorpus:

myCorpus <- tm_map(myCorpus, PlainTextDocument)
dtm <- DocumentTermMatrix(myCorpus, control = list(minWordLength=3))
n.topics <- 5
lda.model <- LDA(dtm, n.topics)
terms(lda.model,10)

从这里我想创建一个图表来衡量每本期刊因特定主题随时间推移所占的比例(我可以通过解析 txt 文件来确定每期期刊的出版时间,并且将它们存储在一个向量中,类似于我对 origin 标签的处理方式)。我不确定如何最好地存储此信息,以便我可以使用发布日期作为水平轴。更重要的是,如何创建我提到的图表?

我假设你想使用 ggplot 因为你添加了这个标签。您首先需要将数据收集到数据框中。

假设 ldaLDA() 的输出,corpus 是语料库,您将找到带有 topics(lda) 的主题和文档中的各种信息meta(corpus)。您可能需要根据您的语料库进行调整:

df <- data.frame(id=names(topics(lda)),
                 topic=topics(lda),
                 date=as.POSIXct(unlist(lapply(meta(corpus,type="local",tag="datetimestamp"),as.character))),
                 origin=unlist(meta(corpus,type="local",tag="origin"))    )

然后,您需要计算要绘制的统计数据:每个主题按日期和来源的频率,以及

library(dplyr)
library(tidyr)
M <- df %>% gather(key,value,topic) %>%
  group_by(date,origin,value) %>%
  summarize(n=n()) %>%
  mutate(f=n/sum(n))

最后,为了绘制它:

library(ggplot2)

ggplot(data=M,aes(x=date,fill=factor(value),y=f)) + 
  geom_bar(stat="identity",position="stack") +
  facet_grid(~origin)

这是它给出的模拟数据

set.seed(100)
df <- data.frame(date=sample(seq.Date(as.Date("2015-07-27 10:12:25"),as.Date("2015-07-31 10:12:25"),by=1),100,replace=TRUE),
       id=1:100,
       topic=sample(1:5,100,replace=TRUE),
       origin=sample(c("A","B"),100,replace=TRUE))