ruby – 找出大型列表中的哪些单词出现在一个小字符串中
我有一个静态的“大”单词列表,大约300-500个单词,名为’list1′
给出一个约40字的相对较短的字符串str,ruby中最快的方法是: > list1中单词出现在str中的次数(计算多次出现次数) 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) 这样做的“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" 请注意,订单不会被保留,如果重要的话,您必须保留单独的订单列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |