OCR:加权Levenshtein距离

时间:2011-05-21 09:51:25

标签: ocr metrics levenshtein-distance

我试图用字典创建一个光学字符识别系统。

事实上,我还没有实现字典=)

我听说有基于Levenstein距离的简单指标,它考虑了不同符号之间的不同距离。例如。 ' N'和' H'彼此非常接近而且d(" THEATRE"," TNEATRE")应该小于d(" THEATRE"," TOEATRE" )使用基本的Levenstein距离是不可能的。

请帮我找一下这样的指标。

注意坦克。

3 个答案:

答案 0 :(得分:4)

这可能就是您要找的内容:http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance(并且链接中包含了一些工作代码)

<强>更新

http://nlp.stanford.edu/IR-book/html/htmledition/edit-distance-1.html

答案 1 :(得分:1)

这是一个例子(C#),其中“替换字符”操作的权重取决于字符代码之间的距离:

      static double WeightedLevenshtein(string b1, string b2) {
        b1 = b1.ToUpper();
        b2 = b2.ToUpper();

        double[,] matrix = new double[b1.Length + 1, b2.Length + 1];

        for (int i = 1; i <= b1.Length; i++) {
            matrix[i, 0] = i;
        }

        for (int i = 1; i <= b2.Length; i++) {
            matrix[0, i] = i;
        }

        for (int i = 1; i <= b1.Length; i++) {
            for (int j = 1; j <= b2.Length; j++) {
                double distance_replace = matrix[(i - 1), (j - 1)];
                if (b1[i - 1] != b2[j - 1]) {
                    // Cost of replace
                    distance_replace += Math.Abs((float)(b1[i - 1]) - b2[j - 1]) / ('Z'-'A');
                }

                // Cost of remove = 1 
                double distance_remove = matrix[(i - 1), j] + 1;
                // Cost of add = 1
                double distance_add = matrix[i, (j - 1)] + 1;

                matrix[i, j] = Math.Min(distance_replace, 
                                    Math.Min(distance_add, distance_remove));
            }
        }

        return matrix[b1.Length, b2.Length] ;
    }

您可以在此处查看其工作原理:http://ideone.com/RblFK

答案 2 :(得分:0)

为时已晚,但是下面的python软件包(我不隶属于)允许对所有Levenshtein编辑操作和ASCII字符映射等进行任意加权。

https://github.com/infoscout/weighted-levenshtein

pip install weighted-levenshtein

还有一个(也没有附属):

https://github.com/luozhouyang/python-string-similarity