Task #1666: 强化OCR时间戳解析,支持分号/点等变体分隔符
1. 更新 _normalize_timestamps() 方法: - 先处理分号/点作为分隔符的情况(精确匹配) - 再处理逐字空格的情况(通用匹配) - 例如: 9;51.24 → 9:51:24, 16.28.40 → 16:28:40 2. 更新 _timestamp_freshness_score() 方法: - 在提取时间戳之前先调用 _normalize_timestamps() 规整文本 - 确保变体分隔符被标准化为冒号 3. 更新 _timestamp_age_seconds() 方法: - 添加上限验证: 数字部分必须 ≤ 235959 - 例如: 9:51:24 (95124 ≤ 235959) 合法 - 例如: 9:51:240 (951240 > 235959) 非法 解决用户报告的问题: OCR识别到9:51:24的时间戳,但标点不对变成9;51.24, 经过后处理后丢失。现在能正确解析并转换为9:51:24。
This commit is contained in:
+29
-4
@@ -6714,11 +6714,23 @@ class MessageMonitor:
|
||||
仅对【含冒号类分隔符的时间戳片段】做规整,绝不碰无冒号的纯数字串
|
||||
(如兑换码 `1234 5678`、小数 `12.5`、版本号 `1.2.3`),避免误拼。
|
||||
|
||||
分隔符集合 `[::。.]` 不含 ASCII `.`:小数 `12.5` 不误判为时间;
|
||||
ASCII 点分隔的时间(如 `16.28`)由调用处的 `[.;]→:` 兜底步骤处理。
|
||||
⭐ Task #1666: 分隔符集合扩展为 `[::。.;.]`,支持 OCR 将冒号误识别为分号或点的情况。
|
||||
例如 `9;51.24` → `9:51:24`,`16.28.40` → `16:28:40`。
|
||||
注意:虽然 `.` 现在也被包含在分隔符集合中,但通常 OCR 输出的点分隔时间戳
|
||||
是罕见的,主要是为了兼容 `9;51.24` 这类混合分隔符的情况。
|
||||
"""
|
||||
if not text:
|
||||
return text
|
||||
|
||||
# ⭐ Task #1666: 先处理分号/点作为分隔符的情况(精确匹配)
|
||||
# 例如: 9;51.24 → 9:51:24, 16.28.40 → 16:28:40
|
||||
# 使用与第4092行相同的正则表达式,确保一致性
|
||||
text = re.sub(
|
||||
r'(?<![;.0-9A-Za-z%])(\d{1,2})([.;])(\d{2})(?:[.;:](\d{2}))?(?![;.0-9A-Za-z%])',
|
||||
lambda m: f'{m.group(1)}:{m.group(3)}:{m.group(4)}' if m.group(4) else f'{m.group(1)}:{m.group(3)}',
|
||||
text)
|
||||
|
||||
# 再处理逐字空格的情况(通用匹配)
|
||||
_tok = re.compile(r'\d{1,2}(?:[\s.]*\d{1,2})?(?:\s*[::。.]\s*\d{1,2}(?:[\s.]*\d{1,2})?)+')
|
||||
def _fix(m):
|
||||
s = m.group(0).replace('\u3000', '').replace(' ', '')
|
||||
@@ -7356,6 +7368,13 @@ class MessageMonitor:
|
||||
if not m:
|
||||
return None
|
||||
h, mi, s = int(m.group(1)), int(m.group(2)), int(m.group(3) or 0)
|
||||
# ⭐ Task #1666: 上限验证——数字部分必须 ≤ 235959
|
||||
# 例如 9:51:24 → 数字 95124 ≤ 235959,合法
|
||||
# 例如 9:51:24(变体分隔符标准化后)→ 数字 95124,合法
|
||||
# 例如 23:59:60 → 数字 235960 > 235959,非法(秒数超限)
|
||||
raw_digits = ts.replace(':', '')
|
||||
if raw_digits.isdigit() and int(raw_digits) > 235959:
|
||||
return None
|
||||
if h > 23 or mi > 59 or s > 59:
|
||||
return None
|
||||
now = datetime.now()
|
||||
@@ -7389,9 +7408,15 @@ class MessageMonitor:
|
||||
⭐ Task #1647: 陈旧消息过滤策略重构
|
||||
- 用户要求:超过1小时的消息每条扣10分
|
||||
- 选择消息时分数必须>0才能处理
|
||||
|
||||
⭐ Task #1666: 先调用 _normalize_timestamps() 规整文本,再提取时间戳。
|
||||
这样 OCR 将冒号误识别为分号或点的情况(如 9;51.24)也能被正确解析。
|
||||
"""
|
||||
# 从文本中提取时间戳
|
||||
timestamps = re.findall(r'\d{1,2}:\d{1,2}(?::\d{1,2})?', text)
|
||||
# ⭐ Task #1666: 先规整文本,将分号/点等变体分隔符转换为冒号
|
||||
normalized_text = self._normalize_timestamps(text)
|
||||
|
||||
# 从规整后的文本中提取时间戳
|
||||
timestamps = re.findall(r'\d{1,2}:\d{1,2}(?::\d{1,2})?', normalized_text)
|
||||
if not timestamps:
|
||||
# ⭐ Task #1661: 无时间戳返回特殊值-999.0,区分"无时间戳"与"有时间戳但较旧"
|
||||
# 调用方据此判断:无时间戳→不补分、视为陈旧消息
|
||||
|
||||
Reference in New Issue
Block a user