使用STM包编写函数处理语料列表时遇round(x)错误求解决
修复STM函数调用的"non-numeric argument to mathematical function"错误
这个错误通常是传入stm()的参数不符合要求导致的,以下是针对性修复方案:
1. 确认topic.count为有效数值
首先检查topic.count是否被定义为正整数——如果它是字符类型、未定义或非整数,会触发数值运算错误。示例:
# 明确设置主题数量为正整数 topic.count <- 5
2. 过滤修剪后为空的DFM
dfm_trim()可能会把部分语料库的所有词汇过滤掉(比如文档过少、词汇频率极端),导致转换后的documents参数无效。在函数中添加检查,跳过空DFM:
stmfunction <- function(y) { # 修剪DFM uncorpus.dfm.trim <- dfm_trim(y, min_docfreq = 0.075, max_docfreq = 0.90, docfreq_type = "prop") # 检查修剪后的DFM是否有有效内容 if (nfeat(uncorpus.dfm.trim) == 0 || ndoc(uncorpus.dfm.trim) == 0) { warning("当前语料库修剪后无有效内容,跳过建模") return(NULL) } # 转换为STM格式 dfm2stm <- convert(uncorpus.dfm.trim, to = "stm") # 检查documents的数值有效性 if (!is.numeric(unlist(dfm2stm$documents))) { warning("当前语料库转换后的documents格式无效,跳过建模") return(NULL) } # 构建STM模型 model.stm <- stm(dfm2stm$documents, dfm2stm$vocab, K = topic.count, data = dfm2stm$meta, init.type = "Spectral") return(model.stm) } all_stm <- lapply(dfmlist, stmfunction)
3. 手动验证DFM转换结果
如果上述修复仍报错,可单独测试列表中的DFM,确认转换后的documents结构符合STM要求:
# 取列表中第一个DFM进行测试 test_dfm <- dfmlist[[1]] test_trim <- dfm_trim(test_dfm, min_docfreq = 0.075, max_docfreq = 0.90, docfreq_type = "prop") test_stm <- convert(test_trim, to = "stm") # 检查documents的结构(预期为嵌套列表,每个元素包含两个整数向量:位置和计数) str(test_stm$documents)
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

