You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在tesseract的ocr()中限定或优先识别指定词汇?

解决Tesseract OCR限制/优先识别指定词汇的方案

一、严格限制仅识别指定词汇池

通过Tesseract的配置参数关闭系统词典,仅加载自定义词汇文件,强制OCR只识别词汇池中的内容。

步骤:

  1. 将词汇池写入文本文件(每行一个词)
  2. 创建自定义配置,禁用系统词典并指定自定义词汇文件
  3. 调用ocr()时传入该配置

代码示例:

# 定义词汇池
words_pool <- c("APPLE", "BANANA", "ORANGE")
# 将词汇写入文本文件
writeLines(words_pool, "custom_words.txt")

# 创建自定义配置
strict_config <- tesseract::tesseract_options(
  load_system_dictionary = FALSE,  # 关闭系统词典
  user_words = "custom_words.txt"  # 指定自定义词汇文件路径
)

# 执行OCR
text <- tesseract::ocr(img, config = strict_config)

# 验证结果是否全部来自词汇池
all(unlist(strsplit(text, "\\s|\n")) %in% words_pool)

二、优先识别指定词汇池

如果严格限制过于苛刻,可以保留系统词典,但让Tesseract优先考虑词汇池中的词汇,适用于允许少量非池词汇但希望优先匹配目标词的场景。

代码示例:

# 复用之前的custom_words.txt文件
priority_config <- tesseract::tesseract_options(
  user_words = "custom_words.txt"  # 仅添加自定义词汇,不关闭系统词典
)

text <- tesseract::ocr(img, config = priority_config)

三、后处理修正(变通方案)

如果上述配置无法满足需求,可以先执行普通OCR,再通过字符串匹配将结果修正为词汇池中的最相似词汇,适合词汇池规模较小的情况。

代码示例:

# 定义后处理函数
magic_stuff <- function(raw_text, accepted_words) {
  # 分割OCR结果为单个 token
  tokens <- unlist(strsplit(raw_text, "\\s|\n"))
  # 对每个token替换为词汇池中最相似的词
  corrected_tokens <- sapply(tokens, function(tok) {
    if (tok %in% accepted_words) return(tok)
    # 计算编辑距离,找最相似的词
    dists <- adist(tok, accepted_words)
    accepted_words[which.min(dists)]
  })
  # 合并修正后的token
  paste(corrected_tokens, collapse = " ")
}

# 执行OCR并修正
text <- tesseract::ocr(img) |> magic_stuff(accepted_words = words_pool)

# 验证结果
all(unlist(strsplit(text, "\\s|\n")) %in% words_pool)

方法优缺点对比

  • 严格限制方案:完全确保输出仅来自词汇池,但可能因图片质量差导致有效词汇无法被识别(返回空或错误)。
  • 优先识别方案:兼顾灵活性与准确性,优先匹配目标词汇,同时保留系统词典作为后备,但仍可能出现非池词汇的错误识别。
  • 后处理修正方案:无需修改OCR配置,通过代码逻辑强制修正结果,依赖字符串匹配的准确性,适合词汇池较小的场景。

内容的提问来源于stack exchange,提问作者LulY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:10:19