@fix(monitor): 新增箭头分隔符=>拆分,解决Windows OCR合并多条消息问题
This commit is contained in:
+21
-5
@@ -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的位置
|
||||
|
||||
Reference in New Issue
Block a user