Построение тематической модели LDA по годам - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь построить темы твитов по годам из этого файла

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, и у меня есть 4876 дат в моем файле cleaned.xls, и мне нужно, чтобы они были одинаковыми для запуска этой агрегатной функции

topic_proportion_per_decade <- aggregate(theta, by = list(decade = textdata$decade), mean)

отсюда

https://tm4ss.github.io/docs/Tutorial_6_Topic_Models.html

Я думаю, что проблема в том, что файл cleaned.xls недостаточно чист, и поэтому тета пропускает некоторые строки. Но на самом деле я действительно неЯ не знаю, почему тета пропускает некоторые строки. Я также не знаю, как лучше очистить файл, если это было проблемой, файл выглядит хорошо для меня, есть некоторые строки, которые являются только числами или неанглийскими словами, но я предпочитаюдержать их ..

1 Ответ

0 голосов
/ 03 марта 2019

Проблема в том, что ui = unique(dtm$i) удаляет несколько документов (я не знаю, почему вы это делаете, поэтому я не буду комментировать эту часть).Таким образом, ваша тета не имеет того же количества строк, что и данные.Мы можем решить эту проблему, сохранив только те строки, которые все еще находятся в тэте:

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")

plot

Примечание : я проверял, есть ли тета и твитыбыли действительно те же документы с:

tweets_clean <- tweets %>% 
  mutate(id = rownames(.)) %>% 
  filter(id %in% rownames(theta))

all.equal(tweets_clean$id, rownames(theta))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...