gpt4 book ai didi

arrays - 如何在 Ruby 中为正则表达式字符串匹配生成百分比?

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:09 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的方法来查看数据库中大约 100 个姓氏条目,并找出所有匹配超过特定字母百分比的条目。我目前的做法是:

  1. 从数据库中提取所有 100 个条目到一个数组中
  2. 在执行以下操作时遍历它们
  3. 将姓氏拆分为字母数组
  4. 从另一个数组中减去该数组,该数组包含我要匹配的姓名的字母,只留下不匹配的字母。
  5. 将结果的大小除以第 3 步中数组的原始大小以获得百分比。
  6. 如果百分比高于预定义的阈值,将该数据库对象插入结果数组。

这行得通,但我觉得一定有一些很酷的 ruby​​/regex/active record 方法可以更有效地做到这一点。我用谷歌搜索了很多但找不到任何东西。

最佳答案

要评论您建议的措施的优点需要推测,这在 SO 是越界的。因此,我将仅演示如何实现您提出的方法。

代码

首先定义一个辅助方法:

class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end

简而言之,如果

a = [3,1,2,3,4,3,2,2,4]
b = [2,3,4,4,3,4]

然后

a - b           #=> [1]

鉴于

a.difference(b) #=> [1, 3, 2, 2]

这个方法在我对 this SO question 的回答中有详细说明。 .我发现它有很多用途,所以我已经 proposed it be added to the Ruby Core .

以下方法生成一个散列,其键是 names(字符串)的元素,其值是包含在 target 字符串中的字母的分数names 中的每个字符串。

def target_fractions(names, target)
target_arr = target.downcase.scan(/[a-z]/)
target_size = target_arr.size
names.each_with_object({}) do |s,h|
s_arr = s.downcase.scan(/[a-z]/)
target_remaining = target_arr.difference(s_arr)
h[s] = (target_size-target_remaining.size)/target_size.to_f
end
end

示例

target = "Jimmy S. Bond"

你正在比较的名字由

names = ["Jill Dandy", "Boomer Asad", "Josefine Simbad"]

然后

target_fractions(names, target)
#=> {"Jill Dandy"=>0.5, "Boomer Asad"=>0.5, "Josefine Simbad"=>0.8}

解释

对于上述namestarget的值,

target_arr = target.downcase.scan(/[a-z]/)
#=> ["j", "i", "m", "m", "y", "s", "b", "o", "n", "d"]
target_size = target_arr.size
#=> 10

现在考虑

s = "Jill Dandy"
h = {}

然后

s_arr = s.downcase.scan(/[a-z]/)
#=> ["j", "i", "l", "l", "d", "a", "n", "d", "y"]
target_remaining = target_arr.difference(s_arr)
#=> ["m", "m", "s", "b", "o"]

h[s] = (target_size-target_remaining.size)/target_size.to_f
#=> (10-5)/10.0 => 0.5
h #=> {"Jill Dandy"=>0.5}

Boomer 和 Josefine 的计算类似。

关于arrays - 如何在 Ruby 中为正则表达式字符串匹配生成百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40078385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com