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

在哪里可以找到各种语言和方言的粗口?

源代码中是否有包含好的列表的api ?或者可能是一个API,用一些参数简单地说“是的,这是干净的”或“不,这是脏的”?

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

如果您为PHP提供了解决方案,则会有加分。:)

编辑:回答简单地说,避免程序问题:

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

我指的是一种方法来判断单个令牌是否脏,然后简单地禁止它。我不会费心去阻止那种完全滑稽的“长脖子长颈鹿”的说法。你在那里什么也做不了。:)


当前回答

在我的一次面试中,面试我的公司首席技术官试用了我用Java编写的文字/网页游戏。在整个牛津英语词典的单词列表中,第一个被猜出来的单词是什么?

当然,这是英语中最脏的词。

不知怎的,我还是得到了这份工作,但我后来找到了一个亵渎词列表(和这个一样),并写了一个快速脚本来生成一个没有所有脏话的新字典(甚至不需要查看列表)。

对于你的特殊情况,我认为比较搜索和真实的单词听起来像一个单词列表的方式。另一种风格/标点符号需要更多的工作,但我怀疑用户会经常使用它,成为一个问题。

其他回答

一旦你有了一个好的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 '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 />";

我确信有一种更有效的方法来完成所有这些替换,但我不够聪明,无法找到它(尽管效率不高,但这似乎还可以)。

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

如果您想使用通配符,我也会非常小心,因为它们有时会比您想要的更麻烦。

一个亵渎过滤系统永远不会是完美的,即使程序员很自信,并跟上所有裸露的开发

也就是说,任何“淘气词”列表都可能表现得和其他列表一样好,因为潜在的问题是语言理解,这在当前的技术条件下是相当棘手的

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

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

虽然我知道这个问题相当古老,但这是一个经常发生的问题……

使用脏话过滤器既有原因,也有明显的需求(见维基百科词条),但由于非常明显的原因,它们往往达不到100%的准确性;语境和准确性。

这(完全)取决于你想要达到什么目的——最基本的,你可能想要掩盖“七个脏话”,然后……一些企业需要过滤最基本的脏话:基本的脏话、url甚至个人信息等等,但其他企业需要防止非法账户命名(Xbox live就是一个例子)或更多……

用户生成的内容不仅包含潜在的脏话,还可能包含冒犯性的引用:

性行为 性取向 宗教 种族 等等……

而且可能是多种语言。迄今为止,Shutterstock已经开发了10种语言的基本脏话列表,但它仍然是基本的,非常面向他们的“标签”需求。网上还有很多其他的列表。

我同意一个公认的答案,即它不是一门被定义的科学,因为语言是一个不断发展的挑战,但90%的捕获率总比0%好。这完全取决于你的目标——你想要达到什么目标,你得到的支持程度,以及删除不同类型的脏话有多重要。

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

词汇/短语 首字母缩写(FOAD/LMFAO等) 误报(像“mishit”、“scunthorpe”和“titsworth”这样的单词、地点和名字) url(色情网站是一个明显的目标) 个人信息(电子邮件,地址,电话等-如适用) 语言选择(默认为英文) 适度(如果有的话,如何与用户生成的内容进行交互,以及可以用它做什么)

你可以很容易地建立一个过滤90%以上的脏话的过滤器,但你永远不会达到100%。这是不可能的。你越想达到100%,就越难……在过去建立了一个复杂的脏话引擎,每天处理超过500K条实时消息,我提供以下建议:

一个基本的过滤器包括:

建立一个适用的脏话列表 开发一种处理脏话衍生的方法

一个中等复杂的文件归档器将包括,(除了一个基本的过滤器):

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

一个复杂的过滤器将包括以下一些(除了一个中等的过滤器):

白名单和黑名单 短语/术语的朴素贝叶斯推理过滤 Soundex函数(一个词听起来像另一个词) Levenshtein距离 阻止 人类版主帮助引导过滤引擎通过例子学习,或者在没有指导的情况下匹配不够准确(自我/持续改进的系统) 也许是某种形式的AI引擎

看看CDYNE的亵渎过滤器Web服务

测试网址

如果你能做一些像Digg/Stackoverflow那样的事情,让用户可以投票/标记淫秽内容……这样做。

然后你所需要做的就是审查那些“淘气”的用户,如果他们违反了规则,就把他们屏蔽掉。