0

我正在开发一个进行 OCR 后处理的引擎,目前我在数据库中有一组组织,包括商会编号。

同样从 OCR 输出中,我有一个可能的商会 (COC) 号码列表。

搜索最相似的最佳方法是什么?目前我正在使用 Levenshtein Distance,但结果范围太大了,在大型数据库上我真的怀疑它的可行性。目前它是用Java实现的,数据库是MySQL数据库。

旁注:荷兰的商会编号被定义为每个公司的 8 位数字,该系统的早期版本使用另外 4 位数字(0000、0001 等)表示组织的成立,如今,正在为这些人提供全新的 COC 编号。

COCNumber 示例:

  • 30209227
  • 02045251
  • 04087614
  • 01155720
  • 20081288
  • 020179310000
  • 09053023
  • 09103292
  • 30039925
  • 13041611
  • 01133910
  • 09063023
  • 34182B01
  • 27124701

通过后处理确定的可能的 COCNumber 列表:

  • 102537177
  • 000450093333
  • 465111338098
  • NL90223l30416l
  • NLFL0737D447B01
  • 2013 年 6 月 12 日
  • IBANNL32ABNA0242244777
  • lncassantNL90223l30416l10000
  • KvK13041611
  • 顺便说一句,NLFL0737D447B01

一些额外的注意事项:

  • 后处理从发票中提取单词和单词组,并将这些单词组连接成一个字符串。(一个词组就是说,一组词,通常用它们之间的空格来表示)。
  • 后处理为COC编号的条件如下:长度8位以上,内容一半为数字,字母数字。
  • 通过后处理确定的可能的 COCNumber 数量相对较少。
  • 数据库本身可以变得非常大,多达 10.000 条记录。

一般来说,我将如何继续找到最佳匹配?(在这种情况下 (13041611, KvK13041611) 是最好的(而且是正确的)匹配)

4

1 回答 1

0

仅在 MySQL 中进行这种匹配可能是一个坏主意,原因很简单:无法使用正则表达式来本地修改字符串。

根据我的经验(来自 ISBN 和其他书籍识别数据),您将需要使用某种评分算法才能做到这一点。

这是程序性的——您可能需要用 Java(或其他一些程序性编程语言)来完成。

  1. 是否准确地在表中找到了候选字符串?如果是,得分 1.0。

  2. 候选字符串“kvk”(不区分大小写)是否准确地添加到表中找到的数字前面?如果是这样,得分 1.0。

  3. 候选字符串的长度是否正确,将小写 L 变为 1,将大写 O 变为 0 后是否匹配?如果是这样,得分 0.9

  4. 从开头或结尾修剪所有字母字符后,候选字符串的长度是否正确,是否匹配?如果是这样,得分 0.8。

  5. 执行第 3 步和第 4 步,如果匹配得分为 0.7。

  6. 修剪开头和结尾的字母字符,如果匹配分数为 0.6。

  7. 执行第 3 步和第 6 步,如果您得到匹配分数 0.55。

  8. 得分最高的比赛获胜。

  9. 直观地查看在这组步骤之后不匹配的那些,看看您是否可以辨别出另一种 OCR 垃圾或连接垃圾的模式。也许您的 OCR 看到输入为“8”的“g”或其他可能的问题。

如果您匹配相同长度的子字符串,您可以尝试使用 Levenshtein 的距离来处理这些剩余的项目。它们的数量也可能足够少,您可以手动更正数据并继续。

另一种可能性:您也许可以使用 Amazon Mechanical Turk 购买众包劳动力来解决一些疑难问题。

于 2013-11-13T14:52:28.867 回答