Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模式(regex)和找到的值之间的相似性_Java_Regex_Ocr_Error Correction - Fatal编程技术网

Java 模式(regex)和找到的值之间的相似性

Java 模式(regex)和找到的值之间的相似性,java,regex,ocr,error-correction,Java,Regex,Ocr,Error Correction,我有一个包含文本信息的图像,并且: 我从中提取/裁剪一个小图像 我正在使用OCR从小图像中提取文本 检查提取的值是否与模式匹配(浮动、日期…),如果匹配 我将值存储在数据库中 问题是:有时,ocr会提取一个包含一些符号的值,因此它与模式不匹配示例:对于模式日期,我有: 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 我想获得模式

我有一个包含文本信息的图像,并且:

  • 我从中提取/裁剪一个小图像
  • 我正在使用OCR从小图像中提取文本
  • 检查提取的值是否与模式匹配(浮动、日期…),如果匹配
  • 我将值存储在数据库中
  • 问题是:有时,ocr会提取一个包含一些符号的值,因此它与模式不匹配示例:对于模式日期,我有:

    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
    

    我想获得模式和提取的值之间的相似性(最近对其进行处理)有没有一种方法可以在不改变模式的情况下做到这一点?

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

    \\d+
    
    允许中间不包含数字的相同模式如下所示:

    (\\d\\D*)+
    
    随着图案越来越大,这种方法越来越难看,所以这种方法不是很好

    我建议将基于模式的匹配替换为实现

    原始的Levenshtein距离算法接受两个字符串,并返回为获得另一个字符串而需要对一个字符串进行的修改次数。您的算法应该采用字符串和模式。模式应该使用某种数字指示符(比如,
    #
    ),并将所有其他字符“按字面”视为字符串。当发送一个
    和任何数字时,您将修改算法中使用的指示器函数,使其返回零,否则返回
    1

    看看两个矩阵行的实现,它是最节省空间的。指示器功能在该行上实现:

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

    int cost = (s[i] == t[j] || (Character.isDigit(s[i]) && t[j] == '#')) ? 0 : 1;
    
    将允许您“匹配”数字。您的代码还可以在进行匹配之前删除字符串中的所有空白


    你可以通过检查Levenshtein距离来决定比赛的质量。距离为零表示完美匹配;一个或两个距离对于短模式是非常好的;五个或五个以上的距离可能是不可接受的。

    这实际上取决于OCR软件的准确性和扫描材料的质量。可能存在各种错误-添加了问号(不确定匹配,由OCR标记),字符不匹配-例如l或I而不是1,O或O而不是0,等等。我建议您允许对OCR材料进行一些预处理,然后尝试使用regexp进行解析。是的,这取决于它,但是我没有选择,我必须考虑一个与模式非常相似的值,即使它不匹配。在使用regexp模块处理之前,您是否可以允许您的客户编辑OCR模块识别的文本?另外,基本上,据我所知,OP询问是否有办法处理OCR软件中的错误/不确定匹配,并使用一些正则表达式来确定捕获的数据可能是:浮点、日期、数字等。我开始寻找某种数字的soundex算法,但你所建议的方法看起来是更好的方法。一个问题-是否可以对“噪声字符”采用Levenshtein距离算法?例如,额外的空格、问号、OCR识别为两个字符的一个符号等?@ZlatinZlatev是的,您也可以通过更改成本函数来实现这一点。例如,当输入具有常规字符时,您可以通过为
    cost
    指定更大的值(例如,5)来惩罚与“噪波”字符不匹配的代价小于与“实”字符不匹配的代价的“噪波”字符的不匹配,并为与“噪波”字符不匹配的
    1
    。您使用的示例(int cost)仅适用于模式int或短模式?@manu我不会使用模式来区分
    int
    short
    ——这是可行的,但太复杂了。我会识别一个没有符号或小数点的数字(实际上,这就是模式所代表的),然后试着看看它是否适合一个字节,然后是一个短的,一个int的,还是一个长的。你能举个例子吗?