OCR和真正的字符串相似性

时间:2014-05-27 04:11:03

标签: algorithm

问题:

有一组字S = {W1,W2 ... Wn},其中n

现在我们有一个单词W,它是原始集合S的成员。现在我需要和algorythm,给定W和S',返回S'中单词的索引。最类似于W。

实施例。 S是{" alpha"," bravo"," charlie"},S'例如{" alPha"," hravc"," onarlio"}(这些是真正可能的ocr erros)。

所以目标函数应返回F(" alpha")=> 0,F(" bravo")=> 1,F(" charlie")=> 2

我尝试了Levenshtein距离,但是效果不好,因为它在小字符串上返回小数字,而OCRed字符串可能比原始字符串长。 如果W'是{' hornist',' cornrnunist'}而且给定的词是'共产主义者'' Levenshtein距离对于两个单词都是4,但右边是第二个。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

作为零方法,我建议您使用Levenshtein距离算法的修改以及替换/删除/添加字符的条件成本:

Distance(i, j) = min(Distance(i-1, j-1) + replace_cost(a.charAt(i), b.charAt(j)),
                     Distance(i-1, j  ) + insert_cost(b.charAt(j)),
                     Distance(i  , j-1) + delete_cost(a.charAt(i)))

您可以通过这种方式实现函数replace_cost,它将返回视觉上相似字符的小值(以及视觉上不同字符的高值),例如:

// visually similar characters
replace_cost('o', '0') = 0.1
replace_cost('o', 'O') = 0.1
replace_cost('O', '0') = 0.1
...

// visually different characters
replace_cost('O', 'K') = 0.9
...

类似的方法可以用于insert_costdelete_cost(例如,你可能会注意到,在OCR期间 - 某些角色比其他角色更容易消失)。

另外,如果上面的方法对你来说还不够,我建议你看Noisy channel model - 这是广泛用于拼写纠正的(这个主题在{{3中很好地描述) } - "第2周 - 拼写更正")。

答案 1 :(得分:1)

这似乎很难做到,因为误读的字符串不一定在文本上与输入相似,这就是为什么Levinshtein距离不适合你。这些词在视觉上被破坏了,而不仅仅是错误的。您可以尝试创建常见错误的数据集(o => 0,l - > 1,e => o)然后根据它进行某种比较。

如果您可以访问OCR算法,则可以在更广泛的输入集(具有已知输出)上再次运行该算法,并训练神经网络识别常见错误。然后,您可以使用该模型来预测原始数据集中的错误(对于仅有十个项目的数组,可能会出现过度杀伤)。