UGC评论双层过滤,说白了就是把审核拆成两道工序。第一道是技术层面的粗筛,用算法和规则把明显违规、灌水、广告、辱骂的内容直接拦截;第二道是运营层面的精筛,用人工或更复杂的语义模型,对“擦边球”内容进行深度判断。这两层不是简单的先后关系,而是协同作战。很多团队只做一层,要么误杀严重,要么漏网之鱼太多。双层过滤的核心价值在于,让机器做机器擅长的事,让人做人擅长的事,最终在内容安全、审核效率和用户体验之间找到平衡点。
第一层:规则引擎与特征匹配的粗筛第一层过滤必须快,毫秒级响应,不能让用户感觉发布后有明显的延迟。这一层的技术底座通常是正则表达式、关键词词库、文本相似度算法和行为特征分析。先说正则,这是最基础也最容易被滥用的工具。很多团队一上来就维护一个庞大的敏感词库,用正则暴力匹配,结果误杀率极高。比如“裸露”是敏感词,但用户发的是“这块岩石裸露在外”,就被误杀了。正确的做法不是堆词,而是做词性标注和上下文分析。你可以用“敏感词+动词/名词组合”的方式来缩小打击面,比如“裸露”后面紧跟“身体”“照片”等词时才触发。
关键词词库要分层级。一级词是红线词,涉及法律法规明令禁止的内容,命中即拦截,不需要进入第二层。二级词是风险词,比如竞品名称、疑似辱骂词汇、低俗暗示词,这类词命中后不直接拦截,而是标记为“待审”,扔给第二层处理。三级词是观察词,比如“加微信”“私聊”这类导流倾向的词,可以结合用户行为特征综合判断。词库的维护不能靠拍脑袋,要定期从拦截日志和申诉内容里反向挖掘,把误杀的词降级,把新出现的变体词补充进去。
文本相似度算法在这一层主要用于识别批量灌水、重复广告和模板化评论。SimHash和MinHash是常用的局部敏感哈希算法,能把文本映射成固定长度的指纹,通过汉明距离快速判断相似度。但要注意,单纯靠文本相似度容易漏掉变体,比如广告党把“加我VX”改成“加我威信”或“加我V信”,哈希值就变了。所以需要结合编辑距离和拼音归一化。把“威信”“VX”“V信”都归一化成“微信”,再做相似度判断,召回率能提升不少。这一层的算法不要追求极致准确,宁可多标记一些“待审”,也不要放掉高风险内容。
行为特征分析是第一层里容易被忽视但极其有效的维度。一个正常用户发布评论的频率、文本长度分布、互动模式都是有规律的。如果一个账号在短时间内连续发布多条高度相似的评论,或者注册后立刻开始发带链接的内容,或者IP地址频繁跳变,这些行为特征本身就可以作为拦截信号。你可以设计一个评分模型,把文本风险分和行为风险分加权求和,超过阈值的自动拦截或转人工。这个模型不需要多复杂,逻辑回归就能搞定,关键是特征工程要扎实。
第二层:语义理解与上下文感知的精筛经过第一层过滤后,大约90%以上的垃圾内容已经被拦截,剩下那不到10%的“待审”内容才是真正的硬骨头。这些内容包括反讽、隐喻、拼音替换、拆字、谐音、多义词歧义等。第二层过滤的核心任务就是处理这些语义层面的复杂性。这一层通常有两种实现路径:纯人工审核,或者“AI预判+人工复核”的人机协同模式。纯人工的弊端很明显,成本高、效率低、标准不一致,而且审核员的心理压力大。现在更主流的做法是用预训练语言模型做语义理解,给出风险等级和理由,人工只处理模型判断不准的边界案例。
模型选型上,BERT及其变体在中文短文本分类上表现足够好。你可以用自己积累的标注数据在BERT-base-chinese上做微调,做一个多分类或回归任务,输出“正常”“违规”“疑似”三个类别,以及对应的置信度。训练数据是关键,不要只标注明显的违规内容,更要大量标注那些“看起来正常但实际有问题”的案例,比如用“你真是个天才”来表达讽刺,字面上是夸奖,实际上是辱骂。这类样本需要结合对话上下文才能判断,所以模型输入不能只给单条评论,要把评论所在的帖子标题、被回复的内容、甚至用户历史行为序列一起编码进去。
上下文感知是第二层过滤的灵魂。一条评论单独看可能没问题,但放在特定语境下就有风险。比如一篇关于某地自然灾害的报道下,有人评论“这就是报应”,单独看这句话没有任何敏感词,但结合文章主题,这就是恶意言论。实现上下文感知,技术上可以把文章标题和前几条评论作为上下文拼接到输入序列中,用特殊分隔符隔开,让模型学习上下文与目标评论之间的关联。更进阶的做法是用图神经网络,把用户、评论、帖子构建成异构图,通过消息传递机制捕捉节点之间的高阶关系,但工程复杂度会高不少。
第二层还有一个容易被忽略的环节,就是审核标准的动态校准。运营团队每周至少要拉一次审核数据做分析,看各类违规内容的拦截率、误杀率和漏网率。如果发现某一类违规内容漏网率突然升高,通常是黑产找到了新的绕过方式,这时候需要快速补充对抗样本重新训练模型。同时要建立申诉机制,让用户对被误杀的内容进行申诉,申诉成功的数据是最宝贵的负样本,能直接告诉你模型哪里判断错了。把这些数据加入训练集,模型的鲁棒性会持续提升。
两层之间的协同机制设计双层过滤不是简单的流水线,两层之间需要有信息传递和反馈闭环。第一层在拦截或标记内容时,应该把触发的原因也记录下来,比如命中了哪个关键词、相似度达到了多少、行为评分是多少。这些信息要跟着内容一起流转到第二层,这样人工审核或模型复核时就能快速定位问题点,而不是从头看一遍。同时,第二层的审核结果要反向回流到第一层,用来优化规则和模型。比如人工审核发现某个关键词最近十次触发都是误杀,系统就应该自动把这个词的权重降低,或者暂时移出拦截词库。
技术实现上,建议用消息队列来解耦两层之间的通信。用户发布评论后,先进入第一层处理,处理结果写入消息队列,第二层从队列里消费“待审”状态的内容。这样做的好处是两层可以独立扩缩容,第一层流量大但计算轻,第二层流量小但计算重,分开部署能节省资源。同时,消息队列的持久化特性也能保证审核任务不丢失。对于需要实时返回结果的场景,比如评论发布后用户期望立刻看到,第一层拦截的直接返回失败,第一层放行的直接发布成功,第一层标记待审的可以先发布但对用户不可见,等第二层审核通过后再公开。这种“先发后审”的策略能兼顾体验和安全,但需要产品层面做好预期管理,告诉用户评论正在审核中。
对抗升级下的持续迭代策略黑产的绕过手段每天都在进化,双层过滤体系必须具备持续对抗的能力。常见的绕过方式包括:拆字,把“傻逼”拆成“亻尔亻象个木不”;谐音,用“煞笔”“沙雕”代替原词;emoji替代,用茄子加桃子的表情组合暗示某些词汇;图片评论,把文字做成图片发出来。针对拆字和谐音,可以在第一层增加拼音归一化和拆字还原的预处理步骤。具体做法是维护一个拆字映射表,把常见的拆字组合还原成原字,再做敏感词匹配。针对emoji,需要建立emoji的语义映射,比如“茄子+桃子”在某些语境下对应特定含义,这需要结合上下文来判断,放在第二层处理更合适。
图片评论的处理要单独走一条链路。第一层用OCR提取图片中的文字,然后把提取出的文字送入文本审核流程。但OCR本身有识别率问题,而且黑产会在图片上加干扰线、扭曲变形来对抗OCR。所以对于OCR识别置信度低的图片,或者检测到图片中存在文字区域但识别结果不完整的,直接标记为待审,交给第二层人工查看。同时可以用图像分类模型检测图片是否包含色情、暴力等违规视觉内容,这个模型和文本审核模型并行运行,任意一个模型判断为高风险就触发拦截。
整个双层过滤体系的健康度需要一套监控指标来衡量。核心指标包括:拦截率、误杀率、漏网率、人工审核占比、平均审核耗时、用户申诉率。拦截率不能一味追求高,拦截率过高往往意味着误杀率也在上升。更合理的北极星指标是“用户投诉率”或“违规内容曝光率”,直接反映最终用户体验和平台风险。每周做一次全链路压测,用历史数据和对抗样本集评估各环节的表现,发现问题及时调优。这套体系搭建起来后,初期可能需要投入较多人力做数据标注和规则梳理,但跑顺之后,日常维护成本会逐步降低,最终形成一个能自我进化的内容安全闭环。
