去年冬天,网站我在一个本地论坛发帖问路,敏感内容里带了“政府”两个字,网站帖子直接被吞了。敏感没有提示,网站没有通知,敏感刷新一下,网站啥都没了。敏感后来我换了个说法,网站把“政府”改成“有关部门”,敏感发出去了。网站这事让我意识到,敏感敏感词过滤早就不只是网站屏蔽几个脏字那么简单。
大多数网站用的敏感是一套叫“DFA算法”的东西,全称是网站确定有限状态自动机。名字听着唬人,原理其实不复杂。你把一堆敏感词建成一棵树,每个字是一个节点,从根往下走。比如“暴力”和“暴恐”,树根是“暴”,下面分叉出“力”和“恐”。用户输入的文字逐字匹配,走到某个节点发现是叶子节点,就判定命中。这套算法快,几十万条词库跑一遍也就几毫秒。问题是它太死板,只认字面,不懂语境。
我认识一个做社区运营的姑娘,她给我看过后台的敏感词库。里面不光有政治词汇,还有“代购”“兼职”“贷款”这类商业词,甚至“微信”“QQ”也在列——因为平台不想让用户把流量导到私域。她说最头疼的是“白名单”机制。比如“习近平”是敏感词,但“学习习近平讲话”这种官方表述又必须放行。技术上的做法是给词库加权重和组合规则,但规则一多,误伤就跟着涨。有次她误封了一个用户,因为那人发了句“这蛋糕做得像炸弹”,系统只抓了“炸弹”,没看“蛋糕”。
更荒诞的是变体对抗。用户会用拼音、谐音、拆字、emoji来绕。你屏蔽“傻逼”,他就写“沙比”“shabi”“傻13”。你屏蔽“死”,他就写“亖”。平台只能不断更新词库,加正则表达式,加模糊匹配。可模糊匹配一开,误杀率飙升。我见过一个摄影论坛,因为把“光圈”里的“光”和某个敏感字组合误判,导致所有讨论镜头的帖子被删。管理员最后只好关掉自动过滤,改人工审核。人工审核又慢又贵,还容易带主观偏见。
大厂的做法是分层处理。第一层是DFA快速拦截,第二层是AI模型判断语境,第三层是人工复审。但小网站没这个资源。很多小站直接买第三方过滤API,按调用次数付费。这些API的供应商往往不透明,词库更新也不及时。有次一个独立博客的站长告诉我,他的评论系统突然把“自由”这个词全屏蔽了,连“自由职业”都发不出去。他查了半天,发现是API供应商那边把词库升级了,没通知他。他只好自己写了个白名单,把“自由职业”“自由泳”加进去。
敏感词过滤的本质是权力和成本的博弈。平台想控制风险,又不想花太多钱。用户想表达,又不想被误伤。两边都在试探边界。我自己的习惯是,发长文之前先复制到记事本,手动替换掉可能触发过滤的词。比如把“杀”改成“鲨”,把“钱”改成“前”。这很麻烦,但比被删帖强。有时候我觉得,我们都在学一门新语言——一门为了绕过机器而不断变形的语言。
前几天我在一个群里看到有人发“ZF”代替“政府”,下面有人回“你直接打政府试试”。那人试了,果然发不出去。然后大家开始用“正府”“政F”“政腐”各种变体。聊了十几条,没一条能正常显示。最后有人发了张图片,上面写着“政府”两个字。图片没被过滤。你看,绕来绕去,又回到了最原始的方式。