我们中的许多人都需要处理用户输入、搜索查询以及输入文本可能包含亵渎或不受欢迎的语言的情况。通常情况下,这需要过滤掉。
在哪里可以找到各种语言和方言的粗口?
源代码中是否有包含好的列表的api ?或者可能是一个API,用一些参数简单地说“是的,这是干净的”或“不,这是脏的”?
有什么好方法可以捕捉那些试图欺骗系统的人,比如$$、azz或a55?
如果您为PHP提供了解决方案,则会有加分。:)
编辑:回答简单地说,避免程序问题:
我认为,当用户可以使用公共图像搜索来查找添加到敏感社区池的图片时,这种过滤器是有一席之地的。如果他们可以搜索“阴茎”,那么他们可能会得到很多照片,是的。如果我们不想要照片,那么阻止这个词作为搜索词是一个很好的把关者,尽管不可否认这不是一个万无一失的方法。真正的问题是首先获得单词列表。
我指的是一种方法来判断单个令牌是否脏,然后简单地禁止它。我不会费心去阻止那种完全滑稽的“长脖子长颈鹿”的说法。你在那里什么也做不了。:)
淫秽过滤器:坏主意,还是令人难以置信的坏主意?
此外,我们不能忘记Toontown的SpeedChat的不被人知的历史,在那里,即使使用“安全词白名单”,也会导致一个14岁的孩子迅速绕过它:
“我想把我的长脖子长颈鹿插到你毛茸茸的白兔子身上。”
底线:最终,对于您实现的任何系统,绝对没有什么可以替代人工评审(无论是同行评审还是其他评审)。你可以随意使用一个基本的工具来消除这种恶意攻击,但对于那些顽固的恶意攻击者,你绝对必须使用一种非基于算法的方法。
一个消除匿名并引入问责制的系统(Stack Overflow在这方面做得很好)也很有帮助,特别是为了帮助对抗约翰·加布里埃尔的G.I.F.T.
你还问你从哪里可以得到亵渎列表来开始你的学习——一个开源项目是Dansguardian——看看他们默认的亵渎列表的源代码。还有一个额外的第三方短语列表,你可以为代理下载,这可能是一个有用的收集点。
编辑:谢谢你对你想要做的事情的澄清。在这种情况下,如果你只是想做一个简单的单词过滤器,有两种方法可以做到。一种方法是创建一个单独的长regexp,其中包含您想要审查的所有禁用短语,并使用它进行regex查找/替换。像这样的正则表达式:
$filterRegex = "(boogers|snot|poop|shucks|argh)"
并使用preg_match()在输入字符串上运行它来批量测试命中,
或preg_replace()来清空它们。
您还可以使用数组加载这些函数,而不是单个的长正则表达式,对于长单词列表,它可能更易于管理。有关如何灵活使用数组的一些好例子,请参阅preg_replace()。
有关其他PHP编程示例,请参阅本页,其中有一个比较高级的用于单词过滤的泛型类,它从经过审查的单词中删除了中间的字母,以及前面的Stack Overflow问题,其中也有一个PHP示例(其中主要有价值的部分是基于sql的过滤单词方法——如果您发现它不必要,可以省去let -speak补偿器)。
你还补充说:“真正的问题是首先获得单词列表。”——除了之前的一些丹斯格尔链接,你可能会发现这个458个单词的。zip很有用。
虽然我知道这个问题相当古老,但这是一个经常发生的问题……
使用脏话过滤器既有原因,也有明显的需求(见维基百科词条),但由于非常明显的原因,它们往往达不到100%的准确性;语境和准确性。
这(完全)取决于你想要达到什么目的——最基本的,你可能想要掩盖“七个脏话”,然后……一些企业需要过滤最基本的脏话:基本的脏话、url甚至个人信息等等,但其他企业需要防止非法账户命名(Xbox live就是一个例子)或更多……
用户生成的内容不仅包含潜在的脏话,还可能包含冒犯性的引用:
性行为
性取向
宗教
种族
等等……
而且可能是多种语言。迄今为止,Shutterstock已经开发了10种语言的基本脏话列表,但它仍然是基本的,非常面向他们的“标签”需求。网上还有很多其他的列表。
我同意一个公认的答案,即它不是一门被定义的科学,因为语言是一个不断发展的挑战,但90%的捕获率总比0%好。这完全取决于你的目标——你想要达到什么目标,你得到的支持程度,以及删除不同类型的脏话有多重要。
在构建过滤器时,你需要考虑以下元素以及它们与你的项目的关系:
词汇/短语
首字母缩写(FOAD/LMFAO等)
误报(像“mishit”、“scunthorpe”和“titsworth”这样的单词、地点和名字)
url(色情网站是一个明显的目标)
个人信息(电子邮件,地址,电话等-如适用)
语言选择(默认为英文)
适度(如果有的话,如何与用户生成的内容进行交互,以及可以用它做什么)
你可以很容易地建立一个过滤90%以上的脏话的过滤器,但你永远不会达到100%。这是不可能的。你越想达到100%,就越难……在过去建立了一个复杂的脏话引擎,每天处理超过500K条实时消息,我提供以下建议:
一个基本的过滤器包括:
建立一个适用的脏话列表
开发一种处理脏话衍生的方法
一个中等复杂的文件归档器将包括,(除了一个基本的过滤器):
使用复杂的模式匹配来处理扩展派生(使用高级正则表达式)
处理Leetspeak (l33t)
处理误报
一个复杂的过滤器将包括以下一些(除了一个中等的过滤器):
白名单和黑名单
短语/术语的朴素贝叶斯推理过滤
Soundex函数(一个词听起来像另一个词)
Levenshtein距离
阻止
人类版主帮助引导过滤引擎通过例子学习,或者在没有指导的情况下匹配不够准确(自我/持续改进的系统)
也许是某种形式的AI引擎