如何计算商会号码之间的相似度?

时间:2013-11-13 13:58:00

标签: java mysql similarity

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

同样从OCR输出中我得到了可能的商会(COC)号码列表。

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

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

COCNumbers的例子:

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

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

  • 102537177
  • 000450093333
  • 465111338098
  • NL90223l30416l
  • NL fl0737 D447B01
  • 12juni2013
  • IBANNL32ABNA0242244777
  • lncassantNL90223l30416l10000
  • KvK13041611
  • BtwNL fl0737 D447B01

一些额外的说明:

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

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

1 个答案:

答案 0 :(得分: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”或其他可能的问题。

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

    另一种可能性:您可以使用Amazon Mechanical Turk购买众包劳工以解决一些疑难案件。