缅甸联邦共和国,原名缅甸,是东南亚的一个国家,从1962年到2010年,缅甸一直被政变后上台的军政府统治,直至最近5年它才对外界开放,与其他国家建立了贸易与文化联系。
缅甸语由很多方言组成,但所有方言都共享一个核心字母表,该核心字母表主要用于正式文本和印刷媒体,有33个辅音和12个辅助字符,地区方言可能还使用其 他字符,完整列表大约有核心字母表的三倍大。幸运的是,我们的工作是识别使用流行的至少10点大小的缅甸3字体书写的标准缅甸文本,文本图像可以是灰度、 黑白或彩色的,分辨率至少有300dpi,下面是典型的缅甸文本样板:
用ABBYY OCR识别技术在电脑上阅读缅甸语
在项目初步阶段,我们必须实现75%的OCR准确度,最小目标准确度为94%。
缅甸脚本就是所谓的alphasyllabary,在这里每一个辅音字母也都传达“默认”元音声,其他元音声使用特殊字符和辅音上面、下面、前面、后面的变音符号甚至辅音周围的变音符号转录。
字母大多由半圆组成,因为在过去,文本都是写在棕榈叶上,很容易被直线切口损坏。
缅甸语是一种有声调的语言,有三个主要声调—高、低和嘎吱声,和两个次要声调—入耳调和降调。
由于声调也要在书写中进行转录,缅甸脚本实际上有两种可分辨的符号,可能放在主要字母上面、下面或同时放在主要字母的上面和下面,这两种层叠的可分辨系统给OCR软件带来了重大挑战,但不仅仅如此。
若要让事情变得更复杂,有些字母组合可以融合在一起形成新字符。
在大多数常规术语中,光学字符识别如雷贯耳。当OCR软件收到图像文件时,它会使用OCR技术执行一些初步处理,将图像转换为黑白文本并纠正看得见的扭 曲,接下来检测包含不同类型文本(标题、正文、脚注)、照片和表格的区域,文本块随后解析成行,行再到单词,单词再到字母,单个字母识别完成之后,文本将 自下至上重组,缅甸文本的图像处理和板块检测和大多数其他语言里的操作一样,但是检测文本行是一件棘手的事。
由于变音符号的丰富性,教电脑识别短文本行非常困难,这就是原因所在,我们的运算法则使用很多功能体现文本行,其中的一个功能是虚构的基线,所有主要字符都位于这个基线上,电脑需知道在哪里画一条基线,以便生成有关单个字符的合理假设。
电脑使用统计数据检测基本文本行,为了收集必要的数据,要观察构成字母的黑点生成的直方图上的峰值,在欧洲字母的直方图上,有三个清晰可见的峰值对应于基线和小写字母的高度:
然而在缅甸语中,文本行正常宽度以外的众多变音符号在直方图中导致额外的统计学上有意义的峰值,为此,我们的最初面向欧洲脚本的运算法则,无法正确地识别缅甸文本行的重要参数。
在下面的图形中,程序正确地检测到了前两行,但没有检测到第三行:
针对文本行检测运算法则,我们必须要做一些调整,让其同样适用于缅甸文本。
文本行检测到之后,我们开始寻找单词和字母之间的间隙,这一次,我们运用了水平直方图,将大的间隙假设为单词之间的空隙,小的间隙理解为字母之间的空隙,检测缅甸文本中的空隙几乎没有出现问题,不像泰语,几乎没有空隙。(我们的OCR技术可以识别泰语文本,多达200种其他语言)
将文本行划分为更小的片段之后,我们尝试将片段划分为单个字符,再一次在直方图上观察高峰和低谷值,低谷对应于字母之间的可能间隙,有些间隙可以很确定地检测到,有些则需要通过各种试探法进行验证。
以下图形展示了英语单词的直方图:
缅甸脚本中的大量半圆字符产生了很多“错误”高峰和低估,使得检测空隙变得更难,但是直方图法同样适用于缅甸语。
现在我们可以尝试识别单个字符,确切地讲是字母,字母就是字符的图形表现形式,但它不是一一对应的。在欧洲文本中,一个字母可能对应多个字符(比如大写的 “C”和小写的“c”属于同一个字母),且一个字符可能由多个字母传达(比如,字母“a”在不同的字体中可能由不同的字母表示)。
没有标准的字母列表,因此我们手动编译,为每个字母指定所有可能的字符,再在候选单词产生的时候将字母翻译成字符。
正如我们之前注意到的,缅甸脚本中存在大量可分辨的字符,其中很多可以与他们主字母融合形成新字符:
如果某个变音符与其字母分离,我们先识别该字母,然后识别变音符,最后结合识别结果获获取新字母。如果某个变音符和其字母形成不可分割的单元,我们会尝试整体识别。
融合字符在缅甸书写系统中如此普遍以至于我们不得不提升技术以识别3500种新字母,这远远超过我们通常添加新语言的工作量。
字母识别完成之后,必须将其翻译成Unicode字符,然后组成单词。该过程对于欧洲语言相当简单,只需一个一个识别字符然后翻译为Unicode,但针对缅甸融合字符,则需要特别对待。
在翻译字符过程中有一个特定的正确顺序,在这个顺序中缅甸字母必须通过键盘输入,这样Windows才能将它们连接起来,有些字符必须在其他所有字符输入之后再进行输入,这样Windows才能在划分音节一开始将它们放置在正确的位置。
例如:在文本编辑器中键入下面这个单词:
用户必须按照字符的下面顺序键入字符:
我们已在我们的技术中加入了特殊修正后模块,确保结果单词遵从这些键入规则,所有文本都识别完成之后,模块再次阅读识别的文本,检查字符顺序是否正确,缅甸语是一种结构非常好的语言,有足够的正式规则支持这些检查。
完成此项目花了我们4个月时间,最终识别准确度高达97%(客户要求至少94%),未来应该会实现识别更多的缅甸语字体。