You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保留ID并将DTM与原Data Frame合并以减少推文丢失?

解决DTM保留原推文ID及数据合并问题

我明白你遇到的痛点——清理空文档后,DTM和原数据框行数不匹配,还没法直接关联原推文ID。下面是一套实操性的解决方案,分步骤帮你搞定:

步骤1:创建绑定原ID的语料库

首先要让语料库的每个文档都和原数据框的推文ID绑定,这样后续过滤后还能精准追踪对应ID。推荐用DataframeSource创建语料库,它能更方便地保留元数据:

# 准备用于生成语料库的数据框,指定文本列和ID列
corpus_df <- data.frame(
  text = ngram.features.df$X1,
  id = ngram.features.df$ID,
  stringsAsFactors = FALSE
)
# 将行名设为原ID,确保语料库文档ID与原数据完全对应
rownames(corpus_df) <- corpus_df$id

# 创建带ID标记的语料库
tweets.corpus <- VCorpus(DataframeSource(corpus_df))

步骤2:过滤空文档并生成目标DTM

接下来计算文档长度,过滤掉空文档,同时保证ID的关联关系不丢失:

# 计算所有文档的词数总和
doc.lengths <- rowSums(as.matrix(DocumentTermMatrix(tweets.corpus)))
# 生成需要保留的文档的逻辑索引
keep_indices <- doc.lengths > 0

# 过滤语料库(仅保留非空文档)
filtered_corpus <- tweets.corpus[keep_indices]
# 生成符合要求的DTM
mydtm <- DocumentTermMatrix(filtered_corpus, control = list(wordLengths = c(3,10)))

步骤3:给DTM添加原推文ID

现在从过滤后的语料库中提取ID,把它和DTM绑定成带ID的数据框:

# 提取过滤后文档对应的原推文ID
filtered_ids <- sapply(filtered_corpus, function(doc) meta(doc, "id"))

# 将DTM转换为数据框,并添加ID列
dtm_with_id <- cbind(
  ID = filtered_ids,
  as.data.frame(as.matrix(mydtm))
)

步骤4:合并原数据框与DTM数据

根据你的需求,有两种合并方式可选:

方式A:保留所有原推文(含空文档)

如果需要保留原数据框的44159行,空文档对应的DTM列填充为NA,用左连接即可:

library(dplyr)
final_dataset <- left_join(ngram.features.df, dtm_with_id, by = "ID")

方式B:仅保留非空文档(行数完全匹配)

如果只需要后续建模用到的非空推文,直接合并过滤后的原数据框和DTM就行:

# 过滤原数据框,仅保留非空文档的行
filtered_ngram_df <- ngram.features.df[keep_indices, ]
# 合并(行数一致且顺序完全对应,直接绑定即可)
final_dataset <- cbind(filtered_ngram_df, as.data.frame(as.matrix(mydtm)))

这样处理后,你就能得到带原推文ID、可直接用于分类和主题建模的最终数据集了。

内容的提问来源于stack exchange,提问作者knightmiklotov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:18