采集的问答样本里既有全角括号也有半角括号,数字还有全角写法,评测时人工答案匹配不上,检索侧同一句话被当成两条,重复率虚高 8 个点。

原因不止一个,得分开看。清洗只做了去空格,没有做 Unicode 归一;全角数字与半角数字在哈希后完全不同;标点符号混用导致分词结果不一致;索引和查询走了两条不同的清洗链路。

量一下全角字符在样本里的占比

python -c "import unicodedata;s=open('raw.txt',encoding='utf-8').read();print(sum(1 for c in s if unicodedata.east_asian_width(c) in 'FW'))"

然后用 NFKC 统一后对比哈希变化

python -c "import unicodedata;print(unicodedata.normalize('NFKC','123(测试)'))"

接着把归一函数同时挂到入库与查询两侧

python clean.py --in raw.txt --out norm.txt --unicode nfkc

末了重建索引后看重复率与命中率

python index_rebuild.py --collection faq_v2 --source norm.txt

改完先别撤,确认这几项。同一句话的哈希在入库与查询两侧一致,重复率从 8% 降到 1.2%,评测里的答案匹配失败条数归零。

补一句。归一必须两边同时做,只改入库会让查询永远对不上;NFKC 会改动全角符号的形态,展示层要保留原文。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189