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

在R的quanteda包中预处理后还原句子语料并保留文档变量

在quanteda中预处理文本并保留文档变量(docvars)的方法

场景1:保留原文档结构(不拆分句子)

如果只是对每个文档整体做分词预处理,再转回文本语料,直接复用原语料的docvars即可,无需手动匹配:

library(quanteda)

# 创建带docvars的初始语料库
my_corpus <- corpus(
  c(
    doc1 = "This is sentence 1. This is sentence 2.",
    doc2 = "Another sentence here. And another one."
  ),
  docvars = data.frame(
    id = c(1, 2),
    topic = c("A", "B"),
    stringsAsFactors = FALSE
  )
)

# 分词预处理:去标点、转小写
my_tokens <- tokens(my_corpus, remove_punct = TRUE) %>%
  tokens_tolower()

# 转回语料并保留docvars
processed_corpus <- corpus(
  tokens_text(my_tokens),  # 将tokens转回处理后的文本
  docvars = docvars(my_corpus)  # 直接传入原语料的docvars
)

# 验证docvars是否保留
docvars(processed_corpus)

场景2:拆分句子并保留原文档的docvars

如果需要按句子拆分语料,同时让每个句子继承原文档的docvars,用corpus_reshape是最稳妥的方式——它会自动将原文档的docvars复制到对应的每个句子上,避免手动匹配出错:

library(quanteda)

# 1. 创建带docvars的初始语料库
my_corpus <- corpus(
  c(
    doc1 = "This is sentence 1. This is sentence 2.",
    doc2 = "Another sentence here. And another one."
  ),
  docvars = data.frame(
    id = c(1, 2),
    topic = c("A", "B"),
    stringsAsFactors = FALSE
  )
)

# 2. 将语料拆分为句子级,自动继承原文档的docvars
sent_corpus <- corpus_reshape(my_corpus, to = "sentences")

# 3. 对句子级语料做分词预处理
sent_tokens <- tokens(sent_corpus, remove_punct = TRUE) %>%
  tokens_tolower()

# 4. 转回处理后的句子语料,保留docvars
processed_sent_corpus <- corpus(
  tokens_text(sent_tokens),
  docvars = docvars(sent_corpus)  # 复用句子级语料的docvars,完全匹配
)

# 验证每个句子的docvars
docvars(processed_sent_corpus)

为什么之前用vapply会丢失docvars?

用vapply手动拼接tokens时,只是生成了纯文本向量,没有关联任何文档变量信息。如果要手动处理句子级tokens,需要自己将原文档的docvars按句子数量重复对应次数,但这种方法容易出错(比如句子数统计错误),而corpus_reshape已经内置了这种映射逻辑,能确保每个句子的docvars和原文档完全对应。

内容的提问来源于stack exchange,提问作者Dr. Fabian Habersack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:05:26