Algorithm 如何确定一个字符串与另一个字符串的相似性

Algorithm 如何确定一个字符串与另一个字符串的相似性,algorithm,string,hash,comparison,Algorithm,String,Hash,Comparison,我希望我的措词正确,以了解我在寻找什么 我需要比较两段文字。如果两个字符串相似,我希望得到非常相似的分数,如果字符串非常不同,我需要非常不同的分数 如果我对一封电子邮件进行md5哈希,并更改一个字符,哈希值会发生显著变化,我希望某些内容不会更改太多。我需要比较两个内容在没有存储字符串的情况下有多相似 更新:我现在考虑将人们提供的各种链接中的一些想法结合起来。理想情况下,我希望使用一个输入函数来创建我的分数,因此我希望使用一个引用字符串来始终比较我的输入。我也在考虑采取asci字符和总结这些。仍在

我希望我的措词正确,以了解我在寻找什么

我需要比较两段文字。如果两个字符串相似,我希望得到非常相似的分数,如果字符串非常不同,我需要非常不同的分数

如果我对一封电子邮件进行md5哈希,并更改一个字符,哈希值会发生显著变化,我希望某些内容不会更改太多。我需要比较两个内容在没有存储字符串的情况下有多相似


更新:我现在考虑将人们提供的各种链接中的一些想法结合起来。理想情况下,我希望使用一个输入函数来创建我的分数,因此我希望使用一个引用字符串来始终比较我的输入。我也在考虑采取asci字符和总结这些。仍在阅读提供的所有链接。

您要查找的是一个算法(另请参阅)。您也可以尝试其他方法。

检查他们的

在PHP中,您甚至可以使用

我需要比较两段文字。如果两个字符串相似,我希望得到非常相似的分数,如果字符串非常不同,我需要非常不同的分数

这取决于你所说的“相同”或“不同”是什么意思。例如,如果有人在您的字符串中用“USA”替换“美利坚合众国”,那么这是一个大致相同的字符串(因为USA只是较长字符的缩写),还是一个非常不同的字符串(因为许多字符发生了变化)


您基本上需要设计一个描述如何计算“相同性”的函数,或者使用其预先存在的定义。例如,前面提到的根据您必须对原始字符串进行的更改数量来测量总差异。

由于Levenshtein距离需要两个输入字符串来生成值,因此您必须存储所有字符串

但是,您可以使用少量字符串作为标记,并仅将其存储为字符串


然后计算从新字符串到每个标记字符串的Levenshtein距离,并存储这些值。然后,您可以猜测到,与所有标记具有相似Levenshtein距离的两个字符串也彼此相似。以这样一种方式“设计”这些标记可能是明智的,即它们的相互Levenshtein距离尽可能大。我不知道是否有这方面的研究。

许多人建议研究距离/度量方法,我认为问题的措辞就是这样。(顺便说一句,像md5这样的散列正试图做与度量几乎相反的事情,因此这对您不起作用也就不足为奇了。在小增量下,有一些类似的想法变化不大,但我怀疑它们没有为您想要做的事编码足够的信息)

特别是考虑到你在评论中的更新,我认为这种方法不是很有帮助

您所寻找的更多的是一个聚类问题,您希望从每封电子邮件生成一个签名(即特征向量),然后将其与新输入进行比较。所以本质上,你所面临的是一个机器学习问题。决定“接近”意味着什么可能有点挑战。首先,假设您正在查看的实际上是电子邮件,那么您可以很好地查看由许多垃圾邮件过滤器生成的各种特征,这将给您(可能是欧几里德的,至少从一开始)一个空间来测量基于签名(特征向量)的距离


如果不了解您的问题,就很难更加具体。

阅读您的评论,听起来您实际上是在比较整个文档,每个文档都包含许多单词

这在信息检索系统中成功地实现了。语言中的每个单词都是一个轴。沿轴的距离由单词在文档中出现的次数决定。类似的文档在空间中彼此“接近”


这样,整个文档就不需要存储,只需要计算字数。通常语言中最常用的单词根本不算在内。

你说的“分数”是什么意思?你的意思是一个关于字符串之间的距离的排名?但是你的第三段听起来更像是在寻找一个类似散列的值,它对小的更改非常健壮(“健壮散列”是这类工具的术语,通常用于音频和图像,而不是字符串)。感谢John,出于我的目的,美国和美国将是不同的。