多源题库合并去重 → 无表格 Word
炼油/化工岗位题库常以多种形态存在:Word 段落体(题干+逐行选项)、Word 表格(宽表导出)、Excel 标准题库表。它们往往来自同一题库、彼此大量重复。本工作流把三路合并、去重、统一排版为一个可打印/可练习的 Word。
已在《加氢裂化题库-设备.docx + 设备题.xlsx》上验证:231 题 → 去重 136 题(单选 57/多选 26/判断 53),剔除重复 95 题次。
执行流程
- 先 dump 再动手:把 docx 全部段落 + 每个表格的每行(用
T{表号}-{行号}|前缀)导出成 txt 通读一遍,把 Excel 全部行打印出来。不同源的格式差异必须亲眼看到,不能假设。 - 复制模板脚本:
scripts/build_bank.py是完整可用的实现,按实际列结构改parse_docx_tables(列数/列序)与parse_xlsx(列索引)即可,其余逻辑通用。 - 跑脚本,重点看三项输出:各来源解析题数、去重后题型分布、缺答案题清单。
- 质检:
- 用difflib.SequenceMatcher对同题型题干做两两相似度扫描(阈值 0.88)。命中的多数是"反义题对"(不属于/属于、不必注明/必须注明、其他尺寸/设备尺寸),属正常保留,需人工确认后再删。
- 检查答案冲突(同题干不同答案)——脚本会自动打印。
- 抽查生成的 docx:题数、答案行数、( )是否统一。 - 输出:默认写到工作区
output/,再复制到桌面。
源数据的三种形态(识别要点)
Word 段落体——题干行 + 选项行混排,三种变体:
- 题干一行,选项逐行 A、 xxx / B、 xxx
- 题干与选项挤在同一行:加热炉…约为( A )。A、 1:2B、 2:3C、 3:1D、 3:2
- 判断题题干末尾直接跟答案字母:…全貌。B(A=正确,B=错误)
Word 表格——列数不固定,按列数判别:
- 3 列:题干 | 题型 | 答案
- 4 列且第 3、4 列为「正确」「错误」:只有选项、原表缺答案,题干常还被截断
- 7 列:题干 | 题型 | A | B | C | D | 答案
Excel 标准题库表(含表头行,需跳过):
A=题库ID, B=题干, C=题型, D~K=选项A~H, L=答案, M=解析, N=章节, O=难度
题型列值为「单选题/多选题」,需 .replace('题','') 归一。
四个必踩的坑
- 题型不能在读题干行时定死。 选项行是后续逐行追加的,必须在
finalize()里按options 是否为空判定:有选项→选择题(答案长度>1 即多选),无选项→判断题。否则带选项的选择题会被判成判断题,答案被当成 A/B 清掉。 - 清空作答括号的正则必须是
[((][\sA-Ha-h]*[))]。写成[((]\s*[A-Ha-h ]*[))]匹配不到半角括号包全角空格的( C ),会留下已填答案的题干。 - 不要在 clean_text 阶段替换全角空格 U+3000,否则
( )会被后续的空格清理压成()。clean_text 只处理\xa0和半角空白。 - 切分挤在一行的选项时,只接受"前一字符不是 ASCII 字母"的
[A-H][、..]切点,且标签必须 A→B→C→D 严格递增。这样Ni-P、1Gr18Ni9Ti不会被误切,1:2B、能被正确切。
交付前的人工复核清单
生成后必须向用户报告(不要自行修改题目内容):
- 缺答案题(标「答案:(原稿缺失,待确认)」)——原稿就没给,不猜
- 选项为 #NAME? 的图/公式题——替换为「〔原稿为图片/公式,已丢失〕」并加注
- 题干残损(缺字、被截断)——只列清单,不擅自补字
- Excel 解析列与答案不一致处——两者都保留(如「答案:A、B / 解析:PDF选择AC」)
输出排版约定
- 零表格,全部段落。中文宋体 10.5pt,章节标题黑体 13pt,主标题黑体 16pt 居中。
- 顺序:一、单选题 → 二、多选题 → 三、判断题,全卷连续编号。
- 题干作答位统一
( );选项左缩进 21pt;答案行加粗红色;判断题末尾补( )。 - 每题后空一行,便于打印作答。
环境
先加载随包环境探测脚本(自动定位 Python,跨机器可移植,不写死绝对路径):
source ./scripts/_env.sh # 定义 WB_PY / WB_OUT
build_bank.py 的输入输出全部走命令行参数,脚本内不含任何机器专属路径:
"$WB_PY" scripts/build_bank.py --docx <输入.docx> --xlsx <输入.xlsx> --out-dir <输出目录>
--docx/--xlsx至少给一个;--out-dir默认取环境变量WB_OUT,再缺省则取当前目录。- 依赖 python-docx、openpyxl:若运行报
ModuleNotFoundError,在对应 Python 下执行pip install python-docx openpyxl。 - 桌面文件若被 Word 打开,
cp/mv/Copy-Item -Force全部报Device or resource busy,改文件名输出,并提醒用户清理旧版。