【问题标题】:Profanity filter with fuzzy search in ruby railsruby rails 中带有模糊搜索的脏话过滤器
【发布时间】:2012-02-03 23:00:06
【问题描述】:
我是 Rails 新手。
我正在使用profanity_filter ruby gem 来过滤我的内容应用程序中的脏话..
profanity_filter,如果有脏话,可以说"foulword" 它返回"f******d"
如果任何用户玩得很聪明并键入"foulwoord" 或"foulwordd" 或"foulllword" 等,它不会被检测为脏话。
有没有办法确保它检测到这些用户智能的脏话?
期待帮助!
谢谢!
【问题讨论】:
标签:
ruby
filter
rubygems
word
profanity
【解决方案1】:
你需要过滤多少脏话?
一种方法是使用Diff::LCS(来自diff-lcs gem)之类的方法来检查正在检查的单词和每个脏词之间有多少字母不同。如果你有大量的脏话要检查,这可能会很慢。你可以做的一件事是让它更快更快地包含一个“好”单词的字典。将“好”字典保存在Set 中,在检查每个内容词之前,首先测试它是否在字典中。如果是这样,你可以继续前进。 (如果您想快速非常检查字典,请将其保存在搜索树中。)
此外,如果您检查一个单词并发现它没问题,您可以将它添加到字典中,这样您就不需要再次检查同一个单词。这里的危险是字典可能会变得太大。如果这是一个问题,您可以使用类似于“最近最少使用”的缓存,当字典变得太大时,它会丢弃最近没有看到的“好”词。
另一种方法是生成每个脏词的变体,并将它们存储在“坏”字典中。如果您生成的每个单词与一个脏词相差 1 个字母,那么每个脏词大约有 200-500 个。您还可以通过将字母“o”更改为零等方式生成与脏词不同的单词。
无论您做什么,您都不会在没有错误地标记“好”字的情况下捕捉到 100% 的“坏”字。如果你能得到一个过滤器,它可以捕捉到可接受的高百分比的“坏”词,并且误报率可接受的低,那将是“成功”。
如果您是为网站执行此操作,我建议您不要屏蔽带有“坏”字眼的内容,而是自动标记它以引起版主的注意。如果允许淫秽内容在网站上出现,哪怕只是短暂地发布也是不可接受的,您可以延迟显示标记的内容,直到版主查看它之后。这将避免他的评论中提到的@Blorgbeard 的斯肯索普问题。