修复病句过滤器误判缺主语但有查询意图的消息 (Task #1687)

问题:
- 用户消息'想知道怎么绑定邮箱'被判定为'病句(缺主语)'并丢弃
- 该句子虽然缺主语,但核心动机明确——查询'绑定邮箱'

修复:
- 在病句3(缺主语)过滤规则中添加查询意图词检查
- 如果句子包含疑问词(在何哪什怎么多少吗呢)或查询意图词(绑定、设置、配置等),即使缺主语也放行
- 扩展'问'开头消息的例外规则,添加更多查询意图词
- 保留对真正病句(如'将其修正后重三')的过滤

测试:
- '想知道怎么绑定邮箱':放行(包含疑问词'怎么'和查询意图词'绑定')
- '将其修正后重三':丢弃(真正的病句)
- '认管理员密码多少':放行(包含疑问词'多少')
This commit is contained in:
youpaishidifu
2026-09-02 23:10:22 +08:00
parent a6d7d5f083
commit cfd89ef963
+11 -1
View File
@@ -5048,13 +5048,23 @@ class MessageMonitor:
# 病句3:句子缺少主语且无标点(如"将其修正后重三" "认管理员密码多少") # 病句3:句子缺少主语且无标点(如"将其修正后重三" "认管理员密码多少")
# OCR常把"默认"识别丢掉→"认管理员密码多少"、把"帮"识别丢掉→"查xx" # OCR常把"默认"识别丢掉→"认管理员密码多少"、把"帮"识别丢掉→"查xx"
# 例外:以"问一嘴"、"问一下"开头的正常查询消息,或包含疑问词且长度>8的消息放行 # 例外:以"问一嘴"、"问一下"开头的正常查询消息,或包含疑问词且长度>8的消息放行
# ⭐ Task #1687: 添加查询意图词检查,缺主语但有明确意图的消息不应丢弃
if re.match(r'^[其将把被认查帮试想]', line) and not re.search(r'[。!?,,;;::?]$', line): if re.match(r'^[其将把被认查帮试想]', line) and not re.search(r'[。!?,,;;::?]$', line):
# 检查是否包含疑问词或查询意图词
_has_question_intent = re.search(r'[在何哪什怎么多少吗呢]', line)
_has_query_intent = re.search(r'(下载|地址|查询|查看|了解|咨询|知道|怎么|如何|绑定|设置|配置|修改|删除|添加|开启|关闭|使用|安装|登录|注册|绑定)', line)
if _has_question_intent or _has_query_intent:
# 包含疑问词或查询意图词,放行
logger.debug(f"[{platform}] OCR 过滤: 病句(缺主语)但含查询意图,放行: {line!r}")
pass
else:
logger.debug(f"[{platform}] OCR 过滤: 病句(缺主语) line={line!r}") logger.debug(f"[{platform}] OCR 过滤: 病句(缺主语) line={line!r}")
continue continue
# "问"开头的消息单独处理:排除"问一嘴"、"问一下"等正常查询 # "问"开头的消息单独处理:排除"问一嘴"、"问一下"等正常查询
if re.match(r'^问', line) and not re.search(r'[。!?,,;;::?]$', line): if re.match(r'^问', line) and not re.search(r'[。!?,,;;::?]$', line):
# 如果长度>=6且包含疑问词或核心动作词,视为正常查询放行 # 如果长度>=6且包含疑问词或核心动作词,视为正常查询放行
if len(line) >= 6 and (re.search(r'[在何哪什怎么多少]', line) or re.search(r'(下载|地址|查询|查看|了解|咨询|知道|怎么|如何)', line)): # ⭐ Task #1687: 扩展查询意图词列表
if len(line) >= 6 and (re.search(r'[在何哪什怎么多少吗呢]', line) or re.search(r'(下载|地址|查询|查看|了解|咨询|知道|怎么|如何|绑定|设置|配置|修改|删除|添加|开启|关闭|使用|安装|登录|注册)', line)):
pass # 放行 pass # 放行
else: else:
logger.debug(f"[{platform}] OCR 过滤: 病句(缺主语) line={line!r}") logger.debug(f"[{platform}] OCR 过滤: 病句(缺主语) line={line!r}")