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

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

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

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

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

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

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

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


当前回答

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

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

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

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

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

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

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

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

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

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

一个基本的过滤器包括:

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

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

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

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

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

其他回答

也是在游戏后期,但做了一些调查,偶然发现了这里。正如其他人所提到的,如果它是自动化的,这几乎是不可能的,但是如果你的设计/需求可以在某些情况下(但不是所有的时间)涉及人类交互来审查它是否亵渎神明,你可以考虑ML. https://learn.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity是我目前的选择,原因有很多:

支持多种本地化 他们不断更新数据库,所以我不必跟上最新的俚语或语言(维护问题) 当有很大的可能性(即90%或更多)时,你可以务实地否认它 你可以观察哪个类别会导致一个可能是或不是亵渎的标记,并可以让某人检查它,告诉它是否是亵渎的。

For my need, it was/is based on public-friendly commercial service (OK, videogames) which other users may/will see the username, but the design requires that it has to go through profanity filter to reject offensive username. The sad part about this is the classic "clbuttic" issue will most likely occur since usernames are usually single word (up to N characters) of sometimes multiple words concatenated... Again, Microsoft's cognitive service will not flag "Assist" as Text.HasProfanity=true but may flag one of the categories probability to be high.

当OP询问“a$$”时,这是我通过过滤器传递的结果:,正如你所看到的,它已经确定它不是亵渎的,但它有很高的概率是亵渎的,所以标记为审查(人类交互)的建议。

当概率高的时候,我可以返回“对不起,那个名字已经有人了”(即使没有),这样对反审查的人来说就不那么冒犯了,如果我们不想整合人工审查,或者返回“您的用户名已经通知到直播运营部门,您可以等待您的用户名审核通过或选择其他用户名”。之类的……

顺便说一下,这个服务的成本/价格对于我的目的来说是相当低的(用户名多久会被更改一次?),但是,对于OP来说,可能设计需要更密集的查询,并且可能不适合支付/订阅ml服务,或者不能进行人工审查/交互。这完全取决于设计……但如果设计确实符合要求,也许这可以成为OP的解决方案。

如果有兴趣,我可以在将来的评论中列出缺点。

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

如果你坚持允许用户输入,并且需要审核,那么就加入人工审核员。

我的结论是,为了创建一个好的脏话过滤器,我们需要三个主要组件,或者至少这是我要做的。他们是:

过滤器:一个针对黑名单、字典或类似的东西进行验证的后台服务。 不允许匿名账户 报告滥用

奖金,它将以某种方式奖励那些贡献准确的滥用记者和惩罚罪犯,例如暂停他们的帐户。

注意本地化问题:在一种语言中是脏话的词在另一种语言中可能是完全正常的词。

目前的一个例子是:ebay使用字典的方法从反馈中过滤“坏词”。如果你试图输入德语翻译的“this was a perfect transaction”(“das war eine perfekte Transaktion”),ebay将会因为用词不当而拒绝反馈。

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

所以要注意本土化问题。

坦率地说,我会让他们把“欺骗系统”的字眼去掉,取而代之的是禁止他们,这只是我的想法。但它也使编程更简单。

我要做的是实现一个正则表达式过滤器,像这样:/[\s]dooby (doo?)[\s]/ I,或者这个单词在其他单词上有前缀,/[\s]doob(er|ed|est)[\s]/。这将阻止过滤单词,如assuaged,这是完全有效的,但也需要其他变体的知识,并更新实际的过滤器,如果你学习了一个新的。显然,这些都是例子,但你必须自己决定如何做。

我不会把我知道的所有单词都打出来,尤其是当我并不想知道它们的时候。