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

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

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

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

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

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

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

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


当前回答

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

其他回答

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

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

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

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

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

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

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

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

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

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

一个基本的过滤器包括:

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

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

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

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

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

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

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

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

所以要注意本土化问题。

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

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

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

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

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

快速多字符串替换PHP

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

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

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

谢谢你的建议。

HanClinto规则!