你如何实施一个良好的亵渎filter?
我们中的许多人需要处理用户input,search查询和input文本可能包含亵渎或不良语言的情况。 通常这需要被过滤掉。
在哪里可以find各种语言和方言的好发言单?
是否有包含良好列表的来源的API? 或者,也许是一个简单的说:“是的,这是干净的”或“没有这是肮脏的”与一些参数?
捕捉那些试图欺骗系统的人们有什么好方法,比如$$,azz或者a55?
如果您提供PHP的解决scheme,奖励积分。 🙂
编辑:回答说,只是避免程序性问题:
例如,当用户可以使用公共图像search来查找添加到敏感的社区池中的图片时,我认为有这样的filter的地方。 如果他们可以search“阴茎”,那么他们可能会得到许多照片,是的。 如果我们不想要这样的图片,那么阻止这个词作为检索词是一个好门将,虽然不是一个万无一失的方法。 首先获得单词列表是真正的问题。
所以我真的是指一种方法来找出一个单一的标记是不是很脏,然后简单地禁止它。 我不打扰,像一个完全搞笑的“长颈鹿长颈鹿”的参考预防情绪。 没有什么可以做的。 🙂
猥亵filter:不好的想法,或令人难以置信的交际不良想法?
另外,还有一个不能忘记的事情就是“Toontown's SpeedChat的历史” ,即使用一个“安全词白名单”,一个14岁的孩子也很快地回避了这个问题: “我想把我的长颈鹿粘在你那蓬松的白兔子上“。
底线:最终,对于您实施的任何系统,绝对不能替代人类审查(无论是否同行)。 随意实现一个基本的工具来摆脱驱动器的,但对于确定的巨魔,你绝对必须有一个非基于algorithm的方法。
一个消除匿名性和引入问责制的系统(Stack Overflow做得很好)也是有帮助的,特别是为了帮助对抗John Gabriel的GIFT
你还问了哪里可以得到亵渎名单,让你开始 – 一个开源项目检查是Dansguardian – 检查出他们的默认亵渎名单的源代码。 还有一个额外的第三方短语列表 ,您可以下载代理,这可能是一个有用的拾荒点。
编辑回复问题编辑:谢谢澄清你正在做什么。 在这种情况下,如果你只是想做一个简单的词filter,有两种方法可以做到这一点。 一个是用你想检查的所有被禁止的短语创build一个长的正则expression式,而且只是做一个正则expression式find/replace它。 一个正则expression式:
$filterRegex = "(boogers|snot|poop|shucks|argh)"
并使用preg_match()在批量testing中对您的inputstring运行它,
或preg_replace()将它们删除。
你也可以使用数组加载这些函数,而不是一个长的正则expression式,而对于长单词列表,它可能更易于pipe理。 有关数组如何灵活使用的信息,请参阅preg_replace() 。
有关其他PHP编程示例,请参阅此页面,了解有关字过滤的某种高级generics类 , 该类是经过审查的单词的中心字母,而此前的堆栈溢出问题也有一个PHP示例(其中主要的有价值的部分是基于SQL的过滤词的方法 – 如果你觉得没有必要,可以放弃使用leet的补偿器)。
您还补充说:“首先获得单词列表是真正的问题。 ” – 除了之前的一些Dansgaurdian链接,您可能会发现这个方便的.zip 458个单词是有帮助的。
虽然我知道这个问题相当古老,但这是一个常见的问题。
对于亵渎filter来说,这既有一个原因,也有一个独特的需求(参见这里的维基百科条目 ),但由于非常明显的原因,往往不能100%准确; 背景和准确性 。
这完全取决于你想要达到的目标 – 从最基本的angular度来说,你可能试图掩盖“ 七个脏话 ”,然后一些……一些企业需要过滤最基本的亵渎:基本的发誓的话,url,甚至个人信息等,但其他人需要防止非法帐户命名(Xbox的生活是一个例子)或更多…
用户生成的内容不仅包含潜在的发誓词,还可以包含对以下内容的冒犯性引用:
- 性行为
- 性取向
- 宗教
- 种族
- 等等…
而且可能以多种语言。 Shutterstock已经开发了10种语言的基本脏字词列表 ,但它仍然是基本的,非常重视他们的“标签”需求。 网上还有其他一些列表。
我同意接受的答案,这不是一个明确的科学,语言是一个不断变化的挑战,但90%的捕获率优于0%。 这完全取决于你的目标 – 你想要达到的目标,你拥有的支持水平,以及消除不同types的亵渎的重要性。
在构buildfilter时,您需要考虑以下元素以及它们与项目的关系:
- 词/短语
- 首字母缩略词(FOAD / LMFAO等)
- 误报 (“mishit”,“scunthorpe”和“titsworth”等文字,地名和名称)
- url(色情网站是一个明显的目标)
- 个人信息(电子邮件,地址,电话等 – 如果适用)
- 语言select(默认通常是英文)
- 审核(如果有的话,您可以与用户生成的内容进行交互,以及您可以使用哪些内容进行交互)
你可以轻松地build立一个亵渎filter,抓住90%的亵渎,但你永远不会达到100%。 这是不可能的。 想要达到100%越接近,就越难……在过去曾经构build了一个复杂的亵渎引擎,每天处理500多个实时消息,我会提供以下build议:
一个基本的filter将涉及:
- build立适用的亵渎名单
- 开发一种处理亵渎派生的方法
一个适度复杂的filer会涉及,(除了一个基本的filter):
- 使用复杂模式匹配来处理扩展派生(使用高级正则expression式)
- 处理Leetspeak (l33t)
- 处理误报
一个复杂的filter将涉及以下几个(除了一个中等的filter):
- 白名单和黑名单
- 朴素贝叶斯推断过滤短语/术语
- Soundex函数(一个单词听起来像另一个单词)
- Levenshtein距离
- 词干
- 人类主持人帮助指导过滤引擎学习示例或在没有指导的情况下匹配不够准确(自我/持续改进的系统)
- 也许某种forms的AI引擎
我不知道有什么好的图书馆,但是无论你做什么,都要确保你在让东西通过的方向上犯错误。 我已经处理了不允许使用“mpassell”作为用户名的系统,因为它包含“ass”作为子string。 这是疏远用户的好方法!
在我的一次求职面试中,面试我的CTO试用了我用Java编写的一个单词/网页游戏。 在整个牛津英语词典的单词列表中,第一个被猜出的单词是什么?
当然,这是英语中最犯规的一个词。
不知何故,我仍然得到了工作机会,但是我跟踪了一个亵渎的单词列表( 与此不一样 ),并写了一个快速的脚本来生成一个没有所有坏词的新词典(甚至不必看清单) 。
对于您的具体情况,我认为将search与真实的单词进行比较听起来像是像这样的单词列表的方式。 另外的样式/标点符号需要更多的工作,但是我怀疑用户会经常使用这个问题。
一个亵渎的过滤系统将永远不会是完美的,即使程序员是cocksure并跟上所有的裸体发展
那么,任何“淘气词”列表都可能和其他列表一样performance出来,因为潜在的问题是语言理解 ,这对目前的技术来说是非常棘手的
所以,唯一的实际解决scheme是双重的:
- 准备好经常更新你的字典
- 聘请人工编辑来纠正误报(例如“clbuttic”而不是“classic”)和错误的否定(oops!错过了一个!)
看看CDYNE的亵渎filterWeb服务
testingURL
防止用户input的唯一方法是阻止所有的用户input。
如果你坚持允许用户input并需要适度的话,那就join人工版主。
关于你的“欺骗系统”子问题,你可以在进行search之前对“坏词”列表和用户input的文本进行规范化处理。 例如,使用一系列正则expression式(或tr,如果PHP有它)将[z $ 5]转换为“s”, [4 @]转换为“a”等,然后比较归一化的“坏词”文本。 请注意,规范化可能会导致更多的误报,尽pipe目前我无法想到任何实际情况。
更大的挑战是想出一些让人们在“阴茎”阻塞的同时引用“ 钢笔比剑更强大”的东西。
如果你可以做一些像Digg / Stackoverflow的用户可以downvote /标记淫秽内容…这样做。
那么你所要做的只是检查“淘气”用户,如果他们违反了规则,就会阻止他们。
注意本地化问题:在一种语言中骂什么可能是另一种语言中非常正常的词。
目前的一个例子是:易趣使用字典的方法来过滤反馈中的“坏词”。 如果你试图进入“这是一个完美的交易”(“das war eine perfekte Transaktion”)的德语翻译,ebay会拒绝反馈,因为坏词。
为什么? 因为德语中的“was”是“war”,“war”是ebay中的“bad words”字典。
所以要小心本地化问题。
别。
因为:
- Clbuttic
- 亵渎不是邪恶的
- 亵渎不能有效的定义
- 大多数人很可能不喜欢被亵渎“保护”
编辑:虽然我同意评论说“审查是错误的”,但这不是这个答案的性质。
我对派对有点迟,但是我有一个解决scheme,可以为一些阅读这个的人工作。 这是在JavaScript而不是PHP,但有一个有效的理由。
完全披露,我写这个插件…
无论如何。
我已经走的方法是让用户“select”他们的亵渎过滤。 基本上,亵渎默认是允许的,但如果我的用户不想阅读,他们不需要。 这也有助于“l33t sp3 @ k”的问题。
这个概念是一个简单的jQuery插件,如果客户端帐户启用了亵渎语言筛选,则该插件将被服务器注入。 从那里,这只是一些简单的线条,污点发誓。
这里是演示页面
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>
结果
***将失败,但密码不会
别。 这只会导致问题。 我曾经用亵渎filter的一个独特的个人经验,就是当我被IRC频道踢出/禁止的时候,提到我正在“通过桥接到汉考克几个小时”,或者是出于某种原因。
我同意HanClinto在这个讨论中更高的职位。 我通常使用正则expression式来匹配input文本。 这是一个徒劳无功的工作,就像你刚才提到的,你必须明确地说明在你的“封锁”列表中networking上stream行的每一种写法。
另一方面,虽然其他人正在讨论审查的道德规范,但我必须同意networking上有一些forms是必要的。 有些人只是喜欢张贴粗俗,因为它可以立即冒犯大量的人,而且完全不需要作者的思考。
谢谢你的想法。
HanClinto规则!
一旦你有一个好的MYSQL表格,你想要过滤一些不好的单词(我从这个主题中的一个链接开始),你可以这样做:
$errors = array(); //Initialize error array (I use this with all my PHP form validations) $SCREENNAME = mysql_real_escape_string($_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 'BADWORD' 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 />";
我相信有一个更有效的方法来做所有这些replace,但我不够聪明想出来(这似乎工作正常,尽pipe效率低下)。
我相信你应该允许用户注册,并使用人过滤和添加到你的亵渎表根据需要。 虽然这一切都取决于假阳性的成本(标记为坏的好词)与假阴性(坏词获得通过)的成本。 这应该最终决定你的过滤策略有多么激进或保守。
如果你想使用通配符,我也会非常小心,因为它们有时候比你想要的更麻烦。
坦率地说,我会让他们把“欺骗系统”的话说出来,禁止他们,这就是我。 但它也使编程更简单。
我要做的就是实现一个正则expression式filter,就像这样: /[\s]dooby (doo?)[\s]/i
或者这个词在别人前缀, /[\s]doob(er|ed|est)[\s]/
。 这将防止过滤单词,如安慰,这是完全有效的,但也需要知道其他变种和更新实际的filter,如果你学习一个新的。 显然这些都是例子,但是你必须决定如何自己做。
我不打算把所有我知道的单词都打出来,而不是当我真的不想知道这些单词时。
我同意这个话题是徒劳的,但是如果你必须有一个filter的话,可以看看宁的黄杨木 :
Boxwood是一个PHP扩展,用于快速replace文本中的多个单词。 它支持区分大小写和不区分大小写的匹配。 它要求它操作的文本被编码为UTF-8。
另见这个博客文章的更多细节:
- 在PHP中快速多stringreplace
通过使用黄杨木,您可以根据自己的喜好使用search词汇列表 – search和replacealgorithm不会因search词语列表中的词语变慢而变慢。 它通过构build所有search词的索引来工作,然后只扫描一次主题文本,遍历树中的元素并将其与文本中的字符进行比较。 它支持US-ASCII和UTF-8,区分大小写或不区分大小写,并且有一些以英文为中心的字边界检查逻辑。
我的结论是,为了创build一个好的亵渎filter,我们需要3个主要组件,或者至less这是我要做的。 他们是:
- filter:一个后台服务,validation对黑名单,字典或类似的东西。
- 不允许匿名帐户
- 报告滥用
奖金是奖励那些以准确的虐待记者捐款的人,惩罚罪犯,例如暂停他们的账户。
我收集了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
我build议你执行这个SQL到你的数据库,并检查每次当用户input的东西。
亵渎filter是一个坏主意。 原因是你不能抓住每一个发誓的话。 如果你尝试,你会得到误报。
抓词
让我们只是说你想抓住F字。 很简单,对吧? 那么让我们看看。
你可以通过一个string来find“他妈的”。 不幸的是,现在人们欺骗filter。 亵渎filter没有拿起“福”。
可以尝试检查单词的多个拼写和变体,但这会减慢代码的性能。 要抓住F-Word,你需要find“fuc”,“Fuc”,“fuk”,“Fuk”,“F ***”等,然后列表继续。
避免无罪
好吧,那么如何使它不区分大小写,忽略空格,从而捕捉到“F u C k”? 这听起来似乎是一个好主意,但有人可以绕过亵渎filter“FUCK”
你忽略了标点符号。
现在这是一个真正的问题,因为一个像“ 地狱 o,在那里! 会捡起“地狱”和“ 屁股起来吗?” 捡起“屁股”。
而且还有一些词汇你必须从filter中排除,比如“缺点”,因为里面有“tit”。
人们也可以使用替代性词语,比如“Frack”。 你也阻止了? 关于“阴茎”,“pen”是什么? 你的程序没有人工智能来知道string的好坏。
不要使用亵渎filter。 他们很难发展,他们慢慢爬行。