加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 找出大型列表中的哪些单词出现在一个小字符串中

发布时间:2020-12-17 02:28:22 所属栏目:百科 来源:网络整理
导读:我有一个静态的“大”单词列表,大约300-500个单词,名为’list1′ 给出一个约40字的相对较短的字符串str,ruby中最快的方法是: list1中单词出现在str中的次数(计算多次出现次数) list1中的哪些单词在字符串str中出现一次或多次的列表 (2)中的单词数 str中的’
我有一个静态的“大”单词列表,大约300-500个单词,名为’list1′

给出一个约40字的相对较短的字符串str,ruby中最快的方法是:

> list1中单词出现在str中的次数(计算多次出现次数)
> list1中的哪些单词在字符串str中出现一次或多次的列表
>(2)中的单词数

str中的’Occuring’既可以是str中的整个单词,也可以是str中单词中的部分单词.所以,如果’fred’在list1中,str包含’fred’和’freddie’,那将是两个匹配.

一切都是小写的,所以任何匹配都不必关心案例.

例如:

list1 ="fred sam sandy jack sue bill"
str = "and so sammy went with jack to see fred and freddie"

所以str包含sam,jack,fred(两次)

对于第(1)部分,表达式将返回4(sam jack fred fred)
对于第(2)部分,表达式将返回“sam jack fred”
第(3)部分是3

这样做的“ruby方式”在4小时之后就消失了……迭代它很容易(但很慢).任何帮助,将不胜感激!

解决方法

这是我的镜头:

def match_freq(exprs,strings)
  rs,ss,f = exprs.split.map{|x|Regexp.new(x)},strings.split,{}
  rs.each{|r| ss.each{|s| f[r] = f[r] ? f[r]+1 : 1 if s=~r}}
  [f.values.inject(0){|a,x|a+x},f,f.size]
end

list1 = "fred sam sandy jack sue bill"
str = "and so sammy went with jack to see fred and freddie"
x = match_freq(list1,str)
x # => [4,{/sam/=>1,/fred/=>2,/jack/=>1},3]

“match_freq”的输出是输出项(a,b,c)的数组.算法本身是O(n * m),其中n是list1中的项目数,m是输入字符串的大小,我认为你不能做得更好(就大哦而言).但是有一些较小的优化可能会有所回报,例如为匹配总数保留一个单独的计数器而不是之后计算它.这只是我对它的快速破解.

您可以从输出中仅提取匹配的单词,如下所示:

matches = x[1].keys.map{|x|x.source}.join(" ") # => "sam fred jack"

请注意,订单不会被保留,如果重要的话,您必须保留单独的订单列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读