【问题标题】:LDA TopicModels producing list of numbers rather than termsLDA TopicModels 生成数字列表而不是术语
【发布时间】:2023-04-04 23:08:01
【问题描述】:

请耐心等待,因为我对此非常陌生,并且正在为证书课程的课程项目工作。

我有一个 .csv 数据集,它是通过从 Pubmed 和 Embase 数据库中检索文献计量记录而获得的。有 1034 行。有几列,但是,我试图从一列创建主题模型,摘要列和一些记录没有摘要​​。我已经进行了一些处理(删除停用词、标点符号等),并且能够绘制出现超过 200 次的单词,并按排名创建常用术语列表,还可以运行与选定单词的单词关联。因此,似乎 r 在 Abstract 字段中看到了单词本身。当我尝试使用 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"  

为什么我在这里看不到文字而不是数字?

此外,我基本上从 topicmodels 上的 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]

对问题可能是什么有任何想法?

【问题讨论】:

  • 提问时请提供reproducible examples
  • 如果没有可重现的示例,很难判断,但我怀疑您正在获取文档来代替条款。您是否尝试过使用DocumentTermMatrix() 而不是TermDocumentMatrix()
  • 是的,我试过了。出于某种原因,它产生了一个零项的矩阵,因此我无法用它做任何事情。当我尝试使用 TDM 绘制词频时,我得到一个数字条形图而不是术语。你需要什么才能重现?再次,我注意到我是新手,所以我不完全理解。你的意思是所有代码还是更多?
  • 您可以在 Adam 包含的链接中查看有关可重现示例的更多信息,但最重要的是数据样本。这样我们就可以运行与您完全相同的代码并查看结果。能否包含dput(head(records$Abstract, 10)) 的输出,或产生相同问题的玩具数据集?
  • DTM 的某些行也将全为零,因为某些记录没有摘要​​。这些可能在 Abstracts 列中表示为空字符串,并且由于它们没有术语,因此这些文档的所有术语频率为零。我会将您的数据子集以删除像这样的空摘要:abstracts &lt;- records$Abstract[records$Abstract != ""],然后创建语料库和 DTM。

标签: r lda topicmodels


【解决方案1】:

阅读 topicmodels 文档,LDA() 函数似乎需要 DocumentTermMatrix,而不是 TermDocumentMatrix。尝试使用 DocumentTermMatrix(AbstractCorpus) 创建前者,看看是否可行。

【讨论】:

  • 这确实有效!但是,我必须添加一些代码来消除行中的空条目。
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2013-09-05
  • 2021-10-07
  • 2018-03-29
相关资源
最近更新 更多