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

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

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

相关推荐
大可不必了6 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus6 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道7 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛7 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
eggwyw8 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
用户7884773163411 小时前
WinForms 迁移 WPF:Upgrade Assistant 覆盖 30%,剩下 70% 我手写了六周
c#
another heaven13 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
SomeOtherTime14 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain14 小时前
C++转Java日记(10)
java·开发语言
总要学点什么15 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium