【发布时间】:2013-01-12 02:09:15
【问题描述】:
我有以下问题:
我正在寻找相似之处。因此,我有一个包含 200000 个条目的大源表和包含 10000 个条目的第二个表。现在我正在为每个表检索一个条目集,并将源表中的每一行与 java 中第二个表中的每一行进行比较(我正在使用一些 NeedleMan Gotoh 算法和类似的更复杂的算法)。这意味着要进行 10 亿次比较,这实在是太多太慢了……
目标是具有所有相似性的表(来自源表的 id、来自第二个表的 id 和相似性值)或至少类似于每个条目的最佳匹配(或最佳 x 匹配)...
谁能给我一些建议,让我在“正常”时间进行此类计算?
编辑
主表
---+------+-------------+---------+-------+
id | name | address | country | plz | ...
---+------+-------------+---------+-------+
20 | Sony | Main Str. 1 | US | 10000 |
---+------+-------------+---------+-------+
第二张桌子
---+------+-------------+---------+-------+
id | name | address | country | plz | ...
---+------+-------------+---------+-------+
30 | Soni | MainStr. 1 | US | 10000 |
---+------+-------------+---------+-------+
目标(相似度表):
---+---------------+--------------+-----------+
id | id_source_tbl | id_second_tbl| similarity|
---+---------------+--------------+-----------+
1 | 20 | 30 | 0.99 |
---+---------------+--------------+-----------+
simil_value 是一个值,表示源表中的公司与第二个表中的公司相同的可能性有多大
结果表明,这两行代表同一家公司...这两个条目只是因为小错别字而不同...(0.99 是相似度并且非常高 => 公司是相同的) 相似度是用 needleman wunsch gotoh 算法计算的(比较 char 和 char 并考虑在字符串中的位置等等......拼写错误应该导致高相似度值)
【问题讨论】:
-
请发布您的表格结构
-
你不能让 MySQL 为你“预计算”一些数据,而不是用 Java 做所有事情吗?
-
其实一开始,这不是问题... 20亿次计算,即使每个人在1ms内完成,也需要大约23天...所以首先我得想办法为了避免其中一些计算...我还没有这个想法,但是...
-
@prom85 我们需要有关计算的更多信息。我建议在问题中的表格中添加一些示例数据集,并举例说明结果应该是什么样的
-
无论如何,这些都是二次或三次算法,在任何两对之间,其中 N 是每个字符串的长度,并且您通过将 200,000 个项目与 100,000 个项目进行比较来添加另一个 O(N2)其他项目。所以性能将是 O(N4) 或 O(N**5)。你在这里给自己设置了一个相当不可行的问题。