使用 Tesseract 从 PDF 解析带有特殊字符的文本的一般方法?

General approach to parsing text with special characters from PDF using Tesseract?

我想摘录书中的定义The Navajo Language: A Grammar and Colloquial Dictionary by Young and Morgan。它们看起来像这样(非常模糊):

我通过 Google Cloud Vision API 尝试了 运行 它并得到了不错的结果,但它不知道如何处理这些带有重音符号的“特殊”字母它们,或卷发和线条 on/through 它们。而且由于模糊(没有其他 PDF 来源),其中很多都是错误的。所以我正在考虑在 Tesseract 中从头开始。注意 term 是粗体,definition 不是粗体。

我如何使用 Node.js 和 Tesseract 基本上得到一个 JSON 对象的数组,有点像这样:

[
  ...
  { "term": "'odahizhdoojih, yo/o/", "definition": "they will carry ..." },
  ...
]

term 的细节在这里不是很重要(我将用 unicode 编码),我主要想知道 Node.js 的架构应该如何做这个,我应该如何正确地训练这个系统?我是否需要截取单词的屏幕截图并以某种方式使用手动注释对其进行训练?这在这种情况下通常如何工作?

相关:

  • Tesseract training for a new font

Tesseract 采用 lang 变量,您可以扩展该变量以包含不同的语言(如果已安装)。我使用了 UB Mannheim (https://github.com/UB-Mannheim/tesseract/wiki) 安装,其中包括大量支持的语言。

为了获得更好更准确的结果,最好的办法是在将图像交给 Tesseract 之前对其进行处理。设置一个 white/black 阈值,以便在没有阴影的情况下在白色背景上显示黑色文本。我不确定如何在 Node 中执行此操作,但我已经使用 Python 的 OpenCV 库完成了。

如果开箱即用的字体无法为您带来不错的效果,那么您需要自己训练,是的。此博客 post 详细介绍了该过程:https://towardsdatascience.com/simple-ocr-with-tesseract-a4341e4564b6。它围绕着使用 jTessBoxEditor 手动标记您正在使用的图像中检测到的对象。

编辑:简而言之,训练自己的过程:

  1. 安装 jTessBoxEditor (https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/)。还需要 Java 安装运行时。
  2. 收集你的训练图像。他们想成为 .tiffs。我发现我得到了相当准确的结果,没有很多图像具有我想要检测的所有字符的良好样本。也许 30/40 图像。这很乏味,所以您不想做太多,但需要足够多才能获得良好的采样。
  3. 使用 jTessBoxEditor 将所有图像合并为一个 .tiff
  4. 创建训练标签文件 (.box)j。这是通过 Tesseract 本身完成的。 tesseract your_language.font.exp0.tif your_language.font.exp0 makebox
  5. 现在您可以在 jTessBoxEditor 中打开盒子文件,您会看到 how/where 它检测到了字符。边界框和它看到的字符。繁琐的部分:手动修复所有边界框和字符以准确表示图像中的内容。不是开玩笑,这很乏味。播放一些电视剧集,然后翻阅它。
  6. 训练 tesseract 模型本身
  • 保存一个文件:font_properties谁的内容是font 0 0 0 0 0
  • 运行以下命令:

tesseract num.font.exp0.tif font_name.font.exp0 nobatch box.train

unicharset_extractor font_name.font.exp0.box

shapeclustering -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.tr

mftraining -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.tr

cntraining font_name.font.exp0.tr

你应该在接近尾声的地方看到一些如下所示的输出:

Master shape_table:Number of shapes = 10 max unichars = 1 number with multiple unichars = 0

形状的数量应该大致是您提供的所有图像文件中存在的字符数。

如果一切顺利,您应该会创建 4 个文件:inttemp normproto pffmtable shapetable。用之前的 your_language 前缀重命名它们。所以例如your_language.inttemp

然后运行:

combine_tessdata your_language

文件:your_language.traineddata是模型。将其复制到 Tesseract 的数据文件夹中。在 Windows 上,它会像:C:\Program Files x86\tesseract.0\tessdata 而在 Linux 上,它可能像 /usr/shared/tesseract/4.0/tessdata.

然后当你运行 Tesseract时,你将通过lang=your_language。当我仍然通过一种现有语言时,我发现了最好的结果,所以就像我的东西一样,我抓住的仍然是英语,只是有趣的字体。所以我仍然想要英语,所以我会通过:lang=your_language+eng.