重复文本检测/散列

时间:2009-05-07 01:12:11

标签: python

我在数据库中有一组字符串。每个集合将少于500个成员,将有成千上万的集合,并且字符串是自然语言。我想检测每组中的重复字符串。新字符串将与现有集合进行比较,如果它们是唯一的,则会添加到数据库中。

是否有散列算法可以有效地找到(非常)相似的字符串?例如,字符串可能具有相同数量的单词,但编码可能略有不同(UTF-8与Latin-1)。

6 个答案:

答案 0 :(得分:3)

对于初学者,你应该做一些规范化。您应该将所有文本转换为单个编码(例如:UTF-8)。您可能还想进行大小写折叠,其他Unicode normalizations,也可能还要对每组进行排序(取决于您如何存储它们)。

从您的问题(我)不清楚您是想要找到完全匹配还是只是“相似”的字符串集。如果你只考虑标准化后你只关心完全匹配,那么你已经完成了很多工作。只需在字符串集的规范化形式上有一个索引,你也可以通过标准化来快速查找新集。

如果你想找到近似匹配,那么你可能想要做某种相似性散列。关于Locality Sensitive Hashing的维基百科文章描述了许多技巧。

许多这些技术背后的基本思想是在每个字符串h [0]到h [n]上计算一些非常有损的哈希值。要查找新的字符串集,您需要计算其哈希值并查看其中的每一个。任何得到至少一个匹配的东西都是“相似的”,越匹配就越相似(你可以选择什么阈值来减少)。

答案 1 :(得分:1)

如果数据库中只有500个字符串,也许您可​​以直接与每个字符串进行比较。首先转换为标准表示(比如UTF-16)。 Levenshtein distance可以比较两个字符串的相似性。

答案 2 :(得分:1)

简短的回答只是猜测一个好的哈希参数会与你的“相似”的想法相匹配。

可能只是所有字母(A)的总和以及相邻字母(B)之间的差异总和之类的东西都可行。对于每个新字符串,使用其A和B值快速查找现在小得多的相似字符串集,然后在这些字符串之间进行更仔细的比较。

这可能不是最纯粹的解决方案,但实际上,很多问题都是通过这种方式解决的。除此之外,我认为目前有很多工作可以解决遗传学中的类似问题(即在大型数据库中找到相似的基因序列),但我认为这个问题没有公认的通用解决方案。

答案 3 :(得分:1)

This post可能会引起我的博客的兴趣。

提供了算法的描述和代码的链接。简而言之,它是一种基于n-gram的方法,不对输入的内容或结构做出假设,并为所有输入文档生成恒定长度的签名。

答案 4 :(得分:0)

这可能有点矫枉过正,但您可能想尝试使用基于Python的NLTK (Natural Language Toolkit)

可能有用的一项功能是analyze sentence structure。当然,这可能会导致某些字符串被标记为重复,因为它们具有相同的语法结构,但具有不同的单词和含义。

您也可以使用概率和分类功能。

答案 5 :(得分:0)

你可能会疯狂并尝试潜在的语义分析/映射和奇异值分解: latent semantic mapping

SVDLIBC一起使用非常容易。

相关问题