65.9K
CodeProject 正在变化。 阅读更多。
Home

使用正则表达式改进表单处理文本识别结果

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2010年5月31日

CPOL

7分钟阅读

viewsIcon

22061

成功的表单处理需要高准确度的识别率。使用正则表达式可以让识别引擎对预期返回的字符数量做出假设,从而提高识别结果。阅读本文以了解如何成功使用它们。

成功的表单处理需要高准确度的识别率。开发人员通常掌握有关其应用程序的信息,这些信息如果应用于识别过程,可以用于提高识别性能。改进识别的一种特定方法是提供预期结果的特定数据格式。了解预期格式使识别引擎能够从结果集中选择最佳匹配。这使识别引擎能够实现更高的准确性和更高的报告置信度。

表单处理应用程序中常用的一些典型字段格式包括货币金额、日期、时间、社会安全号码和/或纳税人识别号、电话号码、电子邮件地址和URL。一个使用示例是将预期字符模式格式应用于日期,这立即消除了“S”和“5”之间或“1”和小写“L”之间的任何潜在混淆。这种方法的好处显而易见。对于许多这些格式,使用正则表达式允许识别引擎对预期返回的字符数量做出假设,这再次提高了识别结果。

您可能需要查看此信息以了解有关正则表达式的更多信息,包括语法和逻辑应用。

正则表达式可能会变得非常复杂。一个简单的正则表达式可能无法捕捉所有有效值,或者可能允许一些无效值。一个复杂的正则表达式可能需要更多时间来处理,更容易出错,并可能带来维护问题。如果没有大量的源代码注释,一个复杂的正则表达式可能很难让其他开发人员理解,尤其是在它编写多年之后。您需要在表达式的复杂性和健壮性与处理所需的时间以及支持非常复杂的正则表达式的长期维护影响之间取得平衡。

正则表达式示例

您可以使用以下内容识别MM/DD/YYYY格式的日期,其中月份和日期可以是单个数字

“[01]?\d\/[0123]?\d\/\d{4}”

这将识别所有可能的有效日期,但也会识别无效日期

15/15/1995    0/34/2010      4/00/2000

为了获得有效月份结果,正则表达式将是

“((0?[1-9])|(1[012]))\/[0123]?\d\/\d{4}”

为了获得1到31之间的有效日期结果,正则表达式将是

“((0?[1-9])|(1[012]))\/((0?[1-9])|([12]\d)|(3[01]))\/\d{4}”

这仍然会识别一些无效日期,例如

4/31/2010

为了确保月份和日期正确关联,正则表达式将是

“((((0?[13578])|(1[02]))\/((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|
 
(10))\/((0?[1-9])|([12]\d)|30))|((0?2)\/((0?[1-9])|([12]\d))))\/\d{4}”

这仍然没有将非闰年的二月限制为28天,因此应使用以下内容

“(((0?[13578])|(1[02]))\/((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(10))\/((0?[1-9])|
([12]\d)|30))|((0?2)\/((0?[1-9])|(1\d)|(2[0-8]))\/\d{4})|(2\/29\/\d{2}(([02468][048])|
([13579][26])))”

这个正则表达式变得越来越复杂。它没有考虑年份能被100整除但不能被400整除的情况,这不应该是闰年(例如1900或2100)。

要支持除“/”之外的日期分隔符,还需要进一步的复杂性。例如,如果日期分隔符允许使用破折号或句点,您将看到以下正则表达式

“(((0?[13578])|(1[02]))(\/|\-|\.)((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(10))
(\/|\-|\.) ((0?[1-9])|([12]\d)|30))|((0?2) (\/|\-|\.)
((0?[1-9])|(1\d)|(2[0-8])) (\/|\-|\.)\d{4})|(2(\/|\-|\.)29(\/|\-|\.)\d{2}(([02468][048])|
([13579][26])))”

如果日期分隔符必须相同,以便支持3.12.2003但不支持3.12/2003,那么正则表达式可以是

“((((0?[13578])|(1[02]))\/((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(10))\/((0?[1-9])|
([12]\d)|30))|((0?2)\/((0?[1-9])|(1\d)|(2[0-8]))\/\d{4})|(2\/29\/\d{2}(([02468][048])|
([13579][26])))|(((0?[13578])|(1[02]))\-((0?[1-9])|([12]\d)|(3[01])))|
(((0?[469])|(10))\-((0?[1-9])|([12]\d)|30))|((0?2)\-((0?[1-9])|(1\d)|(2[0-8]))\-\d{4})|
(2\-29\-\d{2}(([02468][048])|([13579][26])))|(((0?[13578])|(1[02]))\.((0?[1-9])|
([12]\d)|(3[01])))|(((0?[469])|(10))\.((0?[1-9])|([12]\d)|30))|((0?2)\.((0?[1-9])|
(1\d)|(2[0-8]))\.\d{4})|(2\.29\.\d{2}(([02468][048])|([13579][26]))))”

如您所见,正则表达式可能会变得非常长和复杂。必须在更简单、易于理解的正则表达式和更具体地描述预期数据内容的复杂正则表达式之间进行权衡。

迭代正则表达式的使用

减少每个正则表达式复杂性的一种方法是有效地“堆叠”正则表达式的应用以达到所需的结果。可以解析字符串以获取足够的信息,以便将逻辑路由到其适当的下一个验证层(正则表达式)。在上面的示例中,我们可以解析分隔符,然后为每个预期的分隔符值适当地制作正则表达式。

这是一个带有多个分隔符的简单日期正则表达式

第一步:简单日期表达式

“((0?[1-9])|(1[012]))(\/|\-|\.)((0?[1-9])|([12]\d)|(3[01]))(\/|\-|\.)\d{4}”

我们现在知道我们符合日期的通用格式,并且提供的分隔符是可接受的分隔符。

为了测试所有分隔符是否具有相同的值,即所有斜杠或所有连字符,我们可以使用这个正则表达式

第二步:日期分隔符一致性表达式

“(\d*\/\d*\/\d*)|(\d*\-\d*\-\d*)|(\d*\.\d*\.\d*)”

我们现在知道日期中的分隔符具有相同的值。

如果一个字符串成功通过了简单日期表达式和日期分隔符一致性表达式,那么我们知道它符合日期的通用格式,它具有可接受的分隔符,并且分隔符具有相同的值。注意:我们尚未完全验证日期。

为了验证月份、日期和年份,我们可以使用

第三步:日期有效性表达式

“(((0?[13578])|(1[02]))(\/|\-|\.)((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(10))
(\/|\-|\.) ((0?[1-9])|([12]\d)|30))|((0?2) (\/|\-|\.)
((0?[1-9])|(1\d)|(2[0-8]))
(\/|\-|\.)\d{4})|(2(\/|\-|\.)29(\/|\-|\.)\d{2}(([02468][048])|([13579][26])))”

我们现在知道提供的数字生成了一个有效的日期。

通过结合使用更简单的正则表达式,我们可以实现精确验证或尽可能接近验证我们的数据,同时仍然拥有可维护的正则表达式。

在识别过程中使用正则表达式

在表单处理中,识别准确率对于成功至关重要,如果正则表达式的评估集成到识别过程中,将非常有益。向识别引擎提供预期数据格式允许识别系统利用该信息从多个可能的结果中更好地选择。

在尝试生成最准确的结果时,您可以使用OCR或ICR SDK。在任何OCR或ICR处理中,任何单个字符都可能存在备用值。很多时候,这些备用值是正确的结果。困难在于知道哪个备用值是最佳的。

许多OCR识别引擎使用语言词典来辅助选择最“有意义”的结果。在处理表单时,数据内容通常采用专门的格式,词典结果可能不适用。此外,一些专门的格式,如货币金额、日期、时间、社会安全号码、电话号码、电子邮件地址和URL,出现在许多表单上,并且可以通过正则表达式定义。表单经常使用零件号或序列号等字段,这些字段需要特定格式,并且可以通过正则表达式定义。将正则表达式集成到识别系统逻辑中可以提供最佳的准确性结果。

Accusoft Pegasus提供了SmartZone ICR/OCR SDK,该SDK支持将正则表达式直接集成到识别引擎中,从而提高表单处理识别结果。此外,这些SDK提供了预定义的预期格式,用于货币金额、日期、时间、社会安全号码和/或纳税人识别号、电话号码、电子邮件地址和URL。开发人员还可以通过使用自己的自定义正则表达式来增强预定义格式,这些正则表达式旨在支持其特定的格式要求。这创造了一种强大的组合,即通过格式信息增强的通用格式要求,并且只有通过对预期数据值的深入了解才能实现。SmartZone ICR/OCR使用集成到识别引擎中的正则表达式引擎,对可以通过正则表达式定义的数据实现最佳准确性。

下载并体验

下载SmartZone ICR/OCR SDK并使用您自己的表单体验正则表达式。

要查看SmartZone ICR/OCR SDK功能的完整列表并下载产品,请访问我们的网站www.accusoft.com

请通过info@accusoft.comsupport@accusoft.com联系我们以获取更多信息。

关于 Accusoft Pegasus

Accusoft Pegasus成立于1991年,公司原名为Pegasus Imaging,总部位于佛罗里达州坦帕市,是图像软件开发工具包 (SDK) 和图像查看器的最大供应商。其图像技术解决方案包括条形码、压缩、DICOM、编辑、表单处理、OCR、PDF、扫描、视频和查看。技术支持Microsoft .NET、ActiveX、Silverlight、AJAX、ASP.NET、Windows Workflow和Java环境。支持多种32位和64位平台,包括Windows、Windows Mobile、Linux、Sun Solaris、Mac OSX和IBM AIX。访问www.accusoft.com了解更多信息。

© . All rights reserved.