SiameseUIE中文信息抽取实战从原始PDF→OCR文本→结构化JSON全流程1. 引言为什么需要中文信息抽取在日常工作中我们经常遇到这样的场景收到一份PDF合同需要提取关键信息或者需要从大量文档中快速找到特定数据。传统的手工处理方式效率低下而且容易出错。今天我要分享的SiameseUIE模型正是解决这类问题的利器。这个由阿里巴巴达摩院开发的模型能够直接从中文文本中抽取结构化信息无需预先训练只需要定义好要抽取的内容格式即可。想象一下这样的工作流程从PDF文件提取文字内容使用OCR处理扫描件或图片中的文字通过SiameseUIE抽取关键信息输出结构化的JSON数据整个过程自动化完成大大提升工作效率。接下来我将带你完整走一遍这个流程。2. 环境准备与工具安装2.1 基础环境要求在开始之前确保你的环境满足以下要求Python 3.8或更高版本至少8GB内存处理大文件时建议16GB以上GPU加速可选但能显著提升处理速度2.2 安装必要依赖包# 安装PDF处理工具 pip install pypdf2 pdfplumber # 安装OCR相关工具 pip install paddleocr easyocr # 安装信息抽取核心库 pip install transformers torch # 安装其他工具库 pip install requests pillow2.3 下载SiameseUIE模型虽然CSDN镜像已经预置了模型但了解如何本地部署也很重要from transformers import AutoModel, AutoTokenizer model_name iic/nlp_structbert_siamese-uie_chinese-base tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModel.from_pretrained(model_name)3. PDF文本提取实战3.1 处理可搜索PDF对于文本型PDF我们可以直接提取文字import pdfplumber def extract_text_from_pdf(pdf_path): 从PDF中提取文本内容 full_text with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: text page.extract_text() if text: full_text text \n return full_text # 使用示例 pdf_text extract_text_from_pdf(合同.pdf) print(f提取到{len(pdf_text)}个字符)3.2 处理扫描件PDFOCR识别对于扫描件或图片型PDF需要使用OCR技术from paddleocr import PaddleOCR import pdf2image import os def ocr_from_pdf(pdf_path, output_dirtemp_images): 使用OCR识别扫描件PDF # 将PDF转换为图片 images pdf2image.convert_from_path(pdf_path) # 初始化OCR ocr PaddleOCR(use_angle_clsTrue, langch) results [] for i, image in enumerate(images): image_path f{output_dir}/page_{i1}.jpg image.save(image_path, JPEG) # 执行OCR result ocr.ocr(image_path, clsTrue) page_text \n.join([line[1][0] for line in result[0]]) results.append(page_text) return \n.join(results) # 使用示例 scanned_text ocr_from_pdf(扫描合同.pdf)4. SiameseUIE信息抽取核心操作4.1 基本信息抽取模式SiameseUIE最强大的地方在于它的零样本抽取能力无需训练即可使用def extract_info_with_schema(text, schema): 使用SiameseUIE抽取信息 text: 待处理的文本 schema: 抽取模式定义 # 这里是模拟代码实际使用时需要调用模型API # CSDN镜像提供了Web界面可以直接使用 print(f处理文本: {text[:100]}...) print(f使用schema: {schema}) # 实际使用时通过HTTP请求调用服务 import requests import json payload { text: text, schema: schema } # 发送到SiameseUIE服务 response requests.post( http://localhost:7860/api/extract, jsonpayload ) return response.json() # 示例抽取人物和地点信息 schema_entity {人物: null, 地点: null} text 马云在杭州创办了阿里巴巴集团。 result extract_info_with_schema(text, schema_entity) print(json.dumps(result, ensure_asciiFalse, indent2))4.2 复杂关系抽取除了实体识别还能抽取复杂的关系信息# 抽取属性-情感关系 schema_absa {属性词: {情感词: null}} review_text 手机拍照效果很好电池续航时间短屏幕显示清晰。 absa_result extract_info_with_schema(review_text, schema_absa) # 抽取事件关系 schema_event {事件: {时间: null, 地点: null, 人物: null}} event_text 昨天下午三点在北京会议中心召开了人工智能大会李彦宏发表了演讲。 event_result extract_info_with_schema(event_text, schema_event)5. 完整流程实战案例让我们通过一个真实案例来完整演示整个流程。5.1 案例背景处理商业新闻稿假设我们有一份PDF格式的商业新闻稿需要提取以下信息公司名称人物姓名金额数据时间信息合作事件5.2 分步实现代码import json import re from datetime import datetime def process_pdf_to_json(pdf_path, output_json_path): 完整的PDF到JSON处理流程 # 步骤1: 提取PDF文本 print(步骤1: 提取PDF文本内容...) try: raw_text extract_text_from_pdf(pdf_path) except: print(文本提取失败尝试OCR识别...) raw_text ocr_from_pdf(pdf_path) print(f成功提取{len(raw_text)}字符) # 步骤2: 定义抽取schema schema { 公司: null, 人物: null, 金额: null, 时间: null, 合作事件: null } # 步骤3: 信息抽取 print(步骤3: 使用SiameseUIE抽取信息...) extracted_data extract_info_with_schema(raw_text, schema) # 步骤4: 后处理和清理 print(步骤4: 数据后处理...) cleaned_data clean_extracted_data(extracted_data) # 步骤5: 保存结果 print(步骤5: 保存JSON结果...) with open(output_json_path, w, encodingutf-8) as f: json.dump(cleaned_data, f, ensure_asciiFalse, indent2) print(f处理完成结果已保存到: {output_json_path}) return cleaned_data def clean_extracted_data(data): 清理和规范化抽取结果 cleaned {} # 清理实体数据 if 抽取实体 in data: for entity_type, entities in data[抽取实体].items(): if entities: # 去重和排序 cleaned[entity_type] sorted(list(set(entities))) # 清理关系数据 if 抽取关系 in data: cleaned[关系] [] for relation in data[抽取关系]: # 过滤空值关系 if any(relation.values()): cleaned[关系].append(relation) # 添加处理元数据 cleaned[处理信息] { 处理时间: datetime.now().isoformat(), 数据源: PDF文档, 使用模型: SiameseUIE中文-base } return cleaned5.3 运行完整流程# 执行完整处理流程 result process_pdf_to_json( 商业新闻.pdf, 提取结果.json ) print(提取到的关键信息:) print(f- 公司: {result.get(公司, [])}) print(f- 人物: {result.get(人物, [])}) print(f- 金额: {result.get(金额, [])})6. 高级技巧与最佳实践6.1 处理长文档的策略对于很长的文档直接处理可能效果不佳可以分段处理def process_long_text(long_text, schema, chunk_size1000): 分段处理长文本 chunks [long_text[i:ichunk_size] for i in range(0, len(long_text), chunk_size)] all_results [] for chunk in chunks: result extract_info_with_schema(chunk, schema) all_results.append(result) # 合并结果 merged merge_results(all_results) return merged def merge_results(results): 合并多个抽取结果 merged {抽取实体: {}, 抽取关系: []} for result in results: # 合并实体 if 抽取实体 in result: for entity_type, entities in result[抽取实体].items(): if entity_type not in merged[抽取实体]: merged[抽取实体][entity_type] [] merged[抽取实体][entity_type].extend(entities) # 合并关系 if 抽取关系 in result: merged[抽取关系].extend(result[抽取关系]) # 去重 for entity_type in merged[抽取实体]: merged[抽取实体][entity_type] list(set(merged[抽取实体][entity_type])) return merged6.2 优化抽取效果的技巧def optimize_extraction(text, schema): 优化抽取效果的技巧 # 技巧1: 文本预处理 cleaned_text preprocess_text(text) # 技巧2: 调整schema粒度 # 更具体的实体类型通常效果更好 optimized_schema refine_schema(schema, cleaned_text) # 技巧3: 多次抽取合并 results [] for i in range(3): # 多次抽取提高召回率 result extract_info_with_schema(cleaned_text, optimized_schema) results.append(result) return merge_results(results) def preprocess_text(text): 文本预处理 # 移除多余的空格和换行 text re.sub(r\s, , text) # 处理特殊字符 text text.replace(, ).strip() return text def refine_schema(schema, text): 根据文本内容优化schema # 这里可以根据文本特征动态调整schema # 例如如果文本中有很多数字可以添加数字实体类型 refined schema.copy() # 示例检测文本中的货币金额 if re.search(r[¥$€£]\s*\d, text): refined[金额] null return refined7. 总结与下一步建议通过本文的实战教程你应该已经掌握了使用SiameseUIE进行中文信息抽取的完整流程。从PDF处理到结构化数据输出这个流程可以应用于各种实际场景。7.1 关键要点回顾环境搭建正确安装相关依赖库是成功的第一步文本提取区分可搜索PDF和扫描件采用不同的提取策略信息抽取合理定义schema是获得好结果的关键后处理清理和规范化抽取结果提升数据质量7.2 实际应用建议start small先从简单的文档类型开始尝试迭代优化根据实际效果不断调整schema定义质量检查重要数据建议人工复核确认批量处理对于大量文档可以编写批处理脚本7.3 进一步学习方向如果想要更深入地学习信息抽取技术建议学习更复杂的schema设计模式了解模型微调技术针对特定领域优化效果探索与其他NLP技术的结合使用学习如何处理更复杂的文档结构如表格、图表等信息抽取是一个非常有价值的技术方向掌握这项技能能够为你的工作效率带来质的提升。希望本文能够为你提供一个良好的起点获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。