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

DeepSeek-OCR-2基础教程:OCR后文本如何做NER实体识别?Spacy集成示例

DeepSeek-OCR-2基础教程:OCR后文本如何做NER实体识别?Spacy集成示例

1. 学习目标与前置知识

本文面向有一定Python基础,想要了解如何将OCR识别结果进一步做实体识别的开发者。通过本教程,你将学会:

  • 使用DeepSeek-OCR-2进行文档文字识别
  • 将识别结果接入Spacy进行命名实体识别
  • 构建一个完整的OCR+NER处理流水线
  • 使用Gradio创建简单的前端界面

不需要你有深入的NLP背景,我们会用最直白的方式讲解每个步骤。

2. 环境准备与快速部署

2.1 安装必要依赖

首先创建并激活Python虚拟环境,然后安装所需包:

# 创建虚拟环境 python -m venv ocr_ner_env source ocr_ner_env/bin/activate # Linux/Mac # 或 ocr_ner_env\Scripts\activate # Windows # 安装核心依赖 pip install torch torchvision pip install transformers pip install spacy pip install gradio pip install python-multipart

2.2 下载Spacy语言模型

Spacy需要预训练模型来进行实体识别,我们下载中文模型:

python -m spacy download zh_core_web_sm

如果你主要处理英文文档,可以下载英文模型:

python -m spacy download en_core_web_sm

3. 基础概念快速入门

3.1 OCR是什么?

OCR(光学字符识别)就像给电脑装上了"眼睛",让它能看懂图片里的文字。DeepSeek-OCR-2就是这样一个先进的"眼睛",不仅能看文字,还能理解文档结构。

3.2 NER实体识别又是什么?

NER(命名实体识别)是给文字中的关键信息打标签的技术。比如从"张三在北京的公司工作"这句话中,它能识别出:

  • "张三"是人名
  • "北京"是地名
  • "公司"是组织机构

3.3 为什么要把它们结合起来?

想象一下:你扫描了一份合同,OCR把文字提取出来了,但你还想知道这里面涉及哪些人、哪些公司、哪些日期。这就是OCR+NER的威力——不仅能读取文字,还能理解文字中的重要信息。

4. 完整代码实现

4.1 导入所需库

import torch from transformers import AutoProcessor, AutoModel from PIL import Image import spacy import gradio as gr import os

4.2 初始化模型

# 加载DeepSeek-OCR-2模型 processor = AutoProcessor.from_pretrained("deepseek-ai/deepseek-ocr-2") model = AutoModel.from_pretrained("deepseek-ai/deepseek-ocr-2") # 加载Spacy中文模型 nlp = spacy.load("zh_core_web_sm") # 如果有GPU,使用GPU加速 device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device)

4.3 OCR识别函数

def extract_text_from_image(image_path): """ 使用DeepSeek-OCR-2从图片中提取文字 """ # 读取图片 image = Image.open(image_path).convert("RGB") # 预处理图片 inputs = processor(images=image, return_tensors="pt").to(device) # 模型推理 with torch.no_grad(): outputs = model(**inputs) # 解码识别结果 recognized_text = processor.decode(outputs.logits[0], skip_special_tokens=True) return recognized_text

4.4 NER实体识别函数

def recognize_entities(text): """ 使用Spacy识别文本中的实体 """ # 处理文本 doc = nlp(text) # 提取实体信息 entities = [] for ent in doc.ents: entities.append({ "text": ent.text, "label": ent.label_, "start": ent.start_char, "end": ent.end_char }) return entities

4.5 完整处理流程

def process_document(image_path): """ 完整的OCR+NER处理流程 """ # 步骤1: OCR文字识别 print("正在进行OCR识别...") text = extract_text_from_image(image_path) print(f"识别结果: {text}") # 步骤2: NER实体识别 print("正在进行实体识别...") entities = recognize_entities(text) # 步骤3: 格式化结果 result = { "extracted_text": text, "entities": entities, "entity_count": len(entities) } return result

5. 快速上手示例

5.1 处理单张图片

让我们用一个简单的例子来试试看:

# 假设你有一张包含文字的图片 image_path = "your_document_image.jpg" # 处理图片 result = process_document(image_path) print("提取的文本:") print(result["extracted_text"]) print("\n识别到的实体:") for entity in result["entities"]: print(f"- {entity['text']} ({entity['label']})")

5.2 实体类型说明

Spacy识别出的实体类型包括:

  • PERSON:人名,如"张三"、"李四"
  • ORG:组织机构,如"腾讯公司"、"清华大学"
  • GPE:地理政治实体,如"北京"、"美国"
  • DATE:日期,如"2024年1月1日"
  • TIME:时间,如"下午3点"
  • MONEY:金额,如"100元"、"$50"
  • PERCENT:百分比,如"50%"

6. 使用Gradio创建前端界面

6.1 构建Web界面

def gradio_interface(image): """ Gradio界面处理函数 """ # 临时保存上传的图片 temp_path = "temp_image.jpg" image.save(temp_path) # 处理图片 result = process_document(temp_path) # 清理临时文件 os.remove(temp_path) # 格式化输出 output_text = f"提取的文本:\n{result['extracted_text']}\n\n" output_text += f"识别到 {result['entity_count']} 个实体:\n" for entity in result["entities"]: output_text += f"- {entity['text']} ({entity['label']})\n" return output_text # 创建界面 interface = gr.Interface( fn=gradio_interface, inputs=gr.Image(type="pil", label="上传文档图片"), outputs=gr.Textbox(label="识别结果"), title="DeepSeek-OCR-2 + Spacy NER 文档处理", description="上传文档图片,自动识别文字并提取实体信息" )

6.2 启动Web服务

# 启动Gradio界面 if __name__ == "__main__": interface.launch(share=True)

运行这段代码后,你会得到一个本地Web服务地址,打开浏览器就能看到操作界面。上传图片后,系统会自动完成文字识别和实体提取。

7. 实用技巧与进阶

7.1 处理多页PDF文档

如果需要处理多页PDF,可以先将PDF转换为图片:

from pdf2image import convert_from_path def process_pdf(pdf_path): """ 处理多页PDF文档 """ # 转换PDF为图片 images = convert_from_path(pdf_path) all_results = [] for i, image in enumerate(images): # 保存临时图片 temp_path = f"temp_page_{i+1}.jpg" image.save(temp_path, "JPEG") # 处理当前页 result = process_document(temp_path) result["page"] = i + 1 all_results.append(result) # 清理临时文件 os.remove(temp_path) return all_results

7.2 提高识别准确率

  • 图片质量:确保上传的图片清晰、光线均匀
  • 文字方向:如果文档有特殊排版,可以先进行预处理
  • 模型选择:对于特定领域文档,可以微调Spacy模型

7.3 自定义实体类型

如果需要识别特定类型的实体(如产品型号、专利号等),可以训练自定义Spacy模型:

# 简单的训练示例 train_data = [ ("这是一台iPhone 15 Pro手机", {"entities": [(5, 17, "PRODUCT")]}), ("我们的序列号是SN123456", {"entities": [(6, 15, "SERIAL_NUMBER")]}) ] # 实际训练需要更多数据和更复杂的配置

8. 常见问题解答

问题1:识别速度慢怎么办?

  • 使用GPU加速
  • 调整图片大小,减少分辨率
  • 使用Spacy的小模型(zh_core_web_sm)

问题2:中文实体识别不准?

  • 确保使用中文模型(zh_core_web_sm)
  • 考虑使用专门的中文NLP工具,如LTP、HanLP

问题3:如何处理表格数据?

  • DeepSeek-OCR-2能较好处理表格
  • 识别后可以按行列结构重组数据

问题4:内存不足怎么办?

  • 减小批量处理的大小
  • 使用更小的模型
  • 增加系统内存或使用云服务

9. 总结

通过本教程,我们学会了如何将DeepSeek-OCR-2的文字识别能力与Spacy的实体识别能力结合起来,构建一个完整的文档信息提取系统。

关键收获:

  • DeepSeek-OCR-2提供了先进的文档文字识别能力
  • Spacy让实体识别变得简单易用
  • Gradio帮助我们快速构建演示界面
  • 整个流程可以处理各种类型的文档和图片

下一步建议:

  1. 尝试处理自己业务中的实际文档
  2. 探索Spacy的更多功能(关系提取、文本分类等)
  3. 考虑将系统部署为API服务
  4. 针对特定领域微调模型提高准确率

现在你已经掌握了从图片中提取文字并识别关键信息的技术,可以开始在实际项目中应用这些技能了。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/460686/

相关文章:

  • OneAPI效果展示:Gemini与Claude在复杂推理任务中的表现对比
  • 树莓派+Pixhawk2.4.8无人机控制全流程:从硬件连接到MAVLink脚本调试(避坑指南)
  • Testsigma深度解析:开源测试平台的技术架构与实践指南
  • Qwen3-ForcedAligner-0.6B在Vue前端项目中的可视化应用
  • 零基础玩转Qwen3-4B:手把手教你部署并生成API文档
  • Qwen3-VL-8B环境配置全攻略:一张显卡搞定,开启视觉问答新体验
  • Qwen2.5-32B-Instruct微服务架构:Spring Cloud集成指南
  • 小红书爆款素材生成:AnythingtoRealCharacters2511打造高互动率真人化笔记配图教程
  • TranslateGemma企业级应用:本地部署神经机器翻译全流程
  • OWL ADVENTURE实战:自动化软件安装截图分析与错误诊断
  • 3个核心功能带来的3D模型管理效率提升80%实践指南
  • 基于Phi-3-mini-4k-instruct的Python安装包依赖分析
  • 攻克AKShare数据获取难题:从异常处理到架构升级的全链路优化
  • SDXL 1.0电影级绘图工坊企业应用:电商主图+营销海报AI生成落地实践
  • FireRedASR-AED-L模型可解释性:注意力热力图可视化识别关键语音片段
  • Janus-Pro-7B高算力适配:Ollama自动GPU调度提升多模态推理效率
  • LiuJuan20260223Zimage与MySQL数据库交互:安装配置全攻略
  • 突破网盘限速壁垒:开源直链解析工具如何重构文件下载体验
  • 嵌入式AI实战:基于STM32与YOLOv12的轻量级目标检测系统
  • OpenDataLab MinerU指令集大全:高效调用API实战指南
  • Python Chatbot 附件处理实战:从文件解析到安全存储
  • MKS Monster8 8轴主板革新实战指南:从硬件部署到性能优化
  • 立创CW32F030电压电流表加强版:从ADC优化到便携设计的开源实战
  • 动态权重无感切换是啥体验?Anything to RealCharacters高效调试实战
  • MediaCrawler:零基础实现多平台数据采集的开源工具
  • 3大核心功能解锁B站视频自由:bilibili-downloader全攻略
  • .NET 9低代码平台开发全栈落地(微软内部验证的5层抽象模型首次公开)
  • 零基础玩转IQuest-Coder-V1:5分钟学会LoRA微调,定制你的编程助手
  • PyWxDump完全指南:从入门到精通的数据解密实战
  • AI 辅助下的 51单片机毕业设计选题:从创意筛选到代码生成的高效开发实践