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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:38:34