问题:
有一组字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,但右边是第二个。 有什么建议吗?
答案 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_cost
和delete_cost
(例如,你可能会注意到,在OCR期间 - 某些角色比其他角色更容易消失)。
另外,如果上面的方法对你来说还不够,我建议你看Noisy channel model - 这是广泛用于拼写纠正的(这个主题在{{3中很好地描述) } - "第2周 - 拼写更正")。
答案 1 :(得分:1)
这似乎很难做到,因为误读的字符串不一定在文本上与输入相似,这就是为什么Levinshtein距离不适合你。这些词在视觉上被破坏了,而不仅仅是错误的。您可以尝试创建常见错误的数据集(o => 0,l - > 1,e => o)然后根据它进行某种比较。
如果您可以访问OCR算法,则可以在更广泛的输入集(具有已知输出)上再次运行该算法,并训练神经网络识别常见错误。然后,您可以使用该模型来预测原始数据集中的错误(对于仅有十个项目的数组,可能会出现过度杀伤)。