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

关键词:题库去重、重复试题清理、题库查重、试题去重脚本、机构题库维护、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. 导出干净题库,保留去重日志备查

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

相关推荐
星夜离尘561 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
zwm2698888152 小时前
hd 3#负一西送风,能远程启不能远程停
c#
Ai-_Man2 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd2 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
学逆向的2 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_3 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
小成202303202658 小时前
C++~07补充
开发语言·c++
2401_8858850411 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅11 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节