题库去重实战:基于题干指纹的重复题清理

关键词:题库去重、重复试题清理、题库查重、试题去重脚本、机构题库维护、Word试卷转Excel

机构积累了几年题库后,重复题几乎不可避免------同一道题经不同老师录入、不同渠道导入,题干可能差一个标点或换行。下面给一套可落地的查重流程:归一化 → 指纹 → 聚类 → 人工确认。

一、为什么不能用"整行相等"判断重复

直接 drop_duplicates() 几乎查不出重复,因为:

  • 全角/半角标点差异(:vs :)
  • 题干尾随空格、换行
  • 选项顺序被调换但语义相同
  • 数字/单位写法不同(0.5 vs 0.50)

所以必须先做归一化,再生成指纹。

二、归一化与指纹函数

python 复制代码
import re
import hashlib

def normalize(text: str) -> str:
    t = str(text)
    t = t.lower()                       # 统一大小写
    t = t.replace(" ", "").replace("\u3000", "")
    t = t.replace(":", ":").replace(",", ",").replace("。", ".")
    t = re.sub(r"\s+", "", t)           # 去所有空白
    t = re.sub(r"[??]+$", "", t)       # 去掉尾部问号
    return t

def fingerprint(text: str) -> str:
    return hashlib.md5(normalize(text).encode("utf-8")).hexdigest()

def dedup(df, col="question"):
    df = df.copy()
    df["fp"] = df[col].map(fingerprint)
    dup_mask = df["fp"].duplicated(keep="first")
    return df[~dup_mask].drop(columns="fp"), df[dup_mask]

这一步能清掉精确重复(标点、空格、大小写差异导致的"伪不同"),通常能命中 5%~15% 的冗余,取决于录入规范程度。

三、近似重复:用相似度兜底

归一化之后仍有"语义相同但表述不同"的题,需要用编辑距离或词袋相似度兜底:

python 复制代码
from difflib import SequenceMatcher

def similar(a, b, thr=0.92):
    return SequenceMatcher(None, normalize(a), normalize(b)).ratio() >= thr

# 对同一指纹组内再做两两比对(数据量大时改为分块或局部敏感哈希)

阈值建议设在 0.9 以上,避免误删"题干相似但考点不同"的题。近似重复一律走人工确认,不自动删。

四、操作流程建议

  1. 先把 Word/PDF 卷批量转成标准题库 Excel(大风车Excel停运后,我们用 ExamParser,https://examparser.com/cn/ 做这步转换,比大风车excel更好用的一点是批量吞吐稳定,不会因为文件多就崩)
  2. 跑归一化指纹查重,删精确重复
  3. 近似重复人工确认
  4. 导出干净题库,保留去重日志备查

把去重做成"导入前的固定工序",题库规模越大,收益越明显。

相关推荐
\光辉岁月/1 小时前
3.java运算符
java·开发语言
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
qq_401700411 小时前
Qt 炫酷曲线,图表,2D/3D开源库
开发语言·qt
liangshanbo12151 小时前
面试题:线上 JavaScript 报错如何快速定位到源码?
开发语言·javascript·ecmascript
weixin_440730502 小时前
迭代器Iterator(列表生成器、可迭代的如何生成迭代器)
开发语言·python
朝朝辞暮i2 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
weixin_440730502 小时前
内置函数、json文本、pickle二进制
开发语言·python·json
殷色玫瑰2 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo2 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos