题 你如何实现一个良好的亵渎过滤器?


我们中的许多人需要处理用户输入,搜索查询以及输入文本可能包含亵渎语言或不良语言的情况。通常需要将其过滤掉。

哪里可以找到各种语言和方言的咒骂词?

是否有可用于包含良好列表的源的API?或者也许一个API只是简单地说“是的这是干净的”或“没有这是脏”的一些参数?

有什么好方法可以帮助那些试图欺骗系统的人,比如$$,azz或a55?

如果您提供PHP解决方案,则可获得奖励。 :)

编辑:回答简单地避免程序化问题的答案:

我认为这种过滤器有一个地方,例如,用户可以使用公共图像搜索来查找添加到敏感社区池的图片。如果他们可以搜索“阴茎”,那么他们可能会得到很多照片,是的。如果我们不想要那些图片,那么防止这个词作为搜索词是一个很好的看门人,虽然不可否认这不是一个万无一失的方法。首先获取单词列表是真正的问题。

所以我真的指的是找出单个令牌是否脏的方法,然后简单地禁止它。我不打算像完全搞笑的“长颈长颈鹿”参考那样阻止情绪。你无能为力。 :)


183
2017-11-07 20:19


起源


令人遗憾的是,所有顶级答案都是存在主义和失败主义者对编程挑战的转移。随着像“机械土耳其人”这样的“机器人”计算服务获得动力,几乎所有软件都变得社交化,拥有一个启发式来标记内容并将其引入主持人的注意力比以往任何时候都更加重要! - JasonSmith
请注意语言环境,特别是如果你正在做i18n。我曾经尝试为我所提供的名为“Sanalortamdagörselleştirme”的课程设立一个谷歌小组,这是“虚拟媒体中的可视化”的土耳其语。谷歌愚蠢到拒绝它 因为标题中包含“肛门”这个词。 Sanal [tr] = Virtual [en]和Google无耻地指责我亵渎! :D请不要让像这样的奇怪事情发生。 - edgerunner
如果你找到这个词怎么样? 西班牙语?您实际上可以通过这种方式绕过Google图像过滤器(如果您已本地化为其他语言)。 - new123456
另一个建议不是禁止这些词,而是注册使用它们的用户。如果用户/ IP超过2,3或任何您想要的,则阻止该人。也不是万无一失,但我认为被封锁并且必须改变用户/ IP /两者比写'蓬松的白色兔子'而不是'猫'更不方便。一部分,用户不知道他们不能使用什么词或表达,所以他们不能像被禁止那样容易地猜出不同的坏词。 - Francisco Presencia
亵渎过滤器是一个坏主意。很难区分试图欺骗系统的人(“忽悠你!”)和合法谈论完全合适的人(“我喜欢巧克力软糖。”) - sag


答案:


猥亵过滤器:糟糕的想法,或令人难以置信的不良主意?

另外,人们不能忘记 Toontown Speedchat的不为人知的历史甚至使用“安全词白名单”导致一个14岁的孩子迅速绕过它: “我想把长颈鹿长颈鹿贴在蓬松的白色小兔子身上。”

结论:最终,对于您实施的任何系统,绝对没有人类评论的替代品(无论是同行还是其他)。随意实现一个基本工具来摆脱驱动器,但对于确定的巨魔,你绝对必须有一个非基于算法的方法。

一个删除匿名并引入问责制的系统(Stack Overflow做得很好)也很有帮助,特别是为了帮助打击 约翰加布里埃尔的G.I.F.T.

您还询问了哪些地方可以获得亵渎性列表以帮助您入门 - 一个要检查的开源项目是 Dansguardian  - 查看其默认亵渎列表的源代码。还有一个额外的第三方 短语列表 你可以下载代理,这可能是一个有用的收集点。

编辑以回答问题编辑: 感谢你澄清你想要做什么。在这种情况下,如果您只是尝试做一个简单的文字过滤器,有两种方法可以做到。一种是创建一个单一的长正则表达式,其中包含您要检查的所有禁用短语,并且仅使用它进行正则表达式查找/替换。像正则表达式:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

并使用输入字符串运行它 的preg_match() 批发测试一击,

要么 的preg_replace() 把它们搞砸了。

您还可以使用数组而不是单个长正则表达式加载这些函数,对于长单词列表,它可能更易于管理。见 的preg_replace() 关于如何灵活使用数组的一些很好的例子。

有关其他PHP编程示例,请参阅此页面以获取 有点高级的通用类 对于单词过滤来说,*是来自被删除的单词的中心字母,而这个 之前的Stack Overflow问题 这也有一个PHP示例(其中主要的有价值的部分是基于SQL的过滤词方法 - 如果您认为不必要,可以省去leet-speak补偿器)。

你还补充说:“首先获取单词列表是真正的问题。“ - 除了之前的一些Dansgaurdian链接,你可能会发现 这个方便的.zip 458个单词有用。


164
2017-11-19 04:27



@JPLemme:是的应该 - 之后我应该添加[原文如此],因为这就是阿特伍德的拼写。 :) - HanClinto
“企鹅俱乐部”为他们的亵渎过滤器添加了数百个条目 每天: raphkoster.com/2008/05/09/... - Frank Farmer
你的正则表达式选项周围的单词边界包装将阻止 clbuttic 错误 - cjk
@ck:只有你不担心能够过滤掉错误拼写的单词“F * ckkkk哟'asssss”:)我不确定我相信我的巨魔能有非常准确的拼写。 - HanClinto
如果你想从众所周知的马的嘴里听到“蓬松的白兔子”的故事,现在是一个播客节目: socialmediaclarity.tumblr.com/post/70499341079/... - F. Randall Farmer


虽然我知道这个问题相当陈旧,但这是一个常见问题......

亵渎过滤器既有原因也有明显需要(见 维基百科在这里输入),但由于非常不同的原因,它们通常不能100%准确; 上下文 和 准确性

它(完全)取决于你想要达到的目标 - 在最基本的时候,你可能试图覆盖“七个脏话“然后一些......一些企业需要过滤最基本的亵渎:基本的咒骂词,URL甚至个人信息等,但其他人需要防止非法帐户命名(Xbox live就是一个例子)或更多。 ..

用户生成的内容不仅包含潜在的咒骂词,还可能包含令人反感的引用:

  • 性行为
  • 性取向
  • 宗教
  • 种族
  • 等等...

可能还有多种语言。 Shutterstock已经发展起来 基本的脏词列表 到目前为止,已有10种语言,但它仍然是基本的,非常注重其“标记”需求。网上还有许多其他列表。

我同意接受的答案,即它不是一门定义的科学和  语言是一个不断发展的 挑战 但其中90%的捕获率优于0%。这完全取决于你的目标 - 你想要达到的目标,你所拥有的支持程度以及删除不同类型亵渎的重要性。

在构建过滤器时,您需要考虑以下元素以及它们与项目的关系:

  • 词/短语
  • 缩略语(FOAD / LMFAO等)
  • 误报 (单词,地点和名称,如'mishit','scunthorpe'和'titsworth')
  • 网址(色情网站是明显的目标)
  • 个人信息(电子邮件,地址,电话等 - 如果适用)
  • 语言选择(默认情况下通常为英语)
  • 审核(如果有的话,您可以如何与用户生成的内容进行交互以及您可以使用它做什么)

你可以轻松地建立一个亵渎过滤器,捕获90%以上的亵渎,但你永远不会达到100%。这是不可能的。你越接近100%,它就变得越难......过去构建了一个复杂的亵渎引擎,每天处理超过500K的实时消息,我提供以下建议:

基本过滤器将涉及:

  • 建立适用的亵渎名单
  • 开发一种处理亵渎衍生的方法

中等复杂的文件管理器将涉及(除了基本过滤器):

  • 使用复杂模式匹配来处理扩展派生(使用高级正则表达式)
  • 处理 Leetspeak (的l33t)
  • 处理 误报

复杂的过滤器将涉及以下许多(除了适度的过滤器):


36
2017-11-07 20:26



真的很好的答案! Levenshtein算法的+1。 - Noah Krasser
很好的答案,谢谢。 - Chris Brasino


我不知道有什么好的图书馆,但不管你做什么,都要确保你犯错误的方向。我处理的系统不允许我使用“mpassell”作为用户名,因为它包含“ass”作为子字符串。这是疏远用户的好方法!


24
2017-11-07 22:36



或者在飞行太空飞船游戏中禁止“驾驶舱” - Shinhan


在我的面试中,正在采访我的公司CTO试用了我用Java编写的单词/网页游戏。在整个牛津英语词典的单词列表中,第一个出现在猜测的单词是什么?

当然,英语中最肮脏的词。

不知何故,我仍然得到了工作机会,但我随后追查了一份亵渎词汇表(不是 不像这个并编写了一个快速脚本来生成一个没有所有坏词的新词典(甚至不需要查看列表)。

对于您的特定情况,我认为将搜索与真实单词进行比较听起来就像使用单词列表一样。替代样式/标点符号需要更多的工作,但我怀疑用户会经常使用它成为一个问题。


22
2017-11-07 22:27



关闭话题,但最肮脏的词是什么?我一直认为它是c字或n字,但我认为人们认为f字是 - Jeff
“我怀疑用户会经常使用它成为一个问题” 保持希望活着。一旦用户偶然发现过滤器,他们将努力寻找规避方法。它可以简单到用数字替换字母到奇数的空格位置等。 - BryanH


亵渎过滤系统将永远不会是完美的,即使程序员是自信并且随时了解所有裸体发展

也就是说,任何“淘气词”列表都可能与其他列表一样好,因为潜在的问题是 语言理解 这对于当前的技术来说几乎是难以处理的

所以,唯一可行的解​​决方案是双重的:

  1. 准备好经常更新你的字典
  2. 雇用一名人工编辑来纠正误报(例如“clbuttic”而不是“classic”)和假阴性(哎呀!错过了一个!)

19
2017-11-07 20:27



只检测带有空格的单词,然后完全停止,不是吗? - David D
没有人,只适用于最微不足道的案件;我们在这里和人类打交道,他们很聪明:) - Steven A. Lowe


看一下 CDYNE的亵渎过滤网络服务

测试网址


13
2017-11-07 20:42



很酷..但它没有拿起(。)(。) - Jason Jong
小心。 CDYNE不再维护此产品。您可以自担风险使用它。 - Sari Rahal


防止攻击性用户输入的唯一方法是阻止所有用户输入。

如果您坚持允许用户输入并需要审核,那么请合并人工审核人。


12
2017-11-08 01:35



甚至没有帮助有时xD - Gigala


关于你的“欺骗系统”子问题,你可以通过在搜索之前规范化“坏词”列表和用户输入的文本来处理这个问题。例如,使用一系列正则表达式(或 TR 如果PHP有它)转换 [Z $ 5] 到“s”, [4 @] 到“a”等,然后将规范化的“坏词”列表与规范化的文本进行比较。请注意,规范化可能会导致额外的误报,尽管我现在无法想到任何实际情况。

更大的挑战是想出一些让人们引用“The 笔是 比剑更“强大”,“阻挡”了“。


7
2018-04-27 12:55



不要忘记expert-exchange.com和pen-island.com;那些网站网址曾经不包含连字符。 - BryanH


谨防本地化问题:在一种语言中,什么是脏话可能在另一种语言中是一个完全正常的词。

目前的一个例子是:ebay使用字典方法从反馈中过滤“坏词”。如果你试图输入“这是一个完美的交易”(“das war eine perfekte Transaktion”)的德语翻译,ebay将拒绝由于坏词的反馈。

为什么?因为“是”的德语单词是“战争”,而“战争”是在“坏词”的ebay词典中。

所以要注意本地化问题。


7
2017-11-07 20:46





如果您可以执行类似Digg / Stackoverflow的操作,用户可以在其中投票/标记淫秽内容......请执行此操作。

然后,您需要做的就是检查“顽皮”用户,如果他们违反规则就阻止他们。


6
2017-10-29 03:22