繁体   English   中英

相似数据算法

[英]Similar Data Algorithm

我有几个用户信息数据库,每个数据库10k-20k条目,每个数据库来自几个不同的来源,并且每个数据库都在不断增长。 我正在寻找一种可以在一定公差范围内注意到相似电子邮件或相似名称(first +''+ last)的工具。 我正在运行一个MySQL数据库,并且可以与C ++或PHP一起运行比较。 谁能建议任何现有的解决方案/教程,让我可以对数据库或数据数组进行检查并返回可能的重复项? 我只希望它能解决一些常见错误,例如:

josh@test.com <> josh@test.test.com <> jash@test.com
Josh O <> josh t O <> Joshua O

也许可以将公差调整到条目之间一定数量的字符差异之内? 非常非常感谢您提供的任何建议或解决方案,Google谷歌搜索并没有取得多少成功。

我有一些好消息给您,也有一些可怕的消息给您。

好消息是PHP具有一些算法的实现,可以比较内置的字符串:

它还有两种相对流行的方法,可以将英语单词分解为更适合比较的简单表示形式:

虽然这是个好消息,但可怕的消息是,如果使用10-20k条目,则需要使用前两个选项来进行接近一个半公吨的比较,而它们并不是出色的表演者。 我不太确定big-O表示法是什么,但是我认为它在O(run away)范围内。

使用后两个函数预先计算相似性分解,然后对所得数据使用某种分组操作可能会证明是主要的性能并节省了时间。

那将取决于您的“相似性”概念。 如果要查找必须插入,删除或替换的字符数,才能将一个字符串转换为另一个字符串,该算法称为Levenshtein distance 但是请注意,长字符串会非常慢(因为每个比较都使用与mn成正比的许多运算,其中mn是要比较的字符串的长度),但是如果您的数据是电子邮件地址,并且其他短字符串,则应该没问题(最大的问题是比较数,因为您需要将每对字符串相互比较)。

给定最大字符距离,这听起来像是bitap算法的工作(Wu和Manber,“快速搜索有文本错误”) 这是agrep程序的核心算法,当可接受的字符错误数受到限制时,它可能会非常快。 可以在此处找到Google以几种语言的库形式的实现 (仅用于近似匹配的代码相对较短,并且有据可查。)

您仍在将O(n 2 )作为电子邮件与电子邮件比较的总数(对于20k电子邮件为〜400M)。 但是,良好的比较功能(如bitap)的良好实现应有助于减少常数。 您还可以根据长度将电子邮件分为几组,并且仅在大小差异不大的组之间匹配电子邮件(例如,如果您的容忍度是3个字符的差异,则是将任何10个字符的电子邮件与任何20个字符的电子邮件进行比较是毫无意义的。) 如果您有多核计算机,那么您还应该能够并行化比较。 同样,这些都是常量的减少,而不是顺序的减少,但是我猜想,在一台快速的计算机上良好的C ++实现可以在几分钟之内完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM