Spacy PDF提取函数问题:指定页码仍提取全部页面且速度慢
PDF解析函数问题排查:指定页码无效+运行缓慢
问题分析
从你贴的代码来看,核心存在两个功能问题,还有一处代码冗余:
1. 指定页码page_numbers=[0,1]不生效
调用pdf_reader时传递了页码参数但仍提取全页,大概率是**pdf_reader或PdfminerParser未正确处理该参数**:
- 要确认
PdfminerParser内部是否真的根据page_numbers过滤页码,部分PDF解析库的页码索引从1开始,传0、1可能被判定为无效值,触发默认全页解析逻辑 - 检查
pdf_reader函数是否把page_numbers正确传递给了PdfminerParser,有没有中途丢失参数的情况
2. 函数运行速度慢
最直接的原因是重复添加实体匹配模式:
- 每次调用
spacy_extractor都会执行ruler.add_patterns(patterns),导致ruler中的模式持续累积,后续调用时nlp需要匹配的模式越来越多,处理速度自然越来越慢 - 如果
pdf_reader实际在解析全页,处理的文本量远大于前两页,也会大幅拖慢整体速度
3. 冗余参数问题
函数参数里的filtered_list完全无效,你传入的字符串'legal_forms_filtered'在函数内部被直接重新赋值,属于多余参数,建议删除。
解决步骤
修复模式重复添加问题
把模式添加逻辑移到函数外部,仅初始化一次:
# 初始化ruler,仅执行一次 patterns = [{'label': 'LEG', 'pattern': item} for item in legal_form_list] ruler.add_patterns(patterns) def spacy_extractor(label, pdf_path, pdf_name, page_numbers): doc = pdf_reader(os.path.join(pdf_path, pdf_name), nlp, PdfminerParser, page_numbers) filtered_list = [ent.text for ent in doc.ents if ent.label_ == label] return filtered_list[0] if filtered_list else None # 调用函数 cover_page_legal_form = spacy_extractor(label='LEG', pdf_path=fs_path_pdf, pdf_name=fs_name_pdf, page_numbers=[0,1])
如果需要动态切换不同模式列表,就在函数内先清空ruler再添加:
def spacy_extractor(label, list_name, pdf_path, pdf_name, page_numbers): ruler.clear() # 清空之前的模式 patterns = [{'label': label, 'pattern': pattern_name} for pattern_name in list_name] ruler.add_patterns(patterns) doc = pdf_reader(os.path.join(pdf_path, pdf_name), nlp, PdfminerParser, page_numbers) filtered_list = [ent.text for ent in doc.ents if ent.label_ == label] return filtered_list[0] if filtered_list else None
排查页码无效问题
- 查看
pdf_reader的实现代码,确认它是否接收page_numbers参数并传递给PdfminerParser - 检查
PdfminerParser的页码处理逻辑:如果它要求页码从1开始,就传入page_numbers=[1,2]尝试 - 在
pdf_reader中添加打印语句,输出实际处理的页码,验证是否只处理了指定页面
额外速度优化
- 禁用nlp管道中不需要的组件,仅保留实体识别相关模块,减少处理开销:
nlp = spacy.load("en_core_web_sm", disable=["parser", "tagger"]) - 确认
PdfminerParser是否仅提取必要文本,避免提取页眉、页脚等无关内容,减少处理的文本量
内容的提问来源于stack exchange,提问作者user14566555
相关产品推荐
相关产品推荐

