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:
+26
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user