@fix(monitor): 新增箭头分隔符=>拆分,解决Windows OCR合并多条消息问题

This commit is contained in:
youpaishidifu
2026-08-16 11:14:19 +08:00
parent 4df8f04f43
commit 077ad4a893
+21 -5
View File
@@ -4595,7 +4595,7 @@ class MessageMonitor:
@staticmethod
def _split_merged_ocr_text(text: str) -> list:
"""尝试将 OCR 单行合并文本在中文句尾标点处拆分。
"""尝试将 OCR 单行合并文本在分隔符处拆分。
EasyOCR 常把横向相邻的两条消息(用户问句 + 群昵称/UI文字/其他人消息)
检测为同一行文本,导致"兑换码导入错误时如何处置?游戏专用小筑憩-草一"式合并。
@@ -4606,11 +4606,16 @@ class MessageMonitor:
如果机械地在标点后拆分,会把同一条消息拆成多条碎片,
导致 bot 只回复其中一段,另一段被丢弃。
⭐ 2026-08-16 新增:识别 `=>` / `→` 箭头分隔符
Windows OCR 常把多条消息用箭头连接(如"问题?=>后续内容"),
箭头是清晰的消息边界,必须拆分。
启发式规则:
1. 仅在检测到【新昵称/头衔】出现在标点之后时才拆分
1. 优先在 `=>` / `→` 处拆分(最可靠的边界)
2. 仅在检测到【新昵称/头衔】出现在标点之后时才拆分
(如"问个问题。草原探险服务器备用号@游戏专用那服务器...")
2. 如果标点后的文本是续接内容(以"那/这/我/你"等代词开头),不拆分
3. 最多拆 1 次(2段),防止过度拆分
3. 如果标点后的文本是续接内容(以"那/这/我/你"等代词开头),不拆分
4. 最多拆 2 次(3段),防止过度拆分
"""
if len(text) < 10:
return [text]
@@ -4632,9 +4637,20 @@ class MessageMonitor:
r'\s*[@@]?\s*'
)
# ⭐ 2026-08-16: 优先处理箭头分隔符(最可靠的消息边界)
# 匹配 => 或 → 及其周围的可选空格
arrow_sep = re.compile(r'\s*(?:=>|→)\s*')
if arrow_sep.search(text):
parts = arrow_sep.split(text)
# 过滤空段和过短的段
valid_parts = [p.strip() for p in parts if len(p.strip()) >= 3]
if len(valid_parts) > 1:
logger.debug(f"[ocr] 箭头分隔拆分: {[p[:40] for p in valid_parts]}")
return valid_parts
result = []
remaining = text
max_splits = 1 # ⭐ 最多拆 1 次(2段),防止过度拆分
max_splits = 2 # ⭐ 最多拆 2 次(3段),支持多个分隔符
while max_splits > 0:
# 找[。?!?]后紧跟CJK的位置