如何在tesseract的ocr()中限定或优先识别指定词汇?
解决Tesseract OCR限制/优先识别指定词汇的方案
一、严格限制仅识别指定词汇池
通过Tesseract的配置参数关闭系统词典,仅加载自定义词汇文件,强制OCR只识别词汇池中的内容。
步骤:
- 将词汇池写入文本文件(每行一个词)
- 创建自定义配置,禁用系统词典并指定自定义词汇文件
- 调用
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
相关产品推荐
相关产品推荐

