DocumentTermMatrix长文本漏检单词,单独取对应页面可检测的问题排查
排查DocumentTermMatrix漏检关键词的思路
我用DocumentTermMatrix在32页的长文档里匹配关键词列表,大部分词都能识别,但有少数单词缺失——比如第7页的“insolvency”,处理完整文档时找不到,单独提取第7页文本(text <- text[7])却能成功检测到。没法复现最小示例,求排查方向。
以下是我的脚本示例:
library(fastpipe) library(openxlsx) library(tm) `%>>%` <- fastpipe::`%>>%` source("cleanText.R") # 自定义文本清洗函数 keywords_xlsx <- read.xlsx(paste0(getwd(),"/Keywords.xlsx"), sheet = "all", startRow = 1, colNames = FALSE, skipEmptyRows = TRUE, skipEmptyCols = TRUE) keywords <- keywords_xlsx[1] %>>% tolower(as.character(.[,1])) # 自定义PDF读取函数 read <- readPDF(control = list(text = "-layout")) # 提取PDF文本 report <- "my_report.pdf" document <- Corpus(URISource(paste0("./Annual reports/", report)), readerControl = list(reader = read)) text <- content(document[[1]]) text <- cleanText(report, text) # 清洗文本 # text <- text[7] # 单独提取第7页就能找到目标词!完整文档则不行 # 创建语料库 text_corpus <- Corpus(VectorSource(text)) # 生成文档-词矩阵 matrix <- t(as.matrix(inspect(DocumentTermMatrix(text_corpus, list(dictionary = keywords, list(wordLengths=c(1, Inf)) ) )))) words <- sort(rowSums(matrix),decreasing=TRUE) df <- data.frame(word = names(words),freq=words)
排查思路
- 检查
cleanText()的处理差异:对比完整文档和单页模式下,第7页文本清洗前后的内容,看是否长文本处理时,换行、分页符或特殊字符导致“insolvency”被拆分、替换或删除,比如函数在处理长列表时触发了不同分支逻辑。 - 验证分词与语料库构建:手动提取完整文档中清洗后的第7页文本,单独生成语料库并匹配关键词,确认是语料库整体构建的问题,还是单页内容本身的问题。
- 核对关键词格式:打印
keywords变量,确认“insolvency”是全小写且无多余空格/特殊字符,确保和文本中的词格式完全匹配。 - 检查PDF读取的内容差异:对比完整文档模式下
text[7]和单独提取第7页时的原始文本(清洗前),看是否存在编码异常、字符拆分(比如跨换行的单词被拆成两部分)等问题。 - 简化矩阵生成步骤:去掉
inspect()直接生成矩阵(as.matrix(DocumentTermMatrix(...))),因为inspect()会截断长输出,可能导致转置和求和时丢失数据。 - 确认文本结构完整性:打印
length(text)和text[7]的内容,确保完整文档模式下文本是按页拆分的列表,第7页内容没有被意外合并或修改。
内容的提问来源于stack exchange,提问作者gitcanzo
相关产品推荐
相关产品推荐

