我正在开发一个进行OCR后处理的引擎,目前我在数据库中有一组组织,包括商会号码。
同样从OCR输出中我得到了可能的商会(COC)号码列表。
搜索最相似的最佳方法是什么?目前我正在使用Levenshtein Distance,但结果范围太大而且在大型数据库上我真的怀疑它的可行性。目前它是用Java实现的,数据库是一个MySQL数据库。
附注:荷兰的商会号码被定义为每个公司的8位数字,该系统的早期版本使用另外4位数字(0000,0001等)来表示一个组织,如今正在为这些人提供全新的COC号码。
COCNumbers的例子:
通过后处理确定的可能COCN数列表:
一些额外的说明:
我如何继续寻找一般的最佳匹配? (在这种情况下(13041611,KvK13041611)是最好的(而且更正确)匹配)
答案 0 :(得分:0)
在MySQL中专门进行这种匹配可能是个坏主意,原因很简单:没有办法使用正则表达式本地修改字符串。
根据我的经验(来自ISBN和其他图书识别数据),您将需要使用某种评分算法来实现这一目标。
这是程序性的 - 你可能需要用Java(或其他一些过程编程语言)来完成它。
表中是否找到了候选字符串?如果是,则得分1.0。
候选字符串“kvk”(不区分大小写)是否预先附加到表中找到的数字?如果是,则得分1.0。
候选字符串是否正确长度,并且在将小写字母L更改为1并将大写字母O更改为0后是否匹配?如果是这样,得分0.9
从开头或结尾修剪所有字母字符后,候选字符串的长度是否正确,是否匹配?如果是,则得分0.8。
执行第3步和第4步,如果匹配得分为0.7。
修剪开头和结尾的字母字符,如果匹配得分为0.6。
执行第3步和第6步,如果匹配得分为0.55。
得分最高的比赛获胜。
在这一系列步骤之后,目视查看那些不匹配的内容,看看是否可以辨别出另一种OCR垃圾或连锁垃圾的模式。也许你的OCR看到输入为“8”的“g”或其他可能的问题。
如果您匹配相同长度的子串,您可以尝试使用Levenshtein的距离来处理这些剩余的项目。它们的数量也可能足够少,您可以手动更正数据并继续。
另一种可能性:您可以使用Amazon Mechanical Turk购买众包劳工以解决一些疑难案件。