事情本身不复杂,线索都在日志里。清洗 12 万条问答对时用 drop_duplicates(subset='title') 去重,剩 8.6 万条,人工抽检发现同一问题换个标点或加个前缀就留下了,去重率只有三成。

第一反应是「只比对标题没有比对正文」,验证下来不成立。

排查方向其实有限,先把可能性排一排。完全匹配对空白、标点、全半角差异不敏感。另一种情况是标题里带了渠道后缀,同一问题有多个变体。

另外,没有做大小写与繁简归一。

做归一化再算重复率看差距

python -c "import re,unicodedata;n=lambda s:re.sub(r'[\s\W_]+','',unicodedata.normalize('NFKC',s).lower());print(n('如何 部署 vLLM?'))"

接着用字符级指纹做近似去重

python -c "import hashlib;print(hashlib.md5('如何部署vllm'.encode()).hexdigest()[:12])"

然后按 simhash 距离聚类再人工抽检

python dedup.py --method simhash --threshold 3 --report clusters.json

剩下的就是对比两种方法的结果差异

python dedup.py --compare exact,simhash --sample 200

改完先别撤,确认这几项。去重后剩 7.4 万条左右,抽检 200 组近重复能合并到同一簇,误合并率低于 2%。

补一句。完全匹配只能去掉字面相同的记录,中文场景里标点、全半角、前后缀都会绕过它,先归一化再谈相似度。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189