模式(正则表达式)与找到的值之间的相似性

时间:2014-05-13 14:59:36

标签: java regex ocr error-correction

我有一个包含文字信息的图片,并且:

  1. 我从中提取/裁剪一个小图片
  2. 我正在使用OCR从小图片中提取文字
  3. 检查提取的值是否与模式(浮点数,日期...)匹配(如果是)
  4. 我将值存储在数据库中
  5. 问题是:有时 ocr 会提取一个带有一些符号的值,因此它与模式示例不匹配:对于模式日期我有:< / p>

    pattern = "(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d"
    

    图片中的值是

    12/02/2014
    

    但是OCR提取了:

    12? /02 -2014
    

    我希望得到模式与提取的值之间的相似性(最近对其进行处理)有没有办法在不改变模式的情况下做到这一点?

1 个答案:

答案 0 :(得分:3)

特定的正则表达式不能用于匹配具有歧义的模式,而不进行允许这种歧义的修改。例如,如果您希望允许在匹配的字符串的任意位置插入额外的字符,则正则表达式模式需要具有多个这些任意字符的规定。这使得模式很快变得丑陋:例如,匹配int的模式非常简单,

\\d+

允许其间非数字的相同模式如下所示:

(\\d\\D*)+

随着模式变大,这变得更加丑陋和丑陋,所以这种方法不是很好。

我建议使用实现Levenshtein distance变体的算法替换基于模式的匹配。

原始的Levenshtein距离算法需要两个字符串,并返回需要对一个字符串进行修改的次数才能获得另一个字符串。你的算法应该采用字符串和模式。模式应该使用某种数字指示符(例如,#)并将所有其他字符&#34;字面上的&#34;视为字符串字符。您可以修改算法中使用的指标函数,在发送#任何数字时返回零,否则1。 / p>

看一下两个矩阵行的实现,它是最节省空间的。指标功能在此行上实现:

var cost = (s[i] == t[j]) ? 0 : 1;

将其更改为

int cost = (s[i] == t[j] || (Character.isDigit(s[i]) && t[j] == '#')) ? 0 : 1;

允许你匹配&#34;数字。在进行匹配之前,您的代码也可以从字符串中删除所有空格。

您可以通过检查Levenshtein距离来决定比赛的质量。零距离表示完美匹配;对于短图案,一两个距离非常有用;五个或更多的距离可能是不可接受的。