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

Ben*_*oop 200 php regex multilingual user-input

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

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

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

有什么好方法可以让人们试图欺骗系统,比如$$,azz或a55?

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

编辑:响应答案,只是避免程序问题:

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

所以我真的指的是一种方法来弄清楚单个令牌是否脏,然后简单地禁止它.我不打算像完全搞笑的"长颈长颈鹿"参考那样阻止一种情绪.你无能为力.:)

Han*_*nto 174

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

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

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

一个删除匿名并引入问责制的系统(Stack Overflow做得很好)也很有帮助,特别是为了帮助对抗John Gabriel的GIFT

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

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

$filterRegex = "(boogers|snot|poop|shucks|argh)"
Run Code Online (Sandbox Code Playgroud)

并使用preg_match()在输入字符串上运行它以批量测试命中,

或者preg_replace()将它们清空.

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

有关其他PHP编程示例,请参阅此页面,了解一个有点高级的字过滤通用类,它是*来自删失字的中心字母,以及之前的Stack Overflow问题,它也有一个PHP示例(其中主要的有价值的部分是基于SQL的过滤词方法 - 如果您认为没有必要,可以省去leet-speak补偿器.

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

  • 你的正则表达式选项周围的单词边界包装将防止**clbuttic**错误 (6认同)

nic*_*har 41

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

亵渎过滤器既有原因也有明显的需要(参见维基百科条目),但由于非常不同的原因,它们往往达不到100%的准确性; 背景准确性.

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

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

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

可能还有多种语言.迄今为止,Shutterstock已经开发了10种语言的基本脏词列表,但它仍然是基本的,并且非常注重其"标记"需求.网上还有许多其他列表.

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

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

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

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

基本过滤器包括:

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

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

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

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

  • 白名单和黑名单
  • 朴素贝叶斯推断过滤短语/术语
  • Soundex函数(其中一个单词听起来像另一个)
  • Levenshtein距离
  • 词干
  • 人工版主帮助引导过滤引擎通过示例或匹配在没有指导的情况下进行学习(自我/持续改进的系统)
  • 也许某种形式的AI引擎

  • 真的很好的答案!Levenshtein算法的+1. (2认同)

Mat*_*ell 26

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

  • 或在飞行太空飞船游戏中禁止"驾驶舱" (16认同)

Mat*_*hew 23

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

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

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

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

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

Ste*_*owe 21

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

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

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

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

  • H3ll no man,只适用于最琐碎的情况;我们在这里和人类打交道,他们很聪明:) (2认同)

Tim*_*ugh 13

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

测试网址

  • 很酷..但它没有拿起(.)(.) (13认同)
  • 小心。CDYNE不再维护此产品。您可以自行承担使用风险。 (2认同)

Axe*_*xel 13

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

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


Dav*_*man 7

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

更大的挑战是提出一些让人们在阻止"阴茎"时引用" 钢笔比剑更强大"的东西.

  • 不要忘记expert-exchange.com和pen-island.com; 那些网站网址曾经不包含连字符. (13认同)

Sam*_*Sam 7

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

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

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

所以要注意本地化问题.


scu*_*ffe 6

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

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


Tur*_*Ali 6

我收集了 12 种语言的 2200 个坏词:en、ar、cs、da、de、eo、es、fa、fi、fr、hi、hu、it、ja、ko、nl、no、pl、pt、ru、sv , th, tlh, tr, zh。

MySQL 转储、JSON、XML 或 CSV 选项可用。

https://github.com/turalus/openDB

我建议您将此 SQL 执行到您的数据库中,并在每次用户输入内容时进行检查。