R语言中如何从PDF提取专有名词并导出CSV?现有方法遇阻
从PDF文献中提取特殊地名并导出CSV的解决方案
问题梳理
要从300篇PDF文献里提取特殊地名,用tm包的TermDocumentMatrix处理时遇到三个核心问题:
- 开启词干化(
stemming=TRUE)会破坏地名结构,导致无法识别 - 关闭词干化后,词矩阵因低频词过多过于冗长
- 直接用
write.csv导出TDM失败,提示无法转换simple_triplet_matrix类型
解决方案步骤
1. 调整文本预处理规则,保护地名
- 必须关闭
stemming:地名是专有名词,词干化会拆解其完整结构,完全破坏识别基础 - 保持
tolower=FALSE:利用地名首字母大写的特征,后续可快速筛选候选 - 保留
stopwords=TRUE和removeNumbers=TRUE过滤无关内容 - 合理设置
bounds:根据需求调整频次阈值,比如c(2, Inf)保留至少出现2次的词,避免矩阵过于冗余
2. 正确导出TDM到CSV
TermDocumentMatrix属于simple_triplet_matrix类型,不能直接用write.csv,需先转换为常规数据框:
- 用
as.matrix()把TDM转成矩阵,再转成data.frame - 补充词名列,方便后续筛选和查看
3. 基于文本特征筛选特殊地名
因为目标地名不适用数据库查找,可利用首字母大写这个核心特征从词表中过滤:
- 从TDM的词表中筛选出首字母为大写的词
- 再结合频次进一步过滤,保留符合研究需求的地名
修改后的完整代码
library(tm) library(pdftools) # 读取PDF文件 files <- list.files(pattern = "pdf$") corp <- Corpus(URISource(files), readerControl = list(reader = readPDF)) # 构建TDM,调整预处理规则保护地名 opinions.tdm <- TermDocumentMatrix(corp, control = list( stopwords = TRUE, tolower = FALSE, # 保留首字母大写,方便筛选地名 stemming = FALSE, # 关闭词干化,避免破坏地名结构 removeNumbers = TRUE, bounds = list(global = c(2, Inf)) # 可按需调整频次阈值 )) # 将TDM转换为可导出的数据框 tdm_df <- as.data.frame(as.matrix(opinions.tdm)) # 添加词名列,方便后续筛选 tdm_df$term <- rownames(tdm_df) # 调整列顺序,把词名列放在最前面 tdm_df <- tdm_df[, c("term", setdiff(colnames(tdm_df), "term"))] # 筛选首字母大写的词(疑似地名候选) candidate_places <- tdm_df[grepl("^[A-Z]", tdm_df$term), ] # 导出完整TDM和筛选后的候选地名到CSV write.csv(tdm_df, file = "full_tdm.csv", row.names = FALSE) write.csv(candidate_places, file = "candidate_places.csv", row.names = FALSE)
代码说明
- 关闭
stemming彻底避免地名被拆解,保证专有名词完整性 - 保留
tolower=FALSE后,用grepl("^[A-Z]", term)快速筛选首字母大写的词,缩小地名候选范围 - 通过
as.matrix()转换TDM后,再转成data.frame,就能正常用write.csv导出 - 可根据研究需求调整
bounds里的频次阈值,比如把c(2, Inf)改成c(3, Inf)保留出现3次及以上的词
内容的提问来源于stack exchange,提问作者Zyrox
相关产品推荐
相关产品推荐

