Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 检查两个字符串是否非常相似(相似的字符、模式等)_Ruby - Fatal编程技术网

Ruby 检查两个字符串是否非常相似(相似的字符、模式等)

Ruby 检查两个字符串是否非常相似(相似的字符、模式等),ruby,Ruby,我习惯于在Ruby中对很多字符串进行精确的匹配检查,但我想知道是否有办法使这个过程更有效 例如,我从一个区域获取数据,并将其与活动记录中的数据进行比较。如果www.domain.com在一个位置,而domain.com在另一个位置,我唯一能确定的方法是在一个位置删除www,或者在另一个位置添加它 有没有一种方法可以智能地确定两个数据是否相同 在上面的示例中,14个字符中有10个(或71.42%)是相似的,因此我认为可以安全地假设这两个记录属于链接,因为它们只是略有不同 是否有一种宝石或方法能够智

我习惯于在Ruby中对很多字符串进行精确的匹配检查,但我想知道是否有办法使这个过程更有效

例如,我从一个区域获取数据,并将其与活动记录中的数据进行比较。如果
www.domain.com
在一个位置,而
domain.com
在另一个位置,我唯一能确定的方法是在一个位置删除
www
,或者在另一个位置添加它

有没有一种方法可以智能地确定两个数据是否相同

在上面的示例中,14个字符中有10个(或71.42%)是相似的,因此我认为可以安全地假设这两个记录属于链接,因为它们只是略有不同

是否有一种宝石或方法能够智能地做出这种决策?

与Damerau-Levenshtein距离的模糊匹配 任何类型的模糊匹配都在某种程度上取决于您选择如何查看数据。对于这种情况,您可以查看Levenshtein距离的多种变体之一,例如。您可以调整MIN_SIMILARITY_PERCENT以调整相似度索引,该索引使用编辑距离作为在对中最长单词中找到的字符的百分比来计算

要求“damerau levenshtein”
类相似性指数
最小相似性百分比=70.0
属性读取器:相似性:单词
def初始化word1,word2
@单词=单词1,单词2
相似的?
结束
编辑距离
DamerauLevenshtein.distance*@words
结束
def最长单词长度
@字.最大长度(&:长度).尺寸
结束
def相似吗?
e=编辑距离
l=最长单词长度到f
@相似性(idx=((1-(e/l))*100)。第二轮
@相似性\u idx>=最小相似性\u百分比
结束
结束
您可以使用一些测试数据来验证这一点。例如:

字对=%w[
www.domain.com
domain.com
www.example.com
foobarbaz.example.com
]
单词对。每个单词片(2)。映射单词1,单词2|
s=相似性索引。新单词1,单词2
{words:s.words,similarity\u idx:s.similarity\u idx,similarity?:s.similarity?}
结束
此测试数据生成以下结果:


dowmawiwn.com
?通常情况下,你会将事情规范化为一种更简单的形式,这是一致的。是的,这是我们通常的做法,但对于这个特定的项目,我必须找到类似的数据,并使它们一致,这样就可以继续下去。可能重复,它链接了一些类似的问题,但这是最新的。
[{:words=>["www.domain.com", "domain.com"],
  :similarity_idx=>71.43,
  :similar?=>true},
 {:words=>["www.example.com", "foobarbaz.example.com"],
  :similarity_idx=>57.14,
  :similar?=>false}]