使用R与Readr扩展.RDS文本语料库时遇as.corpus()错误求助
解决语料库合并报错及PDF文本读取问题
错误根源
Error: as.corpus() only works on corpus objects. 是因为两个语料库的类型不兼容:你同时使用了tm和quanteda包,从.RDS读取的prev_corpus大概率是quanteda的corpus对象,而新创建的corpus是tm的Corpus对象,二者无法通过c()直接合并。
另外,用readr::read_file()读取PDF是错误操作——read_file仅适用于纯文本文件,PDF是二进制格式,这样读取会得到乱码。
修复步骤
1. 正确提取PDF文本(规避pdftools字体报错)
放弃用read_file读PDF,改用pdftools并添加参数跳过字体验证:
library(pdftools) library(tidyverse) pdf_text <- lapply(pdf_paths, function(path) { # 读取PDF所有页面,合并为单段文本 pdf_text(path, opw = "", upw = "") %>% str_c(collapse = "\n") })
若仍报错,可调用系统pdftotext命令(需提前安装该工具):
pdf_text <- lapply(pdf_paths, function(path) { temp_txt <- tempfile(fileext = ".txt") system(str_glue("pdftotext {shQuote(path)} {shQuote(temp_txt)}")) read_file(temp_txt) })
2. 统一语料库类型并合并
先通过class(prev_corpus)确认原语料库的类型,再选择对应方案:
方案A:原语料库是tm的Corpus对象
library(tm) # 创建tm格式语料库 new_tm_corpus <- Corpus(VectorSource(pdf_text)) # 给新文档命名(可选,用PDF文件名) names(new_tm_corpus) <- basename(pdf_paths) # 合并语料库 combined_corpus <- c(prev_corpus, new_tm_corpus) # 保存为RDS saveRDS(combined_corpus, "combined_tm_corpus.RDS")
方案B:原语料库是quanteda的corpus对象
library(quanteda) # 创建quanteda格式语料库 new_quanteda_corpus <- corpus(pdf_text, docnames = basename(pdf_paths)) # 合并语料库 combined_corpus <- corpus_merge(prev_corpus, new_quanteda_corpus) # 保存为RDS saveRDS(combined_corpus, "combined_quanteda_corpus.RDS")
关键提醒
- 禁止混用
tm和quanteda的语料库对象,二者结构完全不同 - 读取PDF必须用专门的文本提取工具,不能直接读二进制文件
- 合并后可通过
summary(combined_corpus)验证文档总数是否符合预期
内容的提问来源于stack exchange,提问作者Roald Andre Kvarv
相关产品推荐
相关产品推荐

