提要:本文只是对 Evernote OCR 系统的简单介绍,没有涉及到具体的工程实践。


Evernote 搜索图像中的文字的功能很受欢迎。在本文中,我将描述这套处理系统是如何工作的并回答最常问到的问题。

图像是如何被处理的#

当笔记被发送到 Evernote 时(通过同步),笔记中包含的与 PNG,JPG 或 GIF 的 MIME 类型匹配的任何资源都将被发送到另一组服务器,这些服务器的唯一作业是在其上执行光学字符识别(OCR)。 提供图像并报告任何发现的内容。这些结果以隐藏的形式添加到笔记中,即在查看名为 recoIndexnote-metadata 属性时不可见。 将笔记导出为 ENEX 文件时,可以看到完整的recoIndex 节点。1

例如,我在我的帐户中翻出了一个旧笔记,其中只包含一张啤酒瓶的照片:

当我以 ENEX 文件的格式( Evernote 笔记使用的一种可移植的 XML 导出格式,导出这个笔记时),跳到文件的底部,我将这道 recoIndex 元素。

recoIndex 包含了一系列的 items 节点。每个 items 表现了代表了一个 Evernote OCR 系统认为含有文字的矩形区域。

每个 items 含有 4 个属性:xy 代表了项目左上角的坐标,wh 分别呆逼啊了 item 的宽度和高度。

在评估图像的文本内容是,一系列可能的匹配的集合作为子元素就被创建到了对应的 item 中。每个匹配包含了一个权重(有 item 中的 w 表示):一个标示给定匹配文本与图像中文本相同的可能性。

OCR 的结果会嵌入到笔记中,并同步会用户的客户端应用程序。此时,就能搜索图像中的文本了。

这是前面所示笔记中找到的 recoIndex 元素的一部分,它包含 itemt个匹配到的元素。 您会注意到大多数 item 元素都有多个 t 元素,每个元素都分配了我们之前描述的权重值。 当用户在 Evernote 客户端中发出搜索时,将搜索 t 元素的内容:

PDF 是如何被处理的#

Evernote 的 OCR 系统也能处理 PDF 文件,但是他们和图像有不同的处理方式。当一张 PDF 被处理,就会创建第二个含有识别到的文字的 PDF ,并被嵌入到含有原来的 PDF 的笔记中。第二个 PDF 对用户不可见并且仅仅是为了方便搜索而全在的。这也不计入用户的每月上传限额。

要使 PDF 有资格进行 OCR,必须满足特定要求

  1. 必须含有位图图像
  2. 不能含有可选文字(或至少,有个最小数量)

实际上,这消除了其他应用(文字处理器或其他的写作程序)从基于文本的格式生成的 PDF。扫描仪生成的 PDF 通常满足上述要求。如果扫描仪在 PDF 上执行了自己的 OCR,则 Evernote 就不会对其作处理了。

如果导出包含已由 OCR 系统处理过的 PDF 的笔记,则文档中将有两个节点 dataalternate-datadata 节点包含原始 PDF 的 base64 编码版本,alternate-data 表示相同的 PDF 的可搜索版本。

常见问题#

什么样的文字能被识别?#

OCR 系统认为是文字的任何东西都能被识别。打印的文本(街道标志或者海报)和手写笔记(即使您的字迹不是最好看的)都交给 OCR 系统进行评估,以便系统能识别他们。

文字的图像可是一个因素,如果图像在一定角度之内与下列方向之一匹配,则评估系统可以找到文字:

  1. 0° - 正常水平方向
  2. 90° - 垂直方向
  3. 270° - 垂直方向

与这些方向都不一致的文字将会被忽略掉(对角线方向和反转后的)。

记住重要的一点:没有 OCR 系统是完美的并且您的希望识别的文本也可能不是完美的。也就说,OCR 系统将不断更新以获得更好的准确率。

Can Evernote’s OCR be used to create a text version of an image that contains text?

不可以。如前所述,OCR 系统完成的匹配不会产生一对一的匹配。 相反,对于包含文本的给定矩形,通常会有几个可能的匹配,其中许多将是不精确的。

对一张图像做 OCR 处理需要多长时间?

当用户同步包含图像的笔记时,图像被发送到上述服务器组以进行 OCR 处理。 该系统是基于队列的,这意味着提交的图像在线排列,并将在队列之前的所有其他图像之后处理。 但是,高级用户同步的图像会在免费用户同步的所有图像之前移动到队列的前面。

至于需要多长时间,这取决于发送图像进行处理时队列的大小。 对于高级用户,图像处理通常在几分钟内完成(但在某些情况下可能需要更长时间)。 对于免费用户,如果处理队列中存在大量图像,则等待时间可以长得多。

Evernote 的 OCR 系统支持多少种语言?

目前 Evernote 的 OCR 系统支持 28 种语言的打印体和 11 个语言的手写体。新的语言会定期加入到系统中,已有的语言也会优化和提升。用户可以通过更改其帐户的“个人设置”中的“识别语言”设置来控制索引数据时使用的语言。

我能仅将 Evernote API 用于 OCR 图像吗?

不可以。Evernote 的 API 仅仅用于 OCR 违反了 API 许可协议

我在哪里可以了解更多关于为 Evernote 的 OCR 系统提供动力的基础设施?

我们已经在 Evernote 技术博客上发表了两篇文章,更详细地概述了识别架构和流程:


  1. 译者注:recoIndex 的技术标准,可以在这里找到 http://xml.evernote.com/pub/recoIndex.dtd ↩︎

  2. 译者注:链接已失效,存档见 Even Grittier Details on Evernote’s Indexing System ↩︎