
关键词题库去重、重复试题清理、题库查重、试题去重脚本、机构题库维护、Word试卷转Excel机构积累了几年题库后重复题几乎不可避免——同一道题经不同老师录入、不同渠道导入题干可能差一个标点或换行。下面给一套可落地的查重流程归一化 → 指纹 → 聚类 → 人工确认。一、为什么不能用整行相等判断重复直接drop_duplicates()几乎查不出重复因为全角/半角标点差异vs:题干尾随空格、换行选项顺序被调换但语义相同数字/单位写法不同0.5vs0.50所以必须先做归一化再生成指纹。二、归一化与指纹函数importreimporthashlibdefnormalize(text:str)-str:tstr(text)tt.lower()# 统一大小写tt.replace( ,).replace(\u3000,)tt.replace(,:).replace(,,).replace(。,.)tre.sub(r\s,,t)# 去所有空白tre.sub(r[?]$,,t)# 去掉尾部问号returntdeffingerprint(text:str)-str:returnhashlib.md5(normalize(text).encode(utf-8)).hexdigest()defdedup(df,colquestion):dfdf.copy()df[fp]df[col].map(fingerprint)dup_maskdf[fp].duplicated(keepfirst)returndf[~dup_mask].drop(columnsfp),df[dup_mask]这一步能清掉精确重复标点、空格、大小写差异导致的伪不同通常能命中 5%~15% 的冗余取决于录入规范程度。三、近似重复用相似度兜底归一化之后仍有语义相同但表述不同的题需要用编辑距离或词袋相似度兜底fromdifflibimportSequenceMatcherdefsimilar(a,b,thr0.92):returnSequenceMatcher(None,normalize(a),normalize(b)).ratio()thr# 对同一指纹组内再做两两比对数据量大时改为分块或局部敏感哈希阈值建议设在 0.9 以上避免误删题干相似但考点不同的题。近似重复一律走人工确认不自动删。四、操作流程建议先把 Word/PDF 卷批量转成标准题库 Excel大风车Excel停运后我们用 ExamParserhttps://examparser.com/cn/ 做这步转换比大风车excel更好用的一点是批量吞吐稳定不会因为文件多就崩跑归一化指纹查重删精确重复近似重复人工确认导出干净题库保留去重日志备查把去重做成导入前的固定工序题库规模越大收益越明显。