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

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

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

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

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

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

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

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


当前回答

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

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

其他回答

我同意hanclininto在讨论中发表的文章。我通常使用正则表达式来匹配输入文本。这是徒劳的努力,就像你最初提到的那样,你必须明确地在你的“阻止”列表中解释网络上流行的每一种写作技巧。

另一方面,当其他人在讨论审查的道德问题时,我必须同意在网络上有某种形式是必要的。有些人只是喜欢发表粗俗的文章,因为它可以立即冒犯到很多人,而且作者完全不需要思考。

谢谢你的建议。

HanClinto规则!

也是在游戏后期,但做了一些调查,偶然发现了这里。正如其他人所提到的,如果它是自动化的,这几乎是不可能的,但是如果你的设计/需求可以在某些情况下(但不是所有的时间)涉及人类交互来审查它是否亵渎神明,你可以考虑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的解决方案。

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

关于“欺骗系统”子问题,您可以在进行搜索之前通过规范化“坏词”列表和用户输入的文本来处理它。例如,使用一系列正则表达式(如果PHP有,可以使用tr)将[z$5]转换为“s”,[4@]转换为“a”,等等,然后将规范化的“坏词”列表与规范化的文本进行比较。请注意,规范化可能会导致额外的假阳性,尽管目前我想不出任何实际情况。

更大的挑战是想出一种方法,让人们在引用“笔比剑更强大”的同时屏蔽“pen is”。

我有点晚了,但我有一个解决方案,可能对一些读到这篇文章的人有用。它是用javascript而不是php编写的,但这是有原因的。

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

不管怎样。

我采用的方法是允许用户“选择加入”他们的亵渎过滤。基本上,默认情况下允许使用脏话,但如果我的用户不想读,他们也可以不读。这也有助于解决“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>

结果

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

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

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

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

所以要注意本土化问题。