Task #1606 修复:OCR识别错误日期(如12026年8月38日)导致查重失效

Bug: EasyOCR把2026年8月3日识别成12026年8月38日→年份12026超范围被跳过→dates=[]→
过滤器1放行给下游→基线轮次选中近期公告触发二次回复,无查重日志。

Fix:
1. 年份解析前增加1900~2100范围检查,异常年份直接跳过不加入dates
2. 新增_ocr_fakedate_detected标志:无有效日期但检测到OCR年份异常(如12026)→丢弃
   防止历史消息特征被漏过无日期放行路径
3. 防御场景:未来日期(如2030年)、过去日期OCR噪声(年份畸形的历史记录)
This commit is contained in:
youpaishidifu
2026-08-25 16:40:20 +08:00
parent 12f269acaf
commit eac9ece77f
+26
View File
@@ -6335,6 +6335,11 @@ class MessageMonitor:
y, m, d = int(parts[0]), int(parts[1]), int(parts[2])
except ValueError:
continue
# ⭐ Task #1606: 拒绝OCR识别错误的异常年份(如"12026年8月38日"→12026)
# 合理年份范围:1900~2100,超出范围的日期视为OCR噪声,不加入dates列表
if y < 1900 or y > 2100:
logger.debug(f"[ocr] 日期年份异常({y}),OCR识别错误,跳过: {date_str}")
continue
# 尝试从d向下截断,找到第一个合法且≤今天的日期
# 处理:2026/8/31(未来)→ 2026/8/3(过去),2026/8/32(非法)→ 2026/8/3
found = False
@@ -6436,8 +6441,29 @@ class MessageMonitor:
# 无时间戳:放行给下游
logger.debug(f"[ocr] 过滤器1结果: 不清晰日期+无时间戳,放行")
return True
# ⭐ Task #1606: 记录是否检测到OCR识别错误的日期模式
# 例:"12026年8月38日"→年份12026>2100被跳过→dates=[]但文本有历史日期特征
# 这种情况下不能走"无日期放行"逻辑,否则会被错误当作新消息处理
_ocr_fakedate_detected = False
_raw_date_patterns = re.findall(r'\d{4,}[/-]\d{1,2}[/-]\d{1,2}|\d{4,}年\d{1,2}月\d{1,2}日', text)
for rp in _raw_date_patterns:
normalized_rp = rp.replace('-', '/').replace('年', '/').replace('月', '/').replace('日', '')
parts = normalized_rp.split('/')
if len(parts) == 3:
try:
y = int(parts[0])
if y < 1900 or y > 2100:
_ocr_fakedate_detected = True
logger.debug(f"[ocr] 检测到OCR识别错误的日期(年份异常): {rp}")
break
except ValueError:
pass
# ⭐ 无日期信息:放行给下游DB查重(当天消息不带日期)
if not dates:
# ⭐ Task #1606: 如果检测到OCR识别错误的日期(如12026年),视为历史消息丢弃
if _ocr_fakedate_detected:
logger.debug(f"[ocr] 过滤器1结果: 检测到OCR识别错误的日期模式(年份异常),丢弃: {text[:80]!r}")
return False
logger.debug(f"[ocr] 过滤器1结果: 无日期信息,放行给下游DB查重")
# 如果有时间戳,检查时间戳新鲜度(可选,用于快速放行)
if timestamps: