背景截至今年8月,知乎注册用户已突破2亿。对于垃圾邮件的治理,我们面临着更大的挑战和考验。过去,我们通过不断升级《悟空》的策略引擎,结合行为、环境、资源、文本等多个维度的应用,取得了很好的效果。最近,我们尝试引入深度学习来识别垃圾短信,《悟空》对垃圾短信的管理能力又上了一个新台阶。问题分析我们对目前站内的垃圾短信进行了梳理,发现主要有四种形式:导流内容:此类内容可占社区垃圾短信的70%-80%,典型的包括培训机构,美容院等,保险,代购相关。导流内容会涉及QQ、手机号、微信、网址甚至座机。在一些特殊的时间节点,会出现各种特殊的垃圾文,比如世界杯,双十一,双十二。一分钱的好时机。品牌内容:这类内容会有比较典型的SEO特征。一般内容不会有明显的转向标志。作弊的形式会以一问一答的形式出现,比如问是什么牌子的?培训学校呢??然后在相应的答案中进行推荐。欺诈内容:此类内容一般以冒充名人或组织的形式出现,如自行车退票,并在内容中提供虚假的客服号码进行诈骗。骚扰内容:比如一些诱导性、调查性的群发内容,严重影响好友体验。这些垃圾文本的核心好处一方面是为了站内传播,另一方面是为了搜索引擎达到SEO的目的。算法介绍从算法的角度来看,这个问题可以看作是一个文本分类问题,将网站中的内容分为垃圾文本和正常文本两类。常用的文本分类算法有很多,我们不打算详细介绍每个分类算法,只是分享我们在处理实际问题中遇到的一些问题和权衡。我们的第一个问题是使用CNN还是RNN。一般来说,CNN是分层架构,而RNN是连续结构。CNN适用于一些关键字确定的任务;RNN适用于顺序建模任务,例如语言建模任务,这些任务需要在理解上下文的基础上进行灵活建模。这个结论是显而易见的,但是目前的NLP文献中还没有支持性的文章。另外,一般来说,CNN的训练速度和预测速度都比RNN快。考虑到网站垃圾文本的上述几种主要形式,在导流和品牌内容中都会出现关键词,对垃圾文本检测的速度要求比较高,所以我们最终采用了CNN。一个典型的CNN文本分类模型如下图所示。接下来,我们遇到的一个问题就是是用词还是单词作为输入。词比字符具有更高的抽象层次和更丰富的含义。而导流内容中的QQ、手机号、微信、网址、座机等,通常不会出现在现有的词库中。品牌词也有类似的特点,一般都是未注册词。而且导流内容中经常出现变体词,使用词作为输入不能很好地捕捉相似特征。所以,我们最终使用单词作为输入。决定使用词作为输入后,需要考虑是用知乎语料上预训练的词向量来初始化模型的Embedding层,还是直接在分类模型中随机生成初始词向量。这里考虑的是垃圾文本的数据分布与知乎中知乎文本的数据分布有很大的不同。与站点中的正常文本相比,垃圾文本是一个相对特定的字段。因此我们使用词向量的随机初始化。决定使用词向量后,我们观察到“有意者加我咨询:2839825539”、“寻找北京·和·和·天·夏”等关键信息的词条通常很长。因此,CNN需要更大的感受野来提取相关的文本特征。如果简单地增加卷积核的大小,参数的数量就会增加。我们考虑使用DilatedConvolution在不增加网络参数数量的情况下增加卷积的感受野。典型的扩张卷积如下图所示。此外,我们观察到需要识别的垃圾文本并不都是短文本,其中有一部分是长文本。由于文本的长度,如果将卷积层的输出简单平均后输出到全连接层,那么文本中能够判断是否为垃圾文本的关键特征很可能会被其他特征淹没,很难提高模型的准确性。因此,我们添加了一个注意力层,通过该层我们为关键特征赋予更多权重。Attention的计算方法如下图所示。通过以上分析,我们最终采用的模型结构如下图所示。垃圾文本分类算法的结构模型效果目前,垃圾文本模型会对知乎中的所有内容进行打分,输出一个0-1之间的分数,系统会对得分高的内容进行处理。模型评分在知乎部分业务线上的表现:文本评分>=0.9准确率>=0.8准确率>=0.7准确率回答100.0%99.8%95.6%提问100.0%99.1%97.7%评论100.0%99.6%98.0%目前情况下,该模型结合其他反作弊维度可以实现删除垃圾评分为0.5及以上的内容,准确率可达97%以上。自上线以来,每天都有数千条垃圾内容被删除。实时模型处理另外值得一提的是,端午节期间,知乎上出现了一波非法垃圾邮件。垃圾文本模型覆盖了98%以上的内容,使得这波攻击持续了大约1000条消息就停止了。端午节垃圾邮件攻击后续计划垃圾邮件文本识别是一个长期的攻防过程。站点上的垃圾文本会随着时间不断演变,现有模型的效果也会相应发生变化。为了应对网站垃圾文本的挑战,我们会一直收集badcase,进一步优化模型效果。最后,由于本人水平有限,如有错误疏漏,欢迎各位同学指正。作者:孙军,知乎内容质量团队算法工程师。主要负责导流信息识别、垃圾文本识别和文本情感分析模型的开发和维护。
