当前位置: 首页 > article >正文

PDF文本提取与NER训练全流程

1. PDF文本提取与预处理首先需要从PDF文档中提取文本内容并进行清洗和结构化处理为NER训练准备数据。1.1 PDF文本提取方法对比提取工具适用场景优点缺点pdfminer.six复杂版式PDF支持中文、表格提取速度较慢PyPDF2简单文本提取轻量快速对复杂格式支持差MinerU高质量结构化提取保留表格、公式上下文需要额外安装代码示例使用pdfminer.six提取PDF文本# PDF文本提取基础方法 from pdfminer.high_level import extract_text def extract_pdf_text(pdf_path): 提取PDF中的文本内容 text extract_text(pdf_path) # 基础清洗去除多余空格、换行 cleaned_text .join(text.split()) return cleaned_text # 使用示例 pdf_text extract_pdf_text(document.pdf) print(f提取文本长度{len(pdf_text)}字符)1.2 文本预处理流程分句处理将长文本分割为句子分词处理中文需要分词英文可直接按空格分割去除噪声删除页眉、页脚、页码等无关内容保留上下文对于技术文档需保留公式、表格的上下文信息2. 训练数据准备与标注2.1 实体类别定义根据业务需求定义实体类型常见的技术文档实体包括TECH技术术语如spaCy、BERTPROBLEM问题描述如内存泄漏、兼容性问题SOLUTION解决方案如重启服务、更新驱动VERSION版本号如v2.3.1、Python 3.92.2 自动标注建议生成# 基于词典的自动标注建议 import json from collections import Counter def generate_suggestions(text, tech_terms, n100): 生成高频术语建议 words text.split() term_freq Counter() for term in tech_terms: if term in text: # 计算出现频率 count text.count(term) term_freq[term] count # 取前N个高频术语 top_terms dict(term_freq.most_common(n)) # 生成标注建议格式 suggestions [] for term, freq in top_terms.items(): suggestions.append({ text: term, label: TECH, freq: freq, source: DICTIONARY }) return suggestions # 使用技术词典 tech_terms [spaCy, NER, PDF, 训练, 模型] suggestions generate_suggestions(pdf_text, tech_terms, n50)2.3 标注工具集成Label Studio标注流程导出CSV格式的标注建议转换为Label Studio JSONL格式人工审核和修正标注导出标注结果用于训练# 转换为Label Studio格式 def convert_to_labelstudio(suggestions, output_file): 将标注建议转为Label Studio格式 tasks [] for idx, suggestion in enumerate(suggestions): task { id: idx, data: { text: suggestion[text] }, annotations: [{ result: [{ value: { text: suggestion[text], labels: [suggestion[label]] }, from_name: label, to_name: text, type: labels }] }] } tasks.append(task) # 保存为JSONL格式 with open(output_file, w, encodingutf-8) as f: for task in tasks: f.write(json.dumps(task, ensure_asciiFalse) )3. spaCy NER模型训练3.1 环境配置与模型选择# 安装spaCy及中文模型 # 安装命令 !pip install spacy !python -m spacy download zh_core_web_sm # 中文模型 !pip install pdfminer.six PyPDF2 # PDF处理库 # 加载预训练模型 import spacy nlp spacy.load(zh_core_web_sm) # 中文模型 # 或使用英文模型nlp spacy.load(en_core_web_sm)3.2 训练数据格式转换# 将标注数据转为spaCy训练格式 def convert_to_spacy_format(annotations): 转换标注数据为spaCy Example格式 training_data [] for ann in annotations: text ann[text] entities [] for entity in ann.get(entities, []): # 实体格式: (start_char, end_char, label) entities.append((entity[start], entity[end], entity[label])) training_data.append((text, {entities: entities})) return training_data # 创建spaCy训练示例 from spacy.training import Example def create_spacy_examples(training_data, nlp): 创建spaCy训练示例 examples [] for text, annotations in training_data: doc nlp.make_doc(text) example Example.from_dict(doc, annotations) examples.append(example) return examples3.3 模型训练配置# spaCy NER训练配置 import spacy from spacy.training import Example import random def train_spacy_ner(train_data, model_namezh_core_web_sm, output_dircustom_ner_model, n_iter100): 训练自定义NER模型 # 加载基础模型 if model_name: nlp spacy.load(model_name) else: # 从头开始训练 nlp spacy.blank(zh) # 中文空白模型 # 添加NER管道如果不存在 if ner not in nlp.pipe_names: ner nlp.add_pipe(ner, lastTrue) else: ner nlp.get_pipe(ner) # 添加新标签 for _, annotations in train_data: for ent in annotations.get(entities, []): ner.add_label(ent[2]) # 准备训练数据 examples [] for text, annotations in train_data: doc nlp.make_doc(text) example Example.from_dict(doc, annotations) examples.append(example) # 禁用其他管道以专注NER训练 other_pipes [pipe for pipe in nlp.pipe_names if pipe ! ner] with nlp.disable_pipes(*other_pipes): # 训练配置 optimizer nlp.begin_training() # 训练循环 for iteration in range(n_iter): random.shuffle(examples) losses {} # 批量训练 for batch in spacy.util.minibatch(examples, size8): nlp.update(batch, drop0.5, losseslosses) print(f迭代 {iteration 1}/{n_iter}, 损失: {losses[ner]:.4f}) # 保存模型 nlp.to_disk(output_dir) print(f模型已保存至: {output_dir}) return nlp4. 完整训练流程示例4.1 端到端训练脚本# 完整PDF NER训练流程 import os import json from pathlib import Path class PDFNERTrainer: def __init__(self, pdf_directory, output_dirner_model): self.pdf_dir pdf_directory self.output_dir output_dir self.training_data [] def extract_text_from_pdfs(self): 批量提取PDF文本 all_texts [] pdf_files list(Path(self.pdf_dir).glob(*.pdf)) for pdf_file in pdf_files: text extract_pdf_text(str(pdf_file)) all_texts.append({ file: pdf_file.name, text: text, length: len(text) }) return all_texts def generate_annotations(self, texts, tech_terms_filetech_terms.json): 生成自动标注 # 加载技术术语词典 with open(tech_terms_file, r, encodingutf-8) as f: tech_terms json.load(f) annotations [] for item in texts: text item[text] # 自动识别技术术语 entities [] for term in tech_terms: start text.find(term) while start ! -1: end start len(term) entities.append({ text: term, start: start, end: end, label: TECH }) start text.find(term, end) annotations.append({ text: text, entities: entities }) return annotations def train_model(self, annotations, n_iter50): 训练NER模型 # 转换为spaCy格式 train_data [] for ann in annotations: entities [(e[start], e[end], e[label]) for e in ann[entities]] train_data.append((ann[text], {entities: entities})) # 训练模型 model train_spacy_ner( train_datatrain_data, model_namezh_core_web_sm, output_dirself.output_dir, n_itern_iter ) return model def evaluate_model(self, model, test_texts): 评估模型性能 results [] for text in test_texts: doc model(text) entities [] for ent in doc.ents: entities.append({ text: ent.text, label: ent.label_, start: ent.start_char, end: ent.end_char }) results.append({ text: text[:100] ..., # 截取前100字符 entities_found: len(entities), entities: entities }) return results # 使用示例 if __name__ __main__: # 初始化训练器 trainer PDFNERTrainer(pdf_directory./pdf_docs, output_dirpdf_ner_model) # 1. 提取文本 print(步骤1: 提取PDF文本...) texts trainer.extract_text_from_pdfs() # 2. 生成标注 print(步骤2: 生成自动标注...) annotations trainer.generate_annotations(texts) # 3. 训练模型使用80%数据 print(步骤3: 训练NER模型...) train_size int(len(annotations) * 0.8) train_annotations annotations[:train_size] model trainer.train_model(train_annotations, n_iter30) # 4. 评估模型使用20%数据 print(步骤4: 评估模型性能...) test_texts [ann[text] for ann in annotations[train_size:]] results trainer.evaluate_model(model, test_texts[:5]) # 测试前5个 # 打印结果 for result in results: print(f 文本: {result[text]}) print(f识别到 {result[entities_found]} 个实体) for ent in result[entities]: print(f - {ent[text]} [{ent[label]}])4.2 模型优化与微调策略优化策略实施方法预期效果增量训练在预训练模型基础上微调提升领域适应性数据增强同义词替换、实体替换增加训练数据多样性集成学习多个模型投票机制提高识别稳定性后处理规则基于词典的实体校正减少误识别5. 实际应用与部署5.1 批量处理PDF文档# 批量处理PDF的NER提取 def batch_process_pdfs(pdf_folder, model_path, output_folder): 批量处理文件夹中的PDF文件 nlp spacy.load(model_path) for pdf_file in Path(pdf_folder).glob(*.pdf): # 提取文本 text extract_pdf_text(str(pdf_file)) # NER识别 doc nlp(text) # 提取特定类型实体如问题描述 problems [] for ent in doc.ents: if ent.label_ PROBLEM: # 获取上下文前后50字符 start max(0, ent.start_char - 50) end min(len(text), ent.end_char 50) context text[start:end] problems.append({ entity: ent.text, context: context, page: 未知 # 可结合PDF解析获取页码 }) # 保存结果 output_file Path(output_folder) / f{pdf_file.stem}_entities.json with open(output_file, w, encodingutf-8) as f: json.dump({ file: pdf_file.name, total_entities: len(doc.ents), problems: problems, all_entities: [ {text: ent.text, label: ent.label_} for ent in doc.ents ] }, f, ensure_asciiFalse, indent2) print(f已处理: {pdf_file.name}, 识别到 {len(problems)} 个问题实体)5.2 性能评估指标在训练过程中需要监控以下指标精确率Precision正确识别的实体占所有识别实体的比例召回率Recall正确识别的实体占所有真实实体的比例F1分数精确率和召回率的调和平均数训练损失监控过拟合情况5.3 实际应用场景示例技术文档质量分析# 从技术文档中提取问题描述 def extract_problems_from_tech_docs(pdf_path, model_path): 提取技术文档中的问题描述 nlp spacy.load(model_path) text extract_pdf_text(pdf_path) # 使用自定义关键词增强识别 problem_keywords [问题, 缺陷, 错误, 故障, bug, issue] doc nlp(text) problems [] for sent in doc.sents: # 检查句子是否包含问题关键词 if any(keyword in sent.text for keyword in problem_keywords): # 识别句子中的实体 sent_problems [] for ent in sent.ents: if ent.label_ in [PROBLEM, ERROR, BUG]: sent_problems.append(ent.text) if sent_problems: problems.append({ sentence: sent.text, problems: sent_problems, context: sent.text[:200] # 截取前200字符作为上下文 }) return problems # 使用示例 problems extract_problems_from_tech_docs(technical_doc.pdf, pdf_ner_model) for i, problem in enumerate(problems[:5], 1): print(f问题 {i}:) print(f 句子: {problem[sentence]}) print(f 问题实体: {, .join(problem[problems])}) print()6. 最佳实践建议数据质量优先确保标注数据的准确性和一致性领域词典构建针对特定领域构建专业术语词典迭代训练采用训练-评估-标注-再训练的迭代流程模型版本管理保存不同版本的模型便于回滚和比较监控与评估定期在新数据上评估模型性能通过上述完整流程可以构建一个针对PDF文档的定制化NER系统特别适用于技术文档、研究报告、合同文书等特定领域的实体识别需求。关键是要根据实际应用场景调整实体类型定义、训练数据准备和模型优化策略。参考来源spaCy PDF NER — 训练与标注流程指南命名实体识别NER实战从原理到应用的全方位解析MinerU命名实体识别提取后NER标注实战NER命名实体识别的介绍与使用--附源码DeepSeek-OCR-2基础教程OCR后文本如何做NER实体识别Spacy集成示例【项目实训】简历OCR信息抽取改进——命名实体识别

相关文章:

PDF文本提取与NER训练全流程

1. PDF文本提取与预处理 首先,需要从PDF文档中提取文本内容,并进行清洗和结构化处理,为NER训练准备数据。 1.1 PDF文本提取方法对比 提取工具适用场景优点缺点pdfminer.six复杂版式PDF支持中文、表格提取速度较慢PyPDF2简单文本提取轻量快…...

DeepBSA实战指南:从安装到基因组分析的全流程解析

1. DeepBSA简介与核心功能 DeepBSA是一款专门为批量分离分析(BSA)设计的基因组分析工具,它最大的特点就是把复杂的生物信息学分析流程简化成了"一键式"操作。我第一次接触这个软件是在分析水稻抗病性状的实验中,当时就被…...

Visual C++运行库终极指南:一站式解决所有DLL缺失问题

Visual C运行库终极指南:一站式解决所有DLL缺失问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为Windows应用程序频繁报错"DLL文件缺失…...

GPU 状态全解析:从查看命令到显存泄漏排查与修复

GPU 状态全解析:从查看命令到显存泄漏排查与修复在运行强化学习训练时,你是否遇到过 CUDA out of memory 错误?明明 GPU 显存足够,却在一段时间后崩溃?本文将带你从基础命令开始,深入分析 GPU 状态&#xf…...

EduCoder Java异常处理实战:从基础到自定义异常

1. Java异常处理入门:从ID检测理解异常机制 第一次接触Java异常处理时,我完全被那些try-catch块搞晕了。直到在EduCoder上做了ID检测的练习,才真正明白异常是怎么回事。想象你是个门卫,检查员工工牌时发现有人拿着过期的证件——这…...

长沙心理医院推荐指南+真实案例分享

行业痛点分析长沙作为中部地区核心城市,心理卫生需求持续增长,但行业仍面临多重结构性挑战。据《湖南省精神卫生蓝皮书》显示,长沙常住人口中约12.6%存在不同程度的心理困扰,其中抑郁和焦虑患病率分别为8.3%和6.7%。然而&#xff…...

保姆级教程:用Windows Server 2016和IIS从零搭建ArcGIS Enterprise 10.8全栈环境(含自签名证书生成)

从零构建ArcGIS Enterprise 10.8全栈环境:Windows Server 2016实战手册 当企业需要搭建私有化的地理信息服务平台时,ArcGIS Enterprise无疑是最专业的选择之一。但对于刚接触这套系统的IT人员来说,从裸机开始部署整套环境可能会遇到各种"…...

AWS ALB 多域名合并为路径路由实战 — 从独立域名到统一入口

多个前端子应用各用一个域名,维护成本高且证书管理麻烦。本文记录将多个独立域名合并为同一域名 + 路径路由的完整过程,包括规则修改、优先级调整和安全操作方法。 前言 随着前端微应用越来越多,每个子应用一个域名的方式带来了问题: 域名多,DNS 和证书管理成本高 跨域问…...

BilibiliDown终极指南:轻松下载B站视频的完整解决方案

BilibiliDown终极指南:轻松下载B站视频的完整解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…...

STATA实证分析:手把手教你搞定工具变量回归(IV估计)的完整流程与命令

STATA实证分析:工具变量回归(IV估计)的保姆级实战指南 经济学研究中,内生性问题就像房间里的大象——人人都知道它存在,却常常选择视而不见。记得我第一篇投稿被拒时,审稿人那句"请考虑内生性问题的潜…...

不止于投屏:拆解Scrcpy-Server.jar,看一个APK如何实现安卓屏幕流与反向控制

深入解析Scrcpy-Server.jar:安卓屏幕流与反向控制的技术内幕 在移动开发领域,屏幕镜像与控制技术一直是提升工作效率的关键。Scrcpy作为一款开源工具,以其低延迟、高性能的特性脱颖而出。但真正让它与众不同的是其独特的技术实现——一个看似…...

3分钟掌握B站视频数据采集:用Python实现批量数据分析自动化

3分钟掌握B站视频数据采集:用Python实现批量数据分析自动化 【免费下载链接】Bilivideoinfo Bilibili视频数据爬虫 精确爬取完整的b站视频数据,包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时间、…...

SNN vs CNN vs SVM:在MNIST数据集上,谁更省电、谁更快?一次实战性能横评

SNN vs CNN vs SVM:MNIST实战中的能效与速度终极对决 当你在设计一个需要部署在边缘设备上的图像分类系统时,准确率只是冰山一角。真正决定成败的,往往是那些藏在技术规格表里的数字——毫瓦时的能耗、毫秒级的延迟,以及训练所需的…...

Windows驱动管理终极指南:Driver Store Explorer完全教程

Windows驱动管理终极指南:Driver Store Explorer完全教程 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统驱动管理是每个用户都需要掌握的重要技能,而…...

微电网系列之PQ控制在并网与孤岛模式下的应用差异

1. PQ控制在微电网中的核心作用 微电网作为分布式能源系统的重要组成部分,其稳定运行离不开精准的功率控制。PQ控制(恒功率控制)作为变流器的基本控制策略之一,在微电网的不同运行模式下展现出截然不同的特性。简单来说&#xff0…...

如何用高中物理知识理解质能方程E=mc²?一个通俗易懂的推导过程

如何用高中物理知识理解质能方程Emc?一个通俗易懂的推导过程 想象一下,你手中握着一块普通的巧克力。如果告诉你,这块巧克力蕴含的能量足以煮沸上千壶水,你会相信吗?这听起来像是科幻小说里的情节,但正是爱…...

Vivado卸载程序不见了?别慌,用这个隐藏参数5分钟搞定(附SDK/HLS清理)

Vivado卸载程序消失的终极解决方案:隐藏参数与深度清理指南 当你在Windows开始菜单里翻遍了所有角落,却找不到Vivado的卸载入口时,那种感觉就像被困在数字迷宫里——明明知道出口就在某处,却怎么也找不到正确的路径。这种情况在FP…...

西安 GEO 优化收费标准解析与实施方案

本文围绕西安 GEO 优化收费标准展开,重点解析了优化策略如何提升企业在本地市场的曝光率以及客户转化。文章介绍了在实施过程中需考虑的本地市场环境因素,包括行业竞争状况和消费者需求变化。这些内容为后续具体方案提供了基础支撑。接下来的部分将通过实…...

Arthas+jmap组合拳:高效排查Java内存泄漏的5个实用技巧

Arthas与jmap双剑合璧:5个高阶Java内存泄漏排查实战技巧 当生产环境的Java应用突然出现内存泄漏时,那种感觉就像在漆黑的迷宫里寻找出口。作为经历过无数次深夜紧急故障排查的老兵,我深知仅靠单一工具往往难以快速定位问题根源。本文将分享如…...

数据分析小白必看:从Excel到Python的3个实战案例(附数据集)

数据分析小白必看:从Excel到Python的3个实战案例(附数据集) 数据分析正逐渐成为职场人士的必备技能。无论是市场调研、销售预测还是用户行为分析,数据驱动的决策方式正在重塑各行各业的工作模式。但对于初学者来说,最大…...

别再断电就丢程序了!手把手教你用Vivado把FPGA程序固化到SPI Flash(附MCS文件生成教程)

FPGA程序固化实战:从JTAG调试到SPI Flash永久存储的完整指南 每次断电都要重新烧录程序?这可能是FPGA新手工程师最头疼的问题之一。想象一下,你花了一整天调试的FPGA设计,在实验室里运行得完美无缺,结果设备一断电&…...

从菜单管理程序入手:一文吃透Python中不可变的元组和灵活的字典

从菜单管理程序入手:一文吃透Python中不可变的元组和灵活的字典 走进任何一家餐厅的后厨,你都会发现两种截然不同的菜单管理方式:墙上用粉笔写着的今日特惠套餐(每周更换一次),和厨师长手中随时涂改的单点菜…...

问卷数据总被导师打回?用验证性因子分析(CFA)搞定量表效度的保姆级自查清单

问卷数据总被导师打回?用验证性因子分析(CFA)搞定量表效度的保姆级自查清单 每次提交问卷数据都被导师用红笔圈出"效度不足"四个大字?明明按照教科书操作却总在CFA环节翻车?这份清单将带你用验证性因子分析给…...

STEP7新手避坑指南:手把手教你搞定S7-300硬件组态与IO地址分配(CPU315-2DP实战)

STEP7新手避坑指南:手把手教你搞定S7-300硬件组态与IO地址分配(CPU315-2DP实战) 第一次打开STEP7软件时,面对密密麻麻的模块列表和复杂的地址分配规则,大多数新手都会感到无从下手。记得我刚开始接触S7-300时&#xff…...

国标GB28181视频平台EasyCVR中RTSP地址无法获取的原因分析与解决方法

下午三点多,群里弹出一条消息:说RTSP接口获取不到RTSP地址了!我看了看消息,脑子里立刻蹦出一个答案。因为我知道,EasyCVR最新版本做了一个调整:RTSP功能默认是关闭的,需要用户手动到配置页面去开…...

1.8万美金干掉顶级专家!Anthropic开启AI自主进化:Claude竟能自我「开颅」

1997年深蓝下棋,2016年AlphaGo围棋,2026年9个Claude副本做真实科研……每次我们都说「只是特定领域」。这一次,我们真的还能说什么?欢迎来到AI成为科研同事、竞争者、甚至继任者的时代。最新突破,AI再次碾压人类&#…...

告别Putty!用MobaXterm玩转Linux服务器Python开发(含虚拟环境避坑指南)

告别Putty!用MobaXterm玩转Linux服务器Python开发(含虚拟环境避坑指南) 如果你还在用Putty连接Linux服务器做Python开发,是时候试试MobaXterm了。这款全能终端工具不仅能完美替代Putty的基础功能,还内置了SFTP文件传输…...

CentOS7物理机安装后网卡缺失问题排查与驱动安装指南

1. 问题现象与初步排查 刚装完CentOS7系统,兴冲冲地插上网线准备配置服务器,结果发现ifconfig命令只显示一个孤零零的lo回环接口,完全看不到eth0或ens33这类物理网卡的身影。这种场景就像买了辆新车却发现方向盘不见了——网络配置无从下手。…...

【限时解密】SITS2026未公开Demo视频中的AI攻略生成器:融合LBS+实时政策+情绪感知的第三代架构

第一章:SITS2026分享:AI旅游攻略生成 2026奇点智能技术大会(https://ml-summit.org) 核心架构设计 该系统基于多模态大模型协同框架,融合地理知识图谱、实时POI数据流与用户偏好建模模块。主干模型采用微调后的Llama-3-70B-Instruct作为规划…...

技术赋能:多网盘直链解析工具的架构革新与效率革命

技术赋能:多网盘直链解析工具的架构革新与效率革命 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...