我是铁路新手。
我正在使用亵渎过滤器ruby gem来过滤我的内容应用程序中的脏话。。
如果有脏话,比如说"foulword"
,它会返回"f******d"
如果任何用户玩得很聪明,并键入"foulwoord"
、"foulwordd"
或"foulllword"
等,则不会将其检测为脏话。
有没有办法确保它能检测到这些用户聪明的脏话?
期待帮助!
谢谢!
你需要过滤多少脏话?
一种方法是使用类似Diff::LCS
(来自diff-lcs
gem)的东西来检查被检查的单词和每个脏话之间有多少字母不同。如果你有大量的脏话要检查,这可能会非常缓慢。要想让更快,你可以做的一件事是包含一本"好"单词的词典。将"好"字典保存在Set
中,在检查每个内容单词之前,首先测试它是否在字典中。如果是这样,你可以继续前进。(如果你想快速检查字典,请将其保存在搜索trie中。)
此外,如果你检查了一个单词,发现它还可以,你可以将其添加到词典中,这样你就不需要再检查同一个单词了。这里的危险在于这本字典可能会变得太大。如果这是一个问题,你可以使用类似于"最近使用最少"的缓存,当字典变得太大时,它会丢弃最近没有出现的"好"单词。
另一种方法是对每个脏话生成变体,并将其存储在"坏"字典中。如果你生成的每个单词与一个脏话相差一个字母,那么每个脏话大约有200-500个字母。你也可以生成不同于脏话的单词,只需将字母"o"改为零,等等。
无论你做什么,你都不会在不错误地标记"好"字的情况下,100%地捕捉到"坏"字。如果你能得到一个过滤器,它捕捉到可以接受的高百分比的"坏"词,而误报率可以接受的低,那就是"成功"。
如果你这样做是为了一个网站,我建议你不要用"坏"字屏蔽内容,而是自动标记它以引起主持人的注意。如果允许淫秽内容在网站上短暂出现是不可接受的,你可以推迟显示标记的内容,直到主持人查看后。这将避免他评论中提到的@Blorgbeard的斯肯索普问题。