我有一组来自几个期刊的文本文件(让他们称之为期刊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
从这里开始在myCorpus
上运行LDA:
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
标记的处理方式)。我不确定如何最好地存储这些信息,以便我可以使用发布日期作为横轴。更重要的是,我如何创建我提到的图表?
答案 0 :(得分:1)
我假设您要使用ggplot
,因为您添加了此标记。您首先需要在数据框中收集数据。
假设lda
是LDA()
的输出而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))