用于字符串相似性的 Python 摘要/哈希

Posted

技术标签:

【中文标题】用于字符串相似性的 Python 摘要/哈希【英文标题】:Python digest/hash for string similarity 【发布时间】:2012-01-13 10:22:07 【问题描述】:

我正在寻找一种算法,它可以从较长的字符串生成一个短的(fx 16 字符(不重要)哈希码/摘要。

主要要求是几乎相同的字符串应该产生相同的摘要。

Fx 2 几乎相同的邮件:

嗨,马丁。这里有一些……给你的垃圾邮件。问候 XYZ。 => AAAA AAAA AAAA AAAA

嗨,博。这里有一些……给你的垃圾邮件。问候 EFG。 => AAAA AAAA AAAA AAAA

返回相同的摘要(或几乎相同),其中作为不同的邮件:

你好芬恩。这是一封测试邮件。 => 中交中交中交中交中交

将返回不同的摘要。

此算法将成为垃圾邮件过滤器的一部分。过滤器将记住来自确定为垃圾邮件的邮件的摘要。如果相同的摘要出现在有疑问的邮件中,则相同的摘要将导致过滤器增加垃圾邮件分数。

我知道 Levenshtein,但它要求我预先了解这些字符串。在这种情况下,我没有这些信息。我可以拥有这些信息,但这需要过滤器来存储所有垃圾邮件并检查每封邮件,这将是一个非常缓慢的过程。

也许一些松散的压缩算法加上计算两者之间的 Levenshtein 距离可以工作。

任何指针表示赞赏。

【问题讨论】:

对“相似字符串哈希”的简单搜索会返回该问题的重复分数。 【参考方案1】:

看起来你想要locality-sensitive hashing。考虑使用minhash 或shingling。 Rajaraman & Ullman 的书Mining Massive Datasets 对两者都有很好的解释。您会在 python 搜索博客中找到许多简短的实现,以查找上述关键字。

似乎还有其他方法(我不太了解),但您可能会感兴趣,因为它们是专门为垃圾邮件量身定制的,尤其是 nilsimsa 哈希:

解释in that paper 其中有一个python port on pypi

【讨论】:

那是pypi不是pypy,pypy是python解释器,pypi是python包索引。

以上是关于用于字符串相似性的 Python 摘要/哈希的主要内容,如果未能解决你的问题,请参考以下文章

如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法

LSH︱python实现局部敏感哈希——LSHash

minHash最小哈希原理

图片哈希概论及python中如何实现对比两张相似的图片

OpenCV图像哈希计算及汉明距离的计算

感知哈希算法