3

问题是有一个包含大约 20k 客户记录的数据库,我想尽最大努力避免重复条目。数据库是 Microsoft SQL Server 2005,维护该数据库的应用程序是 Microsoft Dynamics/SL。我正在创建一个与该数据库交互的 ASP.NET Web 服务。我的服务可以将客户记录插入数据库、从中读取记录或修改这些记录。无论是在我的网络服务中,还是通过 MS Dynamics 或在 Sql Server 中,我都想在用户确认添加新记录之前给出可能匹配的列表。

所以用户会提交一条记录,如果它看起来是唯一的,记录会保存并返回一个新的ID。如果存在可能的重复,则用户可以重新提交并确认说:“是的,我看到了可能的重复,这是一条新记录,我想提交它”。

如果它只是一个标点符号或空格,这很容易(例如,如果您输入“Company, Inc.”并且数据库中有一个“Company Inc.”,但如果有轻微的变化,例如“Company Corp. ” 而不是“Company Inc”,或者如果有一个粗大的拼写错误,例如“Cmpany, Inc.”。是否可以在列表中返回类似的记录?如果绝对不可能,我会处理我的有。如果由于重复而需要合并记录,它只会导致更多的工作。

4

4 回答 4

5

哪种算法最适合您的具体细节在很大程度上取决于您的领域,因此我建议尝试一些不同的算法 - 您甚至可能需要组合一些以获得最佳结果。缩写,尤其是特定领域的缩写,可能也需要进行预处理或标准化。

对于名称,您可能最好使用语音算法- 考虑到发音。这些将使史密斯和施密特得分接近,因为他们在说这些话时很容易混淆。Double Metaphone是一个不错的首选。

对于胖指法,您可能最好使用编辑距离算法 - 它会在 2 个单词之间产生“差异”。这些将使 Smith 和 Smith 得分接近 - 即使 2 可能会通过语音搜索。

T-SQL 有 SOUNDEX 和DIFFERENCE - 但它们很差。Levenshtein变体是规范的选择,但还有其他不错的选择 -如果您找不到适当许可的实现,其中大多数在 C# 中相当容易实现。

所有这些都将比 T-SQL 更容易从 C# 编码/使用(尽管我确实在可能在 SQL 中工作的 T-SQL 的可怕滥用中发现了双重变位)。

尽管此示例在 Access 中(而且我从未真正查看过代码或使用过实现),但包含的演示文稿可以很好地了解您最终可能需要做什么。该代码可能值得一看,也许是 VBA 的一个端口。

于 2008-10-21T20:10:39.330 回答
1

查看SQL Server 中的SOUNDEXing 。我相信它会给你你正在寻找的可能匹配的模糊性。

声音@MSDN

声音@维基百科

于 2008-10-21T18:28:42.170 回答
1

如果可以将Lucene.NET集成到您的解决方案中,您肯定应该尝试一下。

于 2008-10-21T18:50:41.567 回答
0

您可以尝试使用带有 FreeText(或 FreeTextTable)功能的全文搜索来尝试查找可能的匹配项。

于 2008-10-21T18:32:03.257 回答