Evernote 手写辨识解密!从拉丁语系到中日韩手写
作者: Evernote Taiwan 发布日期: 01 五月2014
加上近期新增的中文,Evernote 目前已经可以检索24 种语言文字。每次我们新增一种,就会针对它独特的结构所产生的技术难题作修正。
这次我们着手进行中、日、韩三种语言手写,这些语言需要两套更广泛的符号支援,每一种都相对复杂。例如,它们的手写文字在单词与单词之间不需要留空格、草书等等,都让上下文在诠释时变得更重要。
在我们进入中日韩手写辨识之前,先来回顾一下拉丁语系的书写辨识有哪些要克服的挑战。首先,我们的辨识引擎必须判断是否为手写文字,第一步是找到特定的文字线条… 这已经相当不简单。来看一个例子:
所谓的线条有可能是弧线,不同线条也有可能叠在一起,当然每个线条之间的距离不可能一致。这时候就需要靠线条分割演算来排除意外的关联性。
识别出线条之后,下个挑战就是如何分辨不同的字。如果是印刷体文字那还算简单,因为字与字之间的距离一致;但如果是手写,很多情况下不可能只依距离去评判是符号或是文字区块:
这时能帮上忙的就是书写内容。透过解析文字,即可知道开始与结尾的地方。然而这需要全面并且有意义地识别每个线条,而非如同一般的OCR 光学搜寻引擎直接的逐字解析。即使是欧语系文字,辨识手写文字的过程也跟中日韩三种文字相差不远。举韩文为例:
我们必须一致追踪每个线条,拆出可能的交叠部分。当线条被独立拆解出来之后,就不必透过间距来做语法判断。至于欧语系手写,我们的解决方案则是在同一个演算法中进行文字辨识和语法分析,透过已经解读出来的文字分出段落。
紧接着来看符号释义的过程吧:我们会先评估每个字可能从哪个位置起头。某些线条遇到特定的连结符号和草写的时候,空白区域可能会比较少。此时我们必须先过度分割,在任何可能的位置上放较多的分隔点— 在此阶段我们还是无法判断分隔点是否正确分出不同的文字,还是它不巧座落在同一个文字里面:
为了要组合这些符号,我们会尝试组成较大的文字群组,从中判断每种组合。下图就是引擎判断首两个符号的组合可能:
当然,这代表我们必须通过更多的组合来判断。在中日韩语言里,因为组合可能相对地多,识别所需的时间也会比拉丁语系长。我们的辨识核心是SVM (“Support Vector Machine”) 决策引擎,它会针对特定的符号比对其他的任何可能性。
假设我们需要50 台SVM 引擎来辨识英文(所有拉丁字母与符号),为了要支援最常见的中文符号我们要3,750 台引擎才能办到。因此除非我们想出一个方法只运转少部份的引擎,否则整体速度会足足降低75 倍。
我们的解决方案是启⽤较简易快速的SVM 引擎,让它们针对符号选择一群相似的手写文字。这个方法让我们在全部的字元中抓到5-6 %,让整体的辨识过程加速20 倍。
为了决定哪一些解读适合进入下个阶段,我们会参考不同的语言模型— 透过上下文解读并判别意义。此释义过程从最简单的二元符号组合开始,接着提高标准到常见的三元符号,一直到字典文字与已知的样式,例如日期、电话号码、电子邮件地址等。接下来是当这些建议的字跟典型样式放在一起的各种组合。在我们深入衡量所有可能性之前,不可能会得知哪一种解读最恰当。这就好比当年电脑「深蓝」与西洋棋棋王Kasparov 对决的时候,它必须分析任何一种可能的棋步;我们唯有经过数百万种的评估之后,才有可能提出最理想的释义结果。
一旦线条获得最佳的诠释之后,便可判定不同的字群了。下图的绿色方格显示的是系统产生的最佳字群切割:
现在,诚如你所看到的,欧洲语系和中日韩手写的辨识过程其实非常相似!
网友评论