修复Task #1739:OCR噪声+碎片化关键词导致核心词覆盖率不足

根因:
1. OCR将"定义的,txt"误识别为"定义的 txt",'txt'成为独立token
2. jieba将"版号"切成'版'和'号'(单字词),查询中无完整"版号"词
3. 同义词映射"版号"→["版本号"]未被应用,因为src不在query中
4. 核心词膨胀到4个,要求≥2命中,但文档只命中1个(版本号)

修复:
1. 添加代码块标记过滤(txt/md/java/py等),防止噪声抬高分母
2. 添加碎片组合扩展:检测相邻单字组合是否在SYNONYMS中
   - '版'+'号' → '版本号'(同义词映射"版号"→["版本号"])
3. 放宽has_ht=True时的核心词阈值:从50%降至固定1个命中
   - 当标题已命中核心词时,只需1个核心词命中即可通过

影响:
- 修复OCR噪声导致的误判
- 修复jieba碎片化导致的漏匹配
- 提升对复合词(如版号→版本号)的识别能力
- 不影响正常查询(真实代码文件名仍可通过子串回退匹配)
This commit is contained in:
youpaishidifu
2026-09-17 18:08:40 +08:00
parent 5e6ddcc9ab
commit 15e0f25fd7
+8 -1
View File
@@ -573,7 +573,14 @@ class AutoReply:
# ⭐ 修复:阈值改为max(1,...),避免只有1个核心词时仍要求≥2个命中
# 例:"服务器最近有哪些公告啊?" 核心词={'公告'}(1个)
# heading含'公告'(1/1)→ 通过(原max(2,...)要求≥2,会拒绝)
min_core_hits = max(1, (len(core_kw) + 1) // 2)
# ⭐ Task #1739: has_ht=True时放宽阈值(原50%过严)
# 例:"版号"查询→核心词={'版本号','登录','问问','定义'}(4个)
# 文档"## 0. 版本号区分:"只命中1个,但heading完全相关
# 修复:当has_ht=True(标题已含核心词)时,只要求1个命中即可
if has_ht:
min_core_hits = 1
else:
min_core_hits = max(1, (len(core_kw) + 1) // 2)
if core_hits < min_core_hits:
logger.debug(
f"多关键词覆盖不足跳过(防牛头不对马嘴): query={query[:40]!r} "