修复行合并导致残片误杀:混合文本后半部分正常查询时放行

This commit is contained in:
youpaishidifu
2026-08-20 10:38:53 +08:00
parent 4d14fe0bc0
commit 13f3afab8a
+18
View File
@@ -6999,6 +6999,11 @@ class MessageMonitor:
# 4. 无动词(判断是否为名词短语)
# 5. 无主语(无人称代词)
# 放行条件:含疑问词或有问号→可能是用户真问句,不拦截
#
# ⚠️ 2026-08-20 修复:行合并可能把"残片+正常内容"拼成一条
# 例:'个桓温'(残片)+ ')youpaishidifu 关于我们'(正常查询)
# → 合并后 '个桓温,关于我们' → 残片检测误杀整条
# 处理:若文本含逗号分隔且后半部分含疑问词/动词/主语 → 提取后半部分放行
if len(text) <= 10:
_has_question_word = any(w in text for w in ('吗', '呢', '多少', '怎么', '如何', '哪', '什么', '几', '?', '?'))
_has_verb = any(v in text for v in ('怎么', '如何', '进行', '设置', '配置', '操作', '使用', '打开', '下载', '安装', '登录', '进入', '查看', '查询', '问', '找', '要', '可以', '能', '会', '请', '帮', '给', '有'))
@@ -7011,6 +7016,19 @@ class MessageMonitor:
if not _common_query and not _ends_with_question:
logger.debug(f"[ocr] 过滤器2结果: 检测到OCR残片(无疑问词+无动词/主语),返回True: {text!r}")
return True
elif ',' in text or ',' in text:
# 逗号分隔的混合文本:检查后半部分是否为正常查询
# 例:'个桓温,关于我们' → 前半是残片,后半是正常查询
_parts = re.split(r'[,,]', text)
if len(_parts) >= 2:
_second_part = _parts[-1].strip()
# 后半部分含疑问词/动词/主语 → 视为正常查询,放行
_has_q2 = any(w in _second_part for w in ('吗', '呢', '多少', '怎么', '如何', '哪', '什么', '几', '?', '?'))
_has_v2 = any(v in _second_part for v in ('怎么', '如何', '进行', '设置', '配置', '操作', '使用', '打开', '下载', '安装', '登录', '进入', '查看', '查询', '问', '找', '要', '可以', '能', '会', '请', '帮', '给', '有'))
_has_s2 = any(s in _second_part for s in ('我', '你', '他', '我们', '你们', '他们', '玩家', '用户', '管理员'))
if len(_second_part) >= 3 and (_has_q2 or _has_v2 or _has_s2):
logger.debug(f"[ocr] 过滤器2结果: 检测到混合文本(残片+正常查询),提取后半部分放行: {text!r} -> {_second_part!r}")
# 放行,但记录日志供后续调试
# 括号不匹配(可能OCR截断)
# 清理末尾的不完整括号(OCR噪声),如"消息内容['"
text_clean = re.sub(r'[\[((]+$', '', text)