Calibrator
置信度校准引擎,通过规则引擎和语言学分析提升 OCR 置信度评估准确性。
概述
typescript
import { getCalibrator } from '@/core'
const calibrator = getCalibrator()
const { confidence: calibrated } = calibrator.calibrateEnhanced(text, rawConfidence, script)校准流程
输入文本 + 原始置信度
│
▼
规则引擎
│
├─ 长度规则:过短文本降权
├─ 数字规则:纯数字文本降权
├─ 符号规则:包含异常符号降权
├─ CJK 规则:CJK 字符占比高升权
└─ 标点规则:正确使用标点升权
│
▼
CJK n-gram 分析
│
├─ 生成 2-gram / 3-gram
├─ 计算困惑度(perplexity)
└─ 低困惑度升权,高困惑度降权
│
▼
竖线检测
│
├─ 检测连续竖线(字幕边框)
└─ 包含竖线降权
│
▼
标点规范化
│
├─ 全角 → 半角转换
├─ 中文标点 → 英文标点
└─ 多余空格去除
│
▼
输出校准后置信度规则引擎
长度规则
- 文本长度 < 2:置信度 × 0.5
- 文本长度 > 100:置信度 × 0.9
数字规则
- 纯数字(如
123):置信度 × 0.7 - 数字+标点(如
1:23):置信度 × 0.8
符号规则
- 包含异常符号(
@#¥%&):置信度 × 0.6 - 包含正常标点(
,.!?):置信度 × 1.1
CJK 规则
- CJK 字符占比 > 50%:置信度 × 1.2
- CJK 字符占比 > 80%:置信度 × 1.3
标点规则
- 以中文句号/问号/感叹号结尾:置信度 × 1.1
- 包含连续重复标点:置信度 × 0.8
CJK n-gram 分析
2-gram
文本: "这是一个测试"
2-gram: ["这是", "是一", "一个", "个测", "测试"]3-gram
文本: "这是一个测试"
3-gram: ["这是一", "是一个", "个测试"]困惑度计算
基于预训练的语言模型计算困惑度(perplexity):
- 低困惑度(< 50):文本流畅,置信度升权
- 高困惑度(> 200):文本生硬,置信度降权
竖线检测
字幕常见边框为连续竖线(| 或 丨):
- 检测连续 3 个以上竖线
- 包含边框的字幕降权(可能是 OCR 误识别)
标点规范化
全角 → 半角
, → ,
。 → .
! → !
? → ?
: → :
; → ;中文标点 → 英文标点
「」 → ""
『』 → ""
—— → -
…… → ...API
calibrateEnhanced(text, confidence, script)
执行完整校准流程。
参数:
text: OCR 识别文本confidence: 原始置信度(0-1)script: 文字脚本(Hans/Hant/Latn/Jpan/Kore)
返回值: { text, confidence }
示例
typescript
const calibrator = getCalibrator()
const result = calibrator.calibrateEnhanced('这是一个测试', 0.7, 'Hans')
// { text: '这是一个测试', confidence: 0.84 }
// 原始 0.7,CJK 规则升权 1.2 → 0.84性能
- 时间复杂度:O(n),n 为文本长度
- 空间复杂度:O(n)