在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
相关产品推荐
相关产品推荐

