数学试卷JSON解析器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_8ee7bfb9/exam-parser
技能介绍
要解决的问题
把 Word(.docx)和 PDF 格式的数学试卷变成结构化数据,一直是个麻烦事。试卷里的题号、题型标题、题干、答案解析混杂在同一个文档流里,人工整理耗时且容易错位,尤其是题干文件和答案文件分开存放时,匹配成本更高。Exam Parser 的目标很明确:输入试卷文件路径,输出符合 references/json-format-spec.md 规范的树形 JSON,一次性完成结构化和题干答案匹配。
核心能力与工作流程
技能的入口是 scripts/main.py,必须在 scripts/ 目录下执行,因为它依赖同级 exam_parser/ 包的相对导入。支持的调用方式:
- 单文件:
python main.py 试卷.docx - 多文件:
python main.py 试卷1.docx 试卷2.pdf - 目录批量:
python main.py ./试卷目录/ -o ./output/ - 需要详细日志时加
--verbose
处理链路上各模块分工明确:schema.py 定义数据模型和正则模式(题型匹配、题号匹配),docx_parser.py 负责 DOCX 解析并把 OMath 公式转成 LaTeX,pdf_parser.py 使用 pdfplumber/PyMuPDF 双引擎解析 PDF,analyzer.py 是核心分析引擎,按「标题 → 元信息 → 题型 → 题目」的顺序识别内容,formatter.py 负责 JSON 序列化输出。
输出的 JSON 是一棵四层树:L2 根节点为 chapter(parent_id 固定为 "n2ore0545"),L3 一层放「建议用时」「满分」等元信息,L3 另一层放「一、选择题」这类题型标题,L4 的 question 节点放具体题目。每个节点有 10 位十六进制 MD5 生成的 node_id,答案统一是数组(如 ["B"]),body 字段是 HTML 段落,数学公式用 $$...$$ 包裹。
适用边界与注意点
- 扫描版 PDF 不要指望 OCR:图片型 PDF 提取不到文字时,先用 pypdfium2 或 PyMuPDF 把每页渲染成图片,手动读题后照常调用
main.py解析文本,公式手动转 LaTeX。Tesseract 处理数学公式质量太差,不要尝试。 - 纯文本公式需要人工补:DOCX 中的 OMath 公式会自动转换,但正文里的
2^n这类表达式要在步骤 4 手动补齐。 - 题型标题匹配失败要改正则:
analyzer.py的SECTION_PATTERNS覆盖单选、多选、填空、判断、解答、论述、证明、计算、材料等常见格式,遇到新写法需要修改schema.py中的模式。 - 题干与答案分开处理:同一试卷拆成题目和答案两个文件时,需要在第一步就确认同时处理并做匹配。
使用场景
- 把一份 Word 数学试卷转成 JSON 接入自建题库系统,并核对题干与答案是否对齐
- 同一试卷拆成题目 PDF 和答案 PDF 两个文件,需要分别解析后把答案匹配到对应题目
- 目录下有几十份历年数学试卷需要批量解析,统一输出到 output 目录供后续入库
- 拿到的只有扫描版 PDF 试卷,需要渲染成图片逐页读取后生成结构化题目数据
适合人员
- 题库系统开发者:需要把 DOCX/PDF 数学试卷批量转成规范 JSON 入库
- 教研人员:负责把历年试卷整理成可复用、可检索的结构化题目
- 教育平台工程师:要在自动化流水线里统一解析试卷并匹配题干与答案
- 数学内容编辑:需要将扫描版试卷图片转成带 LaTeX 公式的题目数据