Skip to content

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)

Released under the MIT License.