我们中的许多需要处理的用户输入、搜索查询,情况输入案文可能含有亵渎或不希望的语言。经常需要这样过滤出来。

在哪里可以找到一个很好的列表的宣誓词在各种语言和方言?

有Api可用来源,包含良好的列表?或者,也许API,简单地说"是的这是干净"或"不,这是肮脏的"一些参数?

什么是一些很好的方法用于捕的人试图招系统,像$$,azz,或a55?

奖励点,如果你提供解决方案PHP.:)

编辑:应回答说的只是避免方案问题:

我认为有一个地方,对于此种过滤器时,例如,用户可以使用公共图像的搜索,找到照片,获得加入一个敏感的社会游泳池。如果他们可以搜索"阴茎",那么他们将可能得到的很多照片,是的.如果我们不想要照片,然后防止这个词作为一个搜索词是一个很好的看门人,虽然无可否认不是一个万无一失的方法。越来越清单的话在第一个地方是真正的问题。

所以我真的参照一个办法找出的一个单一的令牌是肮脏的或不再简单地禁止它。我不想打扰防止一种情绪就像完全搞笑的"长颈长颈鹿"参考。没什么你可以在那里做。:)

有帮助吗?

解决方案

Obscenity Filters:不好主意,或者令人难以置信的间歇性想法?

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

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

删除匿名并引入问责制(Stack Overflow功能良好)的系统也很有用,特别是为了帮助解决 John Gabriel的礼物

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

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

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

并使用 preg_match()在您的输入字符串上运行它以批发测试, p>

preg_replace()将其删除。

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

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

您还添加了:" 首先获取单词列表是真正的问题。" - 除了之前的一些Dansgaurdian链接,你可以找到这个方便的.zip 458个单词有用。

其他提示

虽然我知道这问题是相当古老,但是它的一个通常出现的问题...

有两个理由和独特的需要亵渎过滤器(见 维基百科的入口这里),但他们往往属于短期的100%准确的为非常明显的原因; 上下文准确度.

它取决于(全部)在什么你想现在它是最基本的,你可能试图掩盖"七脏话"然后一些...一些企业需要过滤器的最基本的亵渎:基本誓词,网址或甚至个人信息等,但是其他需要防止非法账户命名(live是一个例子)或更...

用户生成的内容不仅包含潜在的誓言,也可以包含进攻性参考文献:

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

和可能在多种语言。也许已经开发了 基本脏话清单 10种语言的日期,但它仍然是基本的和非常多的面向他们的'标记的需求。还有一些其他清单可在网。

我同意接受的答案,它不一定义的科学和 作为 语言是一个不断发展 挑战 但是,一个在那里有90%的捕获率好于0%。它取决于纯粹出于自己的目标-什么你试图实现,该级别的支持,你有多么重要,它是消除亵渎不同的类型。

在建立一个过滤器,需要考虑下列要素和它们之间的相互关系到你的项目:

  • 词或短语
  • 缩略语(FOAD/。等)
  • 误报 (话、地点和名称'未命中','索普"和"titsworth')
  • 网址(色情网站是一个显而易见的目标)
  • 个人信息(电子邮件、地址、电话等等-如果适用)
  • 语言选择(通常是英文默认情况下)
  • 节制(如何,如果有的话,你可以与用户生成的内容以及什么你可以用它做)

你可以很容易地建立一个亵渎过滤器,抓住90%以上的亵渎,但你永远不会打到100%。这是不可能的。接近你想要得到100%,就越难...具有建成一个复杂的亵渎引擎,过去处理了超过500K的实时消息,每天,我提出以下建议:

一个基本过滤器将涉及:

  • 建立一个列表中的适用亵渎
  • 发展的方法处理与派生的亵渎

适度复杂的文件管理将涉及,(除了一个基本过滤器):

  • 使用复杂的模式匹配来处理延长派生(使用先进的regex)
  • 处理 Leetspeak (l33t)
  • 处理 误报

一个复杂的过滤器将涉及数量以下(在外的中等过滤器):

  • 白名单 和黑名单
  • 天真的贝推断 过滤的短语/语
  • Soundex 功能(其中一个词听起来像另一)
  • Levenshtein distance
  • 人类的主持人,以帮助指导一个过滤引擎以学习的榜样或那里的比赛是不是准确没有足够的指导(a self/不断改进的系统)
  • 也许是某种形式的艾引擎

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

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

当然,英语中最含糊的词。

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

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

一个亵渎过滤系统将永远不会是完美的,即使该程序是独断并保持跟上全裸体的事态发展

这就是说,任何列表中的'顽皮的单词'可能执行,以及任何其他清单,因为潜在的问题是 语言的了解 这是非常棘手的与当前的技术

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

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

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

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

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

更大的挑战是想出一些让人们引用的东西“比剑更强大”。阻止“p e n i s”。

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

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

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

请注意本地化问题。

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

然后你需要做的就是回顾一下“顽皮”。用户,如果违反规则就阻止他们。

我参加派对有点晚了,但我有一个解决方案可能适合那些阅读此内容的人。它是用javascript而不是php,但这是有正当理由的。

  

完全披露,我写了这个插件......

反正。

我采用的方法是允许用户“选择加入”。他们的亵渎过滤。默认情况下,基本上会允许亵渎,但如果我的用户不想阅读它,他们就不必这样做。这也有助于“l33t sp3 @ k”。问题。

这个概念是一个简单的插件如果客户端的帐户启用亵渎性过滤,则由服务器注入。从那里开始,只有几条简单的线条可以清除咒骂。

这是演示页面
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/

<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

结果

  

***会失败,但密码不会

别。它只会导致问题。我用亵渎过滤器获得的一个个人经验就是我从IRC频道被踢/被禁止的时间,因为我提到我“过桥到汉考克几个小时”。或类似的东西。

我同意HanClinto在本次讨论中的更高职位。我通常使用正则表达式来匹配输入文本。这是徒劳的努力,因为,就像你最初提到的那样,你必须在你的“被阻止”中明确地说明网上流行的每一种写作形式。列表。

另一方面,虽然其他人正在辩论审查制度的道德规范,但我必须同意在网络上需要某种形式。有些人只是喜欢发布粗俗,因为它可以立即冒犯大量的人,并且绝对不需要作者的思考。

感谢你的想法。

HanClinto规则!

一旦你有一个好的MYSQL表,你想要过滤一些坏词(我从这个帖子中的一个链接开始),你可以这样做:

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string(

一旦你有一个好的MYSQL表,你想要过滤一些坏词(我从这个帖子中的一个链接开始),你可以这样做:

<*>

我确信有一种更有效的方法来完成所有这些替换,但我不够聪明才能弄清楚(这似乎工作正常,尽管效率低下)。

我认为您应该允许用户注册,并使用人工过滤并根据需要添加到您的亵渎表中。虽然这一切都取决于假阳性的成本(好的词被标记为坏)而不是假阴性(坏词通过)。这应该最终决定你在过滤策略中的积极性或保守性。

如果你想使用通配符,我也会非常小心,因为它们有时会表现得比你想要的更加繁琐。

POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table. $ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD'). All your values in the profanity table will need to be UPPERCASE for this to work. $ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation). Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'. $ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'. $ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO's with O's (Capital letter o's). $ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution. Make sure you replace Z's with S's in your profanity database for this to work properly. Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'. The profanity table should have the "rendered" version of the bad words. $CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'"); if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input. You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter. if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging. //You can also use these lines to troubleshoot. //echo $ProfanityCheckString; //echo "<br />"; //echo mysql_error(); //echo "<br />";

我确信有一种更有效的方法来完成所有这些替换,但我不够聪明才能弄清楚(这似乎工作正常,尽管效率低下)。

我认为您应该允许用户注册,并使用人工过滤并根据需要添加到您的亵渎表中。虽然这一切都取决于假阳性的成本(好的词被标记为坏)而不是假阴性(坏词通过)。这应该最终决定你在过滤策略中的积极性或保守性。

如果你想使用通配符,我也会非常小心,因为它们有时会表现得比你想要的更加繁琐。

我用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,并在用户输入内容时进行检查。

坦率地说,我让他们得到“欺骗系统”。说出来并禁止他们,这只是我。但它也使编程更简单。

我要做的是实现一个像这样的正则表达式过滤器: / [\ s] dooby(doo?)[\ s] / i 或者这个单词的前缀是其他的, / [\ s]的杜布(ER | ED | EST)[\ s]的/ 。这些可以防止像过滤这样的过滤词,这是完全有效的,但是如果你学习了新的过滤器,还需要了解其他变体并更新实际的过滤器。显然这些都是例子,但你必须自己决定如何做。

我不打算输出我所知道的所有单词,而不是在我实际上不想知道它们的时候。

我同意是徒劳的问题,但是如果你要有一个过滤器,检查了宁的 黄杨:

黄杨是PHP扩展快速替换的多个单词在一段的文本。它支持的情况下敏感和情况不敏感的匹配。它要求的文本,它的运作上进行编码作为UTF-8。

也看到这篇文章更多的细节:

与黄杨,你可以有你的名单搜索的条款可以,只要你喜欢--搜索和替换算法不能获得较慢,与更多的话名单上的话来寻找。它的工作通过建立一个线索的所有搜索词,然后扫描你的主题文本只是一次,走元素的线索和比较字在你的案文。它支持US-ASCII和UTF-8,情况下,敏感性或不敏感的匹配,并有一些英国为中心的词边界检查的逻辑。

我总结道,为了创建一个好的亵渎过滤器,我们需要3个主要组件,或者至少它是我要做的。这些是:

  1. 过滤器:验证黑名单,字典或类似内容的后台服务。
  2. 不允许匿名帐户
  3. 举报滥用行为
  4. 奖金,它将以某种方式奖励那些为准确滥用记者做出贡献并惩罚犯罪者的人,例如:暂停他们的帐户。

还在比赛后期,但这样做的一些研究和偶然在这里。正如其他人已经提到的,这只是几乎近于不可能如果这是自动的,但是如果你的设计要求可以涉及在某些情况下(但不是所有的时间)人类相互作用,以审查它是否是亵渎或不,你可以考虑毫升。 https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity 是我目前的选择,现在多个原因:

  • 支持许多本地化
  • 他们不断更新的数据库,所以我没有跟上最新的俚语或语言(维护问题)
  • 当有较高的概率(I.e。90%或更多)你就可以否认这一点切实
  • 你可以观察类别,这会导致一个标志,可能或不可亵渎,并且可以有人回顾它教,它是或不是亵渎。

我需要的,它是基于公众友好的商业服务(确定,电子游戏)其他用户可能/将会看到用户名,但设计要求,它已经通过亵渎的过滤器,拒绝攻击的用户名。可悲的一部分,这是典型的"clbuttic"问题很可能会发生由于用户名通常是单词(N字)的有时是多个单词连锁...再次,Microsoft的认知服务将不会标志"协助"作为文本。HasProfanity=真实的,但可能标志的类别之一的概率要高。

作为运询问,什么有关"a$$",这一结果的时候我通过它通过过滤器:enter image description here, 你可以看到,已确定它不是亵渎性的,但它具有很高的概率,这是因为标志建议的审查(人类相互作用).

当概率是高的,我可以返回"对不起,名称已经采取的"(即使它不是)因此,它是更少的进攻,以反审查个人或东西,如果我们不希望将人审查或返回"你的用户名已知的现场操作部门,可能等待你的用户名,以进行审查和批准或选择了另一个用户名".或者什么的...

通过这种方式,成本/价格为这项服务是相当低的,我的目的(如往往没有用户名被改变?), 但同样,对运,也许对设计需要更密集的查询,并可能不是最理想的支付/认购ML-服务,或不能有人评论/交互作用。这一切都取决于设计...但是,如果设计不适合该法案,也许这可以运的解决方案。

如果感兴趣的话,我可以列出的缺点的评论的未来。

不。

因为:

  • Clbuttic
  • 亵渎不是最邪恶的
  • 亵渎不可能有效地定义
  • 大多数人很可能不欣赏正在"受保护"从亵渎

编辑:虽然我同意这位评论者说,"审查是错误的",这不是性质的答案。

亵渎过滤器是一个坏主意。原因是你不能抓住每个发誓的话。如果你尝试,你会得到假阳性。

捕捉单词

我们只想说你要抓住F-Word。容易,对吗?好吧,让我们看看。

你可以循环一个字符串来找到“他妈的”。不幸的是,人们现在使用过滤器。亵渎过滤器没有拿起“fuk。”

可以尝试检查单词的多个拼写和变体,但这会降低代码的性能。要捕获F-Word,您需要查找“fuc”,“Fuc”,“fuk”,“Fuk”,“F ***”等。然后列表会一直亮着

避免无罪

好吧,那么如何让它不区分大小写并忽略空格,以便它捕获“F u C k”?这可能听起来不错,但有人可以绕过亵渎过滤器“F.U.C.K.”

你忽略了标点符号。

现在这是一个真正的问题,因为像“地狱 o的句子那样!”将被称为“地狱”,和“Wh 屁股上升?”选择“屁股”。

您必须从过滤器中排除许多单词,例如“Cons tit ution”,因为那里有“山雀”在它。

人们也可以使用替代词,例如“Frack”。你也阻止了吗?那么“笔是什么”呢?对于“阴茎”?你的程序没有人工智能来知道字符串是好还是坏。

请勿使用亵渎性过滤器。它们很难发展,而且它们像爬行一样慢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top