![]() |
1
9
如果坏词列表变大,哈希就快得多:
|
![]() |
2
3
bad=“foo bar baz” =>“foo bar baz”(foo bar baz) str=“这是我的第一个foo字符串” =>“这是我的第一个foo字符串” (str.split('')-错误。split('')).join('') =>“这是我的第一个字符串” |
![]() |
3
1
如果情况不匹配,所有的解决方案都无法捕捉坏词。通过添加忽略大小写标志,regex解决方案最容易修复: badex = /\b(#{bad.split.join('|')})\b/i
此外,使用
#!/usr/bin/ruby require 'benchmark' bad = 'foo bar baz comparison' badex = /\b(#{bad.split.join('|')})\b/i str = "What's the fasted way to check if any word from the bad string is within my comparison string, and what's the fastest way to remove said word if it's found?" * 10 n = 10_000 Benchmark.bm(20) do |x| x.report('regex:') do n.times { str.gsub(badex,'').gsub(' ',' ') } end x.report('regex with squeeze:') do n.times{ str.gsub(badex,'').squeeze(' ') } end x.report('array subtraction') do n.times { (str.split(' ') - bad.split(' ')).join(' ') } end end 我让str变量变长了很多,使例程工作起来更困难。 user system total real regex: 0.740000 0.010000 0.750000 ( 0.752846) regex with squeeze: 0.570000 0.000000 0.570000 ( 0.581304) array subtraction 1.430000 0.010000 1.440000 ( 1.449578) 呸!我已经习惯了其他语言如何处理它们的基准测试。现在我开始工作了,看起来好多了! 只需对OP想要做的事情做一点小小的评论:黑名单中的单词删除很容易被愚弄,维护起来很痛苦。L33T-SP34K使得轻蔑的话语变得微不足道。根据应用程序的不同,人们会认为这是一个游戏,以寻找方法将冒犯性的词汇过滤掉。当我被要求处理这个问题时,我发现的最好的解决方案是创建一个生成器,它可以在一个单词上创建所有的变体,并将它们转储到一个数据库中,在这个数据库中,一些进程可以尽快进行检查,而不是实时进行检查。如果你在一长串冒犯性的词语中搜索,要检查一百万个小字符串可能需要一段时间;我相信我们可以列出很多让人觉得冒犯的东西,但这是另一天的练习。 在Ruby中我没有看到类似于Perl的 Regexp::Assemble 但这是解决此类问题的好方法。您可以传递一个单词数组,以及大小写折叠和单词边界的选项,它将输出一个与所有单词匹配的regex模式,并考虑它们的共性,以产生与列表中所有单词匹配的最小模式。之后的问题是找到原始字符串中哪个单词与模式找到的匹配,以便删除它们。复合词的大小写和命中数的不同使得替换更加有趣。 而且我们甚至不会根据上下文使用善意或冒犯性的词语。
我为数组减法基准添加了一个更全面的测试,以适应在真正的代码中如何工作。这个
两次试运行:
|
![]() |
4
0
我通常在没有测量的情况下不进行优化,但这里有一个wag: 为了加快速度,应该对每个字符串迭代一次。您希望避免出现计数*str count内部比较错误的循环。所以,你可以用它构建一个大型的regexp和gsub。 (添加foo变量以测试单词边界工程)
当然,产生的巨大regexp可能和我另一个答案中隐含的嵌套迭代一样慢。唯一知道的方法就是测量。 |
![]() |
5
0
|
![]() |
6
0
我将以此为基准:
有吗?一看到匹配就快速检查。如果你能按坏词的概率排序,你就可以节省一些循环。 |
![]() |
7
0
这是一个检查单词和短语的方法。
|
![]() |
8
-2
包括?方法就是你需要的。Ruby字符串的具体内容是: 是否包含str.include?(字符串)->真或假 如果str包含给定的字符串或字符,则返回true。 “你好。”包括吗?Lo“—>真 “你好。”包括吗?ol“->错误 “你好”。包括吗??H->真 注意它有O(n),而你的目的是O(n^2) |
![]() |
Stilian · 存储库设置中没有Github页面部分 2 年前 |
![]() |
Kellen · 查看$卷展栏功能列表 2 年前 |
![]() |
Akshit Thakur Ak · 我怎样才能把铁轨停下来? 2 年前 |
![]() |
johncssjs · 将数组转换为每个元素的嵌套哈希 2 年前 |
![]() |
solidsnake99 · Rails db:如何绕过验证 2 年前 |