news 2026/6/11 23:27:55

山东大学软件学院项目实训【个人8】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
山东大学软件学院项目实训【个人8】

法律文书智能摘要系统文件上传实现分析

一、整体架构设计

该系统采用格式识别 + 策略路由的架构模式,在documents.py中实现统一的上传入口,根据文件扩展名和内容特征自动路由到不同解析器:

┌─────────────────────────────────────────────────────────────┐ │ /api/documents/upload │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 格式检测 │ │ ext = filename.split │ └─────────────────────────┘ │ │ │ ┌──────────┘ │ └──────────┐ ▼ ▼ ▼ ┌───────────┐ ┌─────────────┐ ┌─────────────┐ │ .txt │ │ .docx │ │ .pdf │ │ 直接解码 │ │ parse_word │ │ parse_pdf │ └───────────┘ └─────────────┘ └─────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌───────────┐ ┌───────────┐ │ is_scanned│ │is_scanned │ │ = False │ │ = True │ │ 返回文本块│ │ ocr_pdf │ └───────────┘ └───────────┘

二、各格式实现详解

1. TXT 格式 - 多编码兼容解码

核心实现documents.py:189-209):

with open(file_path, "rb") as f: raw = f.read() # 尝试不同编码,处理双重UTF-8编码情况 try: text = raw.decode("utf-8") # 检测是否为双重编码(mojibake) if any(c in text for c in ['å', 'é', 'ä', 'ç', 'è']) and not any('\u4e00' <= c <= '\u9fff' for c in text[:200]): text = text.encode('latin-1').decode('utf-8') except (UnicodeDecodeError, UnicodeEncodeError): try: text = raw.decode("gbk") except UnicodeDecodeError: text = raw.decode("utf-8", errors="replace")

技术要点

处理步骤技术手段解决的问题
首选UTF-8解码raw.decode("utf-8")处理标准UTF-8编码文件
双重编码检测mojibake特征字符检测处理Windows下常见的双重编码问题
GBK降级raw.decode("gbk")兼容传统中文Windows编码
容错兜底errors="replace"确保任何情况下都能解析

2. DOCX 格式 - python-docx 解析

核心实现pdf_parser.py:281-307):

def parse_word(file_path: str) -> tuple[DocumentMeta, list[TextBlock]]: from docx import Document as DocxDocument docx_doc = DocxDocument(file_path) blocks: list[TextBlock] = [] for i, para in enumerate(docx_doc.paragraphs): text = para.text.strip() if not text: continue block_type = "title" if para.style and "Heading" in (para.style.name or "") else "text" blocks.append(TextBlock( content=text, page=1, # Word无精确页码,标记为1 bbox=[0, i * 20, 500, (i + 1) * 20], # 近似坐标 block_type=block_type, ))

技术要点

特性实现方式说明
标题识别通过样式名判断"Heading" in para.style.name
段落分割按docx段落对象遍历天然保持段落结构
页码处理统一标记为1Word文档内部无固定页码概念
坐标模拟线性计算近似坐标[0, i*20, 500, (i+1)*20]

3. PDF 非扫描件 - PyMuPDF 高精度解析

核心实现pdf_parser.py:163-278):

def parse_pdf(file_path: str, filter_mode: FilterMode = "keep_all") -> tuple[DocumentMeta, list[TextBlock]]: doc = fitz.open(file_path) is_scanned = detect_scanned(doc) # 扫描件检测 if is_scanned: doc.close() return meta, [] # 返回空块,后续走OCR for page_num in range(len(doc)): page = doc[page_num] page_dict = page.get_text("dict") for block in page_dict.get("blocks", []): if block.get("type") == 0: # text block for line in block.get("lines", []): line_text = "" for span in line.get("spans", []): line_text += span.get("text", "").strip() # 判断行类型(页眉/页脚/正文/标题) block_type = "title" if max_font_size > 14 else "text" if line_bbox[1] < 50: block_type = "header" elif line_bbox[3] > page.rect.height - 50: block_type = "footer"

扫描件检测算法pdf_parser.py:12-19):

def detect_scanned(doc: fitz.Document, sample_pages: int = 3) -> bool: """检测PDF是否为扫描件:前几页文本极少则判定为扫描件""" pages_to_check = min(sample_pages, len(doc)) total_text = "" for i in range(pages_to_check): total_text += doc[i].get_text() return len(total_text.strip()) < 50 * pages_to_check

段落合并算法pdf_parser.py:50-107):

判断条件阈值说明
行尾空缺比例gap_ratio > 0.20行尾空白超过页面宽度20%
垂直间距> 2.5 * font_size段落间距大于2.5倍行高
字体大小变化> 1.5字号变化超过1.5磅

4. PDF 扫描件 - OCR + LLM勘误

核心实现ocr_service.py:65-150):

def ocr_pdf(file_path: str) -> list[TextBlock]: doc = fitz.open(file_path) blocks: list[TextBlock] = [] for page_num in range(len(doc)): page = doc[page_num] # 1. 页面渲染为图像(300 DPI) pix = page.get_pixmap(dpi=300) img = Image.open(io.BytesIO(pix.tobytes("png"))) # 2. 图像预处理 preprocessed_img = preprocess_image(img) # 3. Tesseract OCR ocr_data = pytesseract.image_to_data( preprocessed_img, lang="chi_sim", output_type=pytesseract.Output.DICT )

图像预处理流程ocr_service.py:21-62):

原始图像 → 灰度化 → 二值化(Otsu阈值)→ 中值滤波去噪 → 倾斜校正 → OCR识别

后端调用链路documents.py:174-185):

if meta.is_scanned: # 首先进行OCR识别 ocr_blocks = ocr_pdf(file_path) # 然后使用LLM进行勘误和标准化 blocks, ocr_correction = enhance_ocr_results(ocr_blocks)

三、四种格式实现对比

维度TXTDOCXPDF(非扫描)PDF(扫描件)
解析引擎Python内置解码python-docxPyMuPDFTesseract OCR
文本精度无损无损无损依赖图像质量
结构保留仅段落标题/段落完整结构+坐标OCR重建结构
页眉页脚处理N/AN/A可配置过滤OCR后处理
页码信息精确精确
坐标信息模拟精确像素转换
置信度N/AN/AN/A字符级置信度
处理耗时极快较快中等较慢
内存占用

四、技术亮点总结

1. 智能扫描件检测

  • 基于文本密度判断,阈值50 * pages_to_check
  • 兼顾准确性和性能,仅采样前3页

2. 多编码容错机制

  • UTF-8优先,GBK降级,容错兜底
  • 双重编码自动检测(mojibake特征)

3. 段落边界智能识别

  • 融合行尾空缺、垂直间距、字体变化三重判断
  • 自适应阈值,避免过度分割或合并

4. OCR质量优化

  • 完整的图像预处理流水线
  • 字符级置信度输出,支持后续LLM勘误

5. 渐进式处理策略

  • 同步完成:文件保存、基础解析、信息抽取、文本切片
  • 后台异步:LLM分类、向量化、A-MEM吸收
  • 提升用户体验,避免长时间等待
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 23:26:54

深入解析80C51单片机编程与安全机制:从时序到掩膜ROM实战

1. 项目概述&#xff1a;从数据手册到实战&#xff0c;理解80C51的编程与安全如果你和我一样&#xff0c;是从8051单片机开始入门的嵌入式开发者&#xff0c;那么对P0口、P2口、ALE、EA这些引脚一定不陌生。我们通常更关注如何用C语言或汇编让LED闪烁、让串口通信&#xff0c;而…

作者头像 李华
网站建设 2026/6/11 23:26:51

深入CARLA地图底层:OpenDRIVE文件如何影响你的仿真效果与避坑指南

深入CARLA地图底层&#xff1a;OpenDRIVE文件如何影响你的仿真效果与避坑指南当你驾驶虚拟车辆在CARLA的街道上飞驰时&#xff0c;是否遇到过车辆在路口突然"鬼畜转向"&#xff0c;或是明明设置了变道逻辑却始终无法执行&#xff1f;这些看似诡异的仿真行为&#xff…

作者头像 李华
网站建设 2026/6/11 23:26:50

P87LPC760单片机定时器与UART串口通信实战配置指南

1. 项目概述与核心价值在嵌入式开发的江湖里&#xff0c;P87LPC760这颗14脚的小芯片&#xff0c;对于很多做低成本、低功耗项目的朋友来说&#xff0c;绝对是个“老熟人”。它虽然个头小&#xff0c;但五脏俱全&#xff0c;尤其是它那套源自经典80C51架构的定时器和UART串口&am…

作者头像 李华
网站建设 2026/6/11 23:26:00

超越基础地图:用微信小程序map组件打造一个交互式区域标注工具

超越基础地图&#xff1a;用微信小程序map组件打造交互式区域标注工具想象一下这样的场景&#xff1a;用户在你的外卖小程序上轻轻点击屏幕&#xff0c;就能自主划定配送范围&#xff1b;物业管理人员通过几次触控&#xff0c;精准标注出小区内的绿化区域&#xff1b;活动策划者…

作者头像 李华
网站建设 2026/6/11 23:23:27

3种智能方案:Buzz离线音频转写与翻译完全指南

3种智能方案&#xff1a;Buzz离线音频转写与翻译完全指南 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 你是否曾为整理会议…

作者头像 李华
网站建设 2026/6/11 23:20:24

闲置ST-Link别吃灰!手把手教你刷成J-Link固件(附恢复原厂方法)

闲置ST-Link改造指南&#xff1a;解锁J-Link全功能开发体验手里闲置的ST-Link调试器是否已经积灰许久&#xff1f;作为嵌入式开发者&#xff0c;我们常常面临工具链不统一的困扰——ST-Link虽然性价比高&#xff0c;但J-Link的软件生态&#xff08;如RTT实时传输、SystemView系…

作者头像 李华