聊天过滤器现在会说我们全部十二种语言
它原本只有一本词典,而那是英文的。于是另外十一种语言里写的脏话它一句也没拦住——与此同时,它却在拒绝完全普通的词,包括法语里的「三」,而这是一个用骰子玩的游戏。

通俗版
玩家在 opolyx 里敲下的内容中,有四分之一不是英文,而在此之前聊天过滤器一个字都读不懂。它只有一份很大的英文词表,这意味着用俄语、中文、阿拉伯语、西班牙语或德语写的辱骂原封不动地穿了过去。这是你能预料到的那一半。你预料不到的那一半是:同一份词表正忙着拒绝一些一点都不粗鲁的词——法语里的「三」,在一个用骰子玩的游戏里;一个在德语中意为「富有」的词,在一个关于地产的游戏里;还有一个国际象棋棋子的英文名字。一位法国玩家没法在聊天里打出数字三。
现在,网站发布的每一种语言都有了自己的词典,另加乌克兰语,而且每一本都是按那门语言真正如何构词来写的,而不是把英文词表翻译一遍。俄语有词形变化,所以规则必须连着词根和词尾一起命中。中文词与词之间不加空格,所以规则必须往句子内部看。而且当某条消息被拒绝时你收到的提示现在也翻译过了——它原本是英文的,出现在一个有十二种语言的网站上,于是最不可能看懂这句拒绝的人,恰恰最可能收到它。
技术细节
最难的部分是证明这里面有任何东西真的有效,而理由值得直说:一个审核过滤器无法用它自己的聊天记录来检验。被旧过滤器拒绝的消息从来没有被保存过,所以记录里只有穿过去的那些——而对于一门还没有玩家的语言,记录里什么都没有。用它来测试,等于在数幸存者,然后把这叫作覆盖率。所以词典改为对着我们自己的翻译文本来检查:站点的每一个页面、每一种语言,都是我们自己写的,从构成上就是干净的。过滤器在那里标出的任何一个词,按定义就是误报,中间不掺任何主观判断。
| 它做了什么 | 数量 |
|---|---|
| 全部语料中拦下的脏话 | 0 |
| 它现在能看见的脏话 | 113 |
| 被它误标的我们自己的干净页面 | 40 |
昵称比消息分量更重,而它们此前完全没有被过滤。消息会往上走、消失;昵称却印在你每一步棋的旁边,还会被画进这个站点发到 YouTube、Instagram 和 TikTok 的高光短片里。现在它们会被检查——但刻意不用那份大词表,因为作为纯粹的子串,它连「Classic」和「Cassandra」都会拒绝。若天真地拿它跑一遍 opolyx 上两千五百个真实昵称,子串式的做法会标出四十个,其中大约一半是普通名字:Hassan、Yassin、Phoenix。把那种东西发出去,等于告诉这些玩家他们的名字是下流的。
中文这个例子最清楚地说明了,为什么一份英文词表不能简单翻译了事。旧的匹配比较的是用空格分开的完整单词——这是个相当合理的设计,因为正是它避免了「assassin」因为内含一个粗鲁子串而被拒。但中文不用空格分词,于是一整句中文会作为一个巨大的词元抵达,任何词表里的任何条目都永远不可能在它内部匹配上。问题不在于过滤器的中文不好,而在于它在结构上根本看不见中文。
