朴素贝叶斯过滤垃圾评论,老方法在边缘场景复活
内容平台的评论过滤,主防线是深度模型,但有个边缘场景它罩不住:新上线的小语种社区,标注数据只有几百条,深度模型完全没得训。翻出朴素贝叶斯救场,效果超出预期,记录这次老工具的复活。
选它的理由三条:小样本可用,几百条标注就能跑;训练是数频次,秒级完成,新数据来了随手重训;推理是查表加法,单条评论微秒级,单机每秒几万条,成本约等于零。
文本处理用字符级n-gram而不是分词:小语种的分词器质量存疑,字符2到4 gram的组合对拼写变化和变形词鲁棒,垃圾评论的典型套路,故意拼错关键词躲过滤,字符级特征照样命中。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
clf = make_pipeline(
TfidfVectorizer(analyzer="char_wb",
ngram_range=(2, 4),
min_df=2, max_features=50000),
MultinomialNB(alpha=0.3),
)
clf.fit(train_texts, train_labels)
proba = clf.predict_proba(texts)[:, 1]
效果:1500条标注起步,F1到0.87,两周回流数据涨到3000条后F1 0.91。对比同期用预训练多语言模型做的zero-shot过滤,F1 0.84还慢二十倍。朴素贝叶斯的独立性假设在文本上明明不成立,但分类只需要排序正确,不需要概率精确,理论的粗糙被实践的鲁棒掩盖了。
上线形态很朴素:每小时的定时任务重训,模型文件几十KB,嵌在网关的过滤链最前面,深度模型只处理它放行的部分,整体调用量降了七成,主模型的GPU成本顺带省了一块。
经验提炼:小样本加高并发加低延迟容忍的场景清单摆出来,你会发现朴素贝叶斯几乎是为它量身定做的。算法 toolbox 里永远给简单方法留个位置,新场景的第一道防线,往往轮不到大模型出场。
这个方案的长期表现更新。运行一年后回流数据攒到两万条,期间试过把深度模型重新引入:用朴素贝叶斯的分数当特征之一,叠了一层轻量梯度提升树,F1又提了1.5个点,新老的组合比谁单独出场都强。误报的治理也有进展:把阈值从单一全局改成按评论长度分段,短评论的阈值更严,长评论适当放宽,分段后误杀率降了三成,这个技巧朴素但有效。项目最大的启示已经被写进团队的新场景启动流程:任何新问题,第一周先用最简单的模型上线拿真实反馈,数据分布看清楚再决定要不要上重型武器,一年来这个流程帮我们避免了三次资源浪费,朴素贝叶斯们配得上这份尊重。
- 点赞
- 收藏
- 关注作者
评论(0)