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

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

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

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

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

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

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

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


当前回答

我同意这个主题的徒劳,但如果你必须有一个过滤器,看看宁泽涛的黄杨木:

Boxwood是一个PHP扩展,用于快速替换一段文本中的多个单词。支持区分大小写和不区分大小写的匹配。它要求它所操作的文本被编码为UTF-8。

更多细节请参见这篇博客文章:

快速多字符串替换PHP

使用Boxwood,你可以让你的搜索词列表想多长就多长——搜索和替换算法不会因为单词列表上有更多的单词而变慢。它的工作原理是建立一个包含所有搜索词的三元组,然后只扫描你的主题文本一次,遍历三元组中的元素,并将它们与文本中的字符进行比较。它支持US-ASCII和UTF-8,区分大小写或不敏感的匹配,并具有一些以英语为中心的单词边界检查逻辑。

其他回答

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

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

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

不喜欢。这只会导致问题。我个人有一次使用脏话过滤器的经历是,有一次我在IRC频道上提到我“要去汉考克的桥上呆几个小时”或类似的事情,就被踢/禁止进入。

我不知道有什么好的库可以做到这一点,但无论你做什么,都要确保你在让东西通过的方向上犯了错误。我曾经遇到过不允许我使用“mpassell”作为用户名的系统,因为它包含“ass”作为子字符串。这是一种疏远用户的好方法!

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

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

我用12种语言背诵了2200个坏词:恩,ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, ja, ko, nl, pl, pl, ru, tlh, zh。

MySQL转储,JSON, XML或CSV选项可用。

https://github.com/turalus/openDB

我建议你执行这个SQL到你的数据库,并检查每次当用户输入一些东西。