我正在尝试开发一种获取具有多个属性的实体并在数据库中搜索类似实体的方法(以尽可能正确的顺序匹配尽可能多的属性)。这个想法是它会返回它的相似程度的百分比。
还应考虑属性的顺序,因此开头的属性比最后的属性更重要。
例如:
项目1 - A,B,C,D,E
项目2 - A,B,C,D,E
将是100%匹配
项目1 - A,B,C,D,E
项目2 - B,C,A,D,E
这不是一个完美的匹配,因为属性的顺序不同
项目1 - A,B,C,D,E
第2项 - F,G,H,I,A
将是一个低匹配,因为只有一个属性是相同的,它位于第5位
此算法将运行成千上万条记录,因此需要具有高性能和高效率。有关如何以快速有效的方式在PHP / MySQL中执行此操作的任何想法?
我正在考虑levenshtein但据我所知,这也会考虑拼写方面两个完全不同的单词之间的距离。除非我只是以错误的方式使用它,否则似乎不适合这种情况。
可能只能在MySQL中完成,可能使用全文搜索等。
这似乎是nice solution,虽然不是针对这种情况设计的。也许二元比较可以用某种方式?
答案 0 :(得分:2)
我要做的是将订单和属性值编码为数字。数字具有快速比较的优势。
这是一个普遍的想法,可能仍然需要一些工作,但我希望它会有所帮助。
为每个属性计算一个数字(某种形式的哈希),并将代表项目属性的出现顺序的数字乘以。
说item1有3个属性A,B和C.
散列(A)= 123,散列(B)= 345,散列(C)= 456
然后将它乘以出现的顺序,假设我们有一定数量的属性:
(hash(A)* 1,000,00)+(hash(B)* 1,000)+(hash(C)* 1)= someval
可以调整倍频的幅度以反映您的数据集。你必须确定哈希函数。 soundex也许?问题现在由于哈希冲突而缩小为唯一性问题,但我们可以非常确定不匹配的属性。
另外,通过使用乘数的大小从生成的数字中提取哈希值,这将具有相对容易检查属性是否以不同顺序出现在另一个项目中的优势。
HTH。
编辑:检查匹配的示例
给定item1(a b c)和item2(a b c)。项的计算哈希值相等。这是最好的情况。无需进一步计算。
给定item1(a b c)和item2(d e a)。计算的项目哈希值不相等。继续打破财产哈希...
表示属性的哈希表a = 1,b = 2,c = 3,d = 4,e = 5,乘数为10 ^ n。 item1的计算哈希值为123,项目2为451,分解每个属性的计算哈希值,并比较每个item1(变为item1(1 2 3))和item2(变为item2(4 5 1)的属性的所有组合。 ))。然后计算得分。
另一种看待它的方法是逐个比较属性,除了这次,你正在玩数字而不是实际的字符串值
答案 1 :(得分:1)
您可以从sequence alignment等各种Smith-Waterman算法中汲取灵感(或展平算法)。实际上你正在寻找的东西似乎是对序列比对的描述。但是,我不确定是否可以将其作为SQL查询执行。