LDA主题模型按年份绘制
LDA topic model plotting by year
我正在尝试从此文件中按年份绘制推文主题
https://www.mediafire.com/file/64lzbt46v01jbe1/cleaned.xlsx/file
可以很好地获取主题,但是当我尝试按年份绘制它们时,我遇到了尺寸问题:
library(readxl)
library(tm)
tweets <- read_xlsx("C:/cleaned.xlsx")
mytextdata <- tweets$textdata
# Convert to tm corpus and use its API
corpus <- Corpus(VectorSource(mytextdata)) # Create corpus object
dtm <- DocumentTermMatrix(corpus)
ui = unique(dtm$i)
dtm.new = dtm[ui,]
k <- 7
ldaTopics <- LDA(dtm.new, method = "Gibbs", control=list(alpha = 0.1, seed = 77), k = k)
tmResult <- posterior(ldaTopics)
theta <- tmResult$topics
dim(theta)
dim(theta)=4857 我的 cleaned.xls 文件中有 4876 个日期,我需要它们与 运行 这个聚合函数
相同
topic_proportion_per_decade <- aggregate(theta, by = list(decade = textdata$decade), mean)
从这里开始
https://tm4ss.github.io/docs/Tutorial_6_Topic_Models.html
我认为问题是 cleaned.xls 文件不够干净,这就是 theta 遗漏某些行的原因。
但事实上我真的不知道为什么 theta 会漏掉一些行..
如果那是问题,我也不知道如何更好地清理文件,文件对我来说看起来不错,有些行只有数字或非英语单词,但我更愿意保留它们..
问题是ui = unique(dtm$i)
删除了几个文档(我不知道你为什么这样做,所以我不会评论那部分)。所以你的 theta 没有与数据相同的行数。我们可以通过只保留仍在 theta 中的行来解决这个问题:
library("dplyr")
library("reshape2")
library("ggplot2")
tweets_clean <- tweets %>%
mutate(id = rownames(.)) %>%
filter(id %in% rownames(theta)) %>% # keep only rows still in theta
cbind(theta) %>% # now we can attach the topics to the data.frame
mutate(year = format(date, "%Y")) # make year variable
然后我使用 dplyr
函数进行聚合,因为我认为它更易于阅读代码:
tweets_clean_yearly <- tweets_clean %>%
group_by(year) %>%
summarise_at(vars(as.character(1:7)), funs(mean)) %>%
melt(id.vars = "year")
然后我们可以这样绘制:
ggplot(tweets_clean_yearly, aes(x = year, y = value, fill = variable)) +
geom_bar(stat = "identity") +
ylab("proportion")
注意:我测试了 theta 和 tweets 是否真的有相同的文档:
tweets_clean <- tweets %>%
mutate(id = rownames(.)) %>%
filter(id %in% rownames(theta))
all.equal(tweets_clean$id, rownames(theta))
我正在尝试从此文件中按年份绘制推文主题
https://www.mediafire.com/file/64lzbt46v01jbe1/cleaned.xlsx/file
可以很好地获取主题,但是当我尝试按年份绘制它们时,我遇到了尺寸问题:
library(readxl)
library(tm)
tweets <- read_xlsx("C:/cleaned.xlsx")
mytextdata <- tweets$textdata
# Convert to tm corpus and use its API
corpus <- Corpus(VectorSource(mytextdata)) # Create corpus object
dtm <- DocumentTermMatrix(corpus)
ui = unique(dtm$i)
dtm.new = dtm[ui,]
k <- 7
ldaTopics <- LDA(dtm.new, method = "Gibbs", control=list(alpha = 0.1, seed = 77), k = k)
tmResult <- posterior(ldaTopics)
theta <- tmResult$topics
dim(theta)
dim(theta)=4857 我的 cleaned.xls 文件中有 4876 个日期,我需要它们与 运行 这个聚合函数
相同topic_proportion_per_decade <- aggregate(theta, by = list(decade = textdata$decade), mean)
从这里开始
https://tm4ss.github.io/docs/Tutorial_6_Topic_Models.html
我认为问题是 cleaned.xls 文件不够干净,这就是 theta 遗漏某些行的原因。 但事实上我真的不知道为什么 theta 会漏掉一些行.. 如果那是问题,我也不知道如何更好地清理文件,文件对我来说看起来不错,有些行只有数字或非英语单词,但我更愿意保留它们..
问题是ui = unique(dtm$i)
删除了几个文档(我不知道你为什么这样做,所以我不会评论那部分)。所以你的 theta 没有与数据相同的行数。我们可以通过只保留仍在 theta 中的行来解决这个问题:
library("dplyr")
library("reshape2")
library("ggplot2")
tweets_clean <- tweets %>%
mutate(id = rownames(.)) %>%
filter(id %in% rownames(theta)) %>% # keep only rows still in theta
cbind(theta) %>% # now we can attach the topics to the data.frame
mutate(year = format(date, "%Y")) # make year variable
然后我使用 dplyr
函数进行聚合,因为我认为它更易于阅读代码:
tweets_clean_yearly <- tweets_clean %>%
group_by(year) %>%
summarise_at(vars(as.character(1:7)), funs(mean)) %>%
melt(id.vars = "year")
然后我们可以这样绘制:
ggplot(tweets_clean_yearly, aes(x = year, y = value, fill = variable)) +
geom_bar(stat = "identity") +
ylab("proportion")
注意:我测试了 theta 和 tweets 是否真的有相同的文档:
tweets_clean <- tweets %>%
mutate(id = rownames(.)) %>%
filter(id %in% rownames(theta))
all.equal(tweets_clean$id, rownames(theta))