Как получить точную относительную распространенность темы из STM, за несколько периодов времени? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь использовать пакет stm в R для вычисления относительной распространенности или доли тем в корпусе в разные периоды.Например, скажем, в период времени 1 состав тем среди документов этого периода может быть следующим: 80% темы A, 10% темы B и 10% темы C. И в следующем периоде, содержащем сновапакет документов, состав может быть 70% A, 30% B и 0% C.

Структурные тематические модели звучали так, как будто они хорошо подходят для этого, так как вы можете определять ковариаты, например время.За исключением ... Я не могу понять, как именно это сделать.Вот минимальный пример, использующий некоторые данные из пакета quanteda:

library(quanteda)
library(stm)
library(ggplot2)
library(dplyr)
library(tidyr)

# get data: US presidents inaugural speeches
df = dfm(data_corpus_inaugural, tolower = T, stem=T,remove=stopwords(), remove_punct=T) %>% 
 dfm_trim(min_termfreq = 10, max_docfreq = 0.75, docfreq_type="prop") %>% 
 convert("stm")
df$meta$Decade = as.numeric(gsub("^(...).*","\\1", df$meta$Year)) 
 # grouped the speeches by decade, instead of year
smod <- stm(df$documents, df$vocab, K = 5, verbose = FALSE, prevalence = ~Decade, data=df$meta )
summary(smod)

# attempt 1: use doc-topic proportions - but this is per document, not per decade...
labs = labelTopics(smod)
rownames(smod$theta) = 1:58
colnames(smod$theta) = 1:5
d=as.data.frame.table(smod$theta)
ggplot(d, aes(x = Var1, y = Freq, group = Var2, colour = Var2)) + 
  geom_point() +
  geom_line()

# attempt 1.2: use doc-topic proportions, but take mean per time period (decade)
# this sort of gives an idea how much on average each topic was present among the documents
d2 = cbind(smod$theta, df$meta$Decade); colnames(d2)[6] = "decade"
d2 %>% as.data.frame() %>% gather(topic, proportion, 1:5, factor_key = T) %>% 
 group_by(decade, topic) %>% 
 summarise(mean=mean(proportion))
# problem, won't sum to one, also not sure if correct approach

# attempt 2: try using the prevalence estimation
est = estimateEffect(1:5 ~ s(Decade), smod, df$meta) # based on stm help
plot(est, "Decade", model=smod, method="continuous")
abline(h=0)

Последний бит создает объект, который при построении графикавыглядит как распространенность во времени.Хотя некоторые наблюдения: это сглажено (из-за s() в формуле), в то время как я ищу точные пропорции темы по периодам;также некоторые значения опускаются ниже 0 (не только доверительные интервалы, а также некоторые оценочные кривые).Просто наличие «Десятилетий» в формуле регрессии приводит меня к линейной регрессии, что бесполезно для этой задачи.Объект est$parameters содержит Intercept и значение для каждого сплайна (умножение на 25);сохранение plot() как объекта, с method="point" дает доступ к вычисленным значениям means пропорций для каждой темы (но это все еще из гладкого сплайна - увеличение значения df для s() дает больше значений),В любом случае, плавная регрессия с помощью команды сюжета кажется окольным способом получения пропорций.

Таким образом, вопрос: как вызвать в воображении , чтобы правильно получить период за периодомотносительные тематические композиции (пропорции) из stm модели?

(В качестве альтернативы: если это совершенно неправильный метод для получения таких тематических пропорций, что было бы лучше?)

(Обновление: в этом QA предлагается использовать средства постеров темы в LDA; я не уверен, совпадает ли это с моей попыткой 1, или это хороший подход?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...