我有下表2列:包含超过500,000条记录的ID和标题。例如:
ID Title
-- ------------------------
1 Aliens
2 Aliens (1986)
3 Aliens vs Predator
4 Aliens 2
5 The making of "Aliens"
我需要找到非常相似的记录,我的意思是它们相差3-6个字母,通常这种差异在标题的末尾。所以我必须设计一个查询,返回记录1、2和4。我已经看过levenstein distance,但我不知道如何应用它。另外,由于记录的数量,查询不应该花一整夜。
谢谢你的意见或建议
7条答案
按热度按时间eagi6jfj1#
如果你真的想用你在问题中表述的方式来定义相似性,那么你就必须实现Levensthein Distance计算,要么在代码中对DataReader检索到的每一行进行计算,要么作为SQL Server函数。
这个问题实际上比乍看之下要复杂得多,因为你不能假定知道两个字符串之间的"共有“元素可能是什么。
因此,除了Levensthein Distance之外,您可能还需要指定实际必须匹配的连续字符的最小数量(以便得出足够的相似性)。
总之:这听起来像是一个过于复杂和耗时/缓慢的方法。
有趣的是,在SQL Server 2008中,您可以使用DIFFERENCE函数来执行类似的操作。
它评估两个字符串的语音值并计算差值。我不确定你是否能让它在多词表达式(如电影标题)中正常工作,因为它不能很好地处理空格或数字,并且过于强调字符串的开头,但它仍然是一个值得注意的有趣 predicate 。
如果您 * 实际上 * 试图描述的是某种搜索功能,那么您应该研究一下SQL Server 2008的Full Text Search功能。它提供了内置的Thesaurus support、花哨的SQL predicates和“最佳匹配”排名机制
编辑:如果您正在寻找消除重复,也许您可以看看SSIS Fuzzy Lookup and Fuzzy Group Transformation。我自己没有尝试过这个,但它看起来是一个有希望的线索。
编辑2:如果您不想深入研究SSIS,并且仍然与Levensthein Distance算法的性能作斗争,那么您也许可以尝试一下algorithm,它看起来不那么复杂。
zkure5ic2#
对于所有遇到这个问题的谷歌人,虽然它已经被标记为已回答,但我想我应该分享一些代码来帮助解决这个问题。如果你能够在SQL Server上执行CLR用户定义函数,你可以实现自己的Levensthein Distance算法,然后从那里创建一个函数,给你一个名为
dbo.GetSimilarityScore()
的“相似性得分”。我的得分是基于大小写不敏感的。没有太多的权重混乱的词序和非字母数字字符。你可以调整你的评分算法需要,但这是一个很好的开始。信贷this code project link让我开始。1mrurvl13#
xhv8bpkk4#
根据你的提问,我想你要找的区别不应该超过原标题末尾的一个单词。这就是为什么1、2和4被返回的原因吗?
无论如何,我已经做了一个查询,检查末尾的差异由一个单词组成,没有空格。
希望能有所帮助。
esbemjvw5#
如果您使用的是sql server 2008,则应该能够使用fullTEXT功能。
基本步骤如下:
1)在列上创建全文索引。这将标记每个字符串(stremmers、splitters等),并允许您搜索“LIKE THIS”字符串。
免责声明是,我从来没有使用过它,但我认为它可以做你想要的。
从这里开始阅读:http://msdn.microsoft.com/en-us/library/ms142571.aspx
yfjy0ee76#
您可以尝试SSIS模糊分组,它会根据字符串匹配给予您打分。
ndasle7k7#
您也可以在Oracle中使用utl_match。enter link description here