2012-02-03 51 views
0

我是一个铁轨新手。在红宝石轨道模糊搜索亵渎过滤器

我使用profanity_filter红宝石的宝石在我的内容应用过滤犯规的话..

profanity_filter,如果在所有有犯规的话,可以说"foulword"返回"f******d"

如果任何用户播放聪明和类型"foulwoord""foulwordd""foulllword"等它不检测为一个犯规的词。

有没有办法确保它检测到这些用户智能犯规词?

寻求帮助!

谢谢!

+1

一定要考虑到[Scunthorpe问题](http://en.wikipedia.org/wiki/Scunthorpe_problem)。 – Blorgbeard 2012-02-03 23:03:14

回答

3

你需要过滤多少个犯规词?

一种方法是使用Diff::LCS(来自diff-lcs宝石)来检查被检查单词和每个犯规单词之间有多少字母不同。如果你有大量的犯规词来检查,这可能会非常缓慢。有一件事你可以做得更快一点将包括一个“好”字的字典。在Set中保留“好”字典,并在检查每个内容词之前,首先测试它是否在字典中。如果是这样,你可以继续前进。 (如果你想检查字典非常快,保持它在搜索线索。)

此外,如果您检查一个字,发现它是好的,你可以其添加到字典,以便你不需要再次查看同一个单词。这里的危险是字典可能变得太大。如果这是一个问题,你可以使用类似于“最近最少使用”缓存的东西,当字典变得太大时,会丢弃最近没有看到的“好”字。

另一种方法是针对每个犯规词生成变体,并将它们存储在“错误”字典中。如果您生成的每个单词与一个犯规单词相差1个字母,每个犯规单词的大小约为200-500。您也可以通过仅将字母“o”更改为零等来生成与犯规词不同的单词。

无论您做什么,您都永远不会捕捉100%的“坏”字错误地标出“好”字。如果你能得到一个过滤器,可以接受很高比例的“坏”字,可接受的误报率很低,那就是“成功”。

如果您正在为网站做这件事,我建议您不要用“坏”字封锁内容,而是自动将其标记为供版主注意。如果允许淫秽内容在网站上出现即使暂时无法接受,您也可以延迟显示标记的内容,直到主持人查看之后的。这将避免他评论中提到的@Blorgbeard的Scunthorpe问题。