LDA主题模型生成数字列表而非术语

6
请容我先说明一下,我对这个领域非常陌生,正在完成一个学位课程的项目。我有一个.csv数据集,是从Pubmed和Embase数据库检索到的文献记录。数据集共有1034行,包含多个字段,然而,我只想从摘要字段创建话题模型,而且某些记录没有摘要。我进行了一些处理(去除停用词、标点符号等),并成功地制作了出现次数超过200次的单词条形图,并按排名创建了一个常见术语列表,还可以通过选定的单词运行词汇联想。因此,看起来R确实在摘要字段中看到了单词本身。然而,当我尝试使用topicmodels软件包创建话题模型时,问题就来了。以下是我正使用的代码部分。
#including 1st 3 lines for reference
options(header = FALSE, stringsAsFactors = FALSE, FileEncoding = 
"latin1")
records <- read.csv("Combined.csv")
AbstractCorpus <- Corpus(VectorSource(records$Abstract))

AbstractTDM <- TermDocumentMatrix(AbstractCorpus)
library(topicmodels)
library(lda)
lda <- LDA(AbstractTDM, k = 8)
(term <- terms(lda, 6))
term <- (apply(term, MARGIN = 2, paste, collapse = ","))

然而,我得到的主题输出如下。
Topic 1 Topic 2 Topic 3 Topic 4 Topic 5 Topic 6 Topic 7 Topic 8

[1,] "499"   "733"   "390"   "833"   "17"    "413"   "719"   "392"  
[2,] "484"   "655"   "808"   "412"   "550"   "881"   "721"   "61"   
[3,] "857"   "299"   "878"   "909"   "15"    "258"   "47"    "164"  
[4,] "491"   "672"   "313"   "1028"  "126"   "55"    "375"   "987"  
[5,] "734"   "430"   "405"   "102"   "13"    "193"   "83"    "588"  
[6,] "403"   "52"    "489"   "10"    "598"   "52"    "933"   "980"  

为什么我在这里看到的不是单词而是数字?

此外,下面的代码基本上是我从主题模型的R PDF中获取的,它确实为我生成了值,但主题仍然是数字而不是单词,这对我来说毫无意义。

#using information from topicmodels paper
library(tm)
library(topicmodels)
library(lda)
AbstractTM <- list(VEM = LDA(AbstractTDM, k = 10, control = list(seed =    
505)), VEM_fixed = LDA(AbstractTDM, k = 10, control = list(estimate.alpha 
= FALSE, seed = 505)), Gibbs = LDA(AbstractTDM, k = 10, method = "Gibbs", 
Control = list(seed = 505, burnin = 100, thin = 10, iter = 100)), CTM = 
CTM(AbstractTDM, k = 10, control = list(seed = 505, var = list(tol = 
10^-4), em = list(tol = 10^-3))))
#To compare the fitted models we first investigate the α values of the    
models fitted with VEM and α estimated and with VEM and α fixed 

sapply(AbstractTM[1:2], slot, "alpha")

#Find entropy 
sapply(AbstractTM, function(x)mean(apply(posterior(x)$topics, 1, 
function(z) - sum(z * log(z)))))

#Find estimated topics and terms
Topic <- topics(AbstractTM[["VEM"]], 1)
Topic
#find 5 most frequent terms for each topic
Terms <- terms(AbstractTM[["VEM"]], 5)
Terms[,1:5]

有什么想法,可能是什么问题?

当你提出问题时,请提供可重现的示例。如何创建一个很棒的R可重现示例 - Adam Quek
很难在没有可重现的示例的情况下确定,但我怀疑您得到的是文档而不是术语。您是否尝试过使用DocumentTermMatrix()而不是TermDocumentMatrix() - Kara Woo
是的,我已经尝试过了。由于某种原因,它生成了一个零项矩阵,因此我无法对其进行任何操作。当我尝试使用TDM绘制单词频率时,我得到的是数字而不是术语的条形图。要使此过程可重复,您需要什么?再次说明,我是新手,所以我不完全理解。您是指所有代码还是更多内容? - SciLibby
您可以在Adam提供的链接中查看有关可重现示例的更多信息,但最重要的是数据样本。这样我们就可以运行与您完全相同的代码并查看结果。您能否包括dput(head(records$Abstract, 10))的输出,或者产生相同问题的玩具数据集? - Kara Woo
1
DTM 中的某些行将全部为零,因为其中一些记录没有摘要。这些记录在摘要列中可能表示为空字符串,由于它们没有术语,因此这些文档的所有术语频率都为零。我建议对数据进行子集处理,以删除空摘要,如下所示:abstracts <- records$Abstract[records$Abstract != ""],然后创建语料库和 DTM。 - Kara Woo
1个回答

5
阅读topicmodels文档,似乎LDA()函数需要一个DocumentTermMatrix而不是TermDocumentMatrix。尝试使用DocumentTermMatrix(AbstractCorpus)创建前者并查看是否有效。

1
这个做法是有效的!但我还需要添加一小段代码以去除行中的空条目。 - SciLibby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接