我是这方面的新手,所以如果我在这里问显而易见的问题,我深表歉意。我运行了双项主题建模算法来对短文本数据进行建模并发现其中的主题。我正在使用 LDAvis 包来可视化和理解数据。然而,据我了解,定性地阅读原始数据将帮助我了解潜在的主题是什么以及人们在谈论什么。从原始文本数据中进行关键字搜索没有帮助,因为关键字通常与多个主题重叠,并且选择一个关键字可能会导致包含与多个主题相关的数据的子集。为此,我希望将每条推文/文档分配给一个主题,以便能够手动分析它们并了解该主题正在讨论的内容,因为我正在分析的客户反馈数据通常包含可以同时指示多项内容的关键字。
我尝试将 BTM 包生成的分数数组中的每一行的最大值分配为此处指示的分数数组作为最有可能与每个文档关联的主题,并且在语法上是成功的。然而,生成的主题在视觉上与 LDAvis 不匹配。例如,我可以看到关键字“apps”仅出现在 LDAvis 所示的主题“10”中,但手动选择包含关键字“apps”的数据子集会导致两条推文/文档都分配给不同的主题每个分数数组。我这样做正确吗?我目前正在将主题写入 csv 文件,因为我是 R 新手,并且不想找出将主题添加到原始数据框(命名数据)然后将该文件写入磁盘的方法。
#运行双项主题建模
set.seed(9082374)
model <- BTM(x, k = 10, alpha = 0.1, beta = 0.01, iter = 2000, trace = 100, detailed=TRUE)
#预测新数据的主题分数
scores <- predict(model, x)
final.topic<-apply(scores, 1, which.min)
fwrite(list(final.topic), file="topic_max.csv")
如果您想查看我正在运行的代码,这里是代码。特别是 LDAvis 部分,因为我在运行 LDAvis 时确实遇到了一些挑战。
term.table1 <- table(x$text)
# Create JSON data for LDAvis
docsize <- table(x$id)
scores <- scores[names(docsize), ]
json <- createJSON(
phi = t(model$phi),
theta = scores,
doc.length = as.integer(docsize),
vocab = as.character(rownames(model$phi)),
term.frequency = term.table1)
serVis(json)
library(data.table)
final.topic<-apply(scores, 1, which.max)
fwrite(list(final.topic), file="topic_max.csv")
可以使用 LDAvis 可视化中相同的排序顺序(使用创建的 json 对象)对其文档/主题和主题词数组(thetha 和 phi)进行排序,以确保 LDAvis 中的主题分配和分数/theta 矩阵匹配.
这里有一个方法。
new.order <- RJSONIO::fromJSON(json)$topic.order
scores <- scores[, new.order]