腾讯音乐评论审核、分类与排序算法技术
分享嘉宾:yiping TME 算法工程师
编辑整理:桑小晰 深交所
出品平台:DataFunTalk
导读: 本次分享的题目为音乐评论AI审核与排序,主要围绕以下三个方面展开:
- 背景介绍
- 评论审核
- 评论排序
01 背景介绍
1. 业务场景对比
音乐评论是音乐类APP里面比较重要的模块之一,它是用户表达心情和观点的窗口。我们主要有两个相关的业务场景,第一个是QQ音乐,第二个是全民K歌。这两个业务场景的评论是有差异的。QQ音乐中的评论类型很丰富,包括个人崇拜类、玩梗类、个人听歌感受类等。通常这些评论长难句子相对较多,语法较难。而K歌中的评论主要以互动和评价为主,句子较短,语法相对简单。此外,QQ音乐每日的新增评论大约有几十万条,而全民K歌则有千万量级之多。
2. 评论审核
评论审核指根据评论的质量去操作评论的状态。比如,对于一些抄袭、辱骂、或是包含敏感词的评论,我们会对它们进行隐藏,删除或者设为仅自己可见等等;对于一些轻度负面或者盖楼型的评论,我们可能会给它贴上劣质的标签,在排序上进行降权,减少曝光。此外,对于一些潜在的优质评论,是指那些文字写得不错,并且跟歌曲内容比较相关,但是因为点赞数较低而处于一个比较靠后的排序位置的评论,我们会在短期内给它们一个头部位置,使它们得到足够多的曝光。
我们针对不同的业务场景训练模型,让模型给出操作建议来辅助审核,甚至自动审核,以达到减少人力成本的目的。
3. 评论排序
好的排序可以极大提升用户阅读评论的体验。我们的算法需要综合考虑更多的因素,给出更优的分发方式。我们主要考虑了两类因子:
第一个是文本语义标签,包括文本的质量、主题、情绪等等。第二个是后验因子,包括评论的点赞、回复以及点赞飙升情况等。
上图是我们的一个排序白板,带颜色的部分是评论的文本标签,后面是它的置信度。而图右的一些数值就是后验因子。
我们将相关技术应用到QQ音乐的评论排序上面,在最热和最新tab的基础上增加了一个推荐序tab,使得排序核心指标得到了有效的提升。
02 评论审核-QQ音乐
1. 业务目标
审核的人力无法满足需求,因此我们 需要借助NLP实现两个业务目标 :①使用模型辅助审核,提高审核效率。②实现部分评论的自动审核。
上图右侧红框内是文本质量标签和模型给出的处理意见,其下面打码的部分是一些具体操作。
2. 质量模型
基于上述业务目标,我们 构建了一个质量模型 。 我们把文本质量分为优质、良好、普通、劣质四类标签,主要以语言的优美流畅性,与歌曲的相关性,情感极性以及主题类别等作为考量因素。 例如上图中的红色评论,首先它和歌曲名有一定的相关性,并且使用了对偶句式。它的语言是比较优美流畅的,因此,我们给它打上了优质的标签。相较之下,黄色的评论是批评周董唱功,我们就给它打上了劣质的标签。
结合质量标签以及评论状态,模型可以给出具体的操作建议,从而辅助或者替代人工审核。
3. 质量模型-V1
第一版质量模型比较简单,主要是用BERT模型进行编码,然后做四分类。 我们之前提到的优质、良好标签,它的判定需要融入一些歌曲相关性的信息,因此我们使用了Sentence Pair这种方式去引入歌手歌曲等信息,来帮助模型提取相关性特征。此外,在数据增强层面,我们使用了EDA以及适配业务的一些数据增强方法,有不错的效果。
4. 质量模型-V2
① V2模型的业务目标
第一版模型的劣质标签召回率偏低,主要来源于两种类型的漏召回 :
第一个是对抄袭评论的漏召回,比如“初听不识曲中意,再闻已是曲中人。”初看这句话可能会觉得写得还不错,对仗工整,语言优美。但实际上这条评论频繁地出现在各种歌曲下,所以我们把它认定为为抄袭评论,这种评论大量出现在头部评论中,会影响用户阅读体验,因此我们需要给它打上劣质的标签。
第二,质量粗分类模型只能识别一些情绪比较强烈的辱骂评论,针对歌手歌曲客观负面评价难以召回。因此,我们的第二版模型的目标主要是去提升这两类劣质评论的召回。
② 提升抄袭评论的召回
针对抄袭评论的召回,我们使用Min Hash与LSH结合的方式,预先构建抄袭文本词典和倒排索引,哪怕与词典中评论有几字的差别,也可以较快较好地召回,图中是Min Hash & LSH以及其倒排索引构建的过程。
③ 提升攻击歌手歌曲评论的召回
攻击歌手歌曲的评论是一些负面性情感的评论,我们通过构建情感分析模块来处理它们。考虑到情感分析任务的复杂性,音乐评论中有较多情绪并没那么强烈,或是句式结构较复杂的文本,因此我们将此部分从质量模型里面分离开来,单独去构建一个模块。这个模块主要分为评价类分类和感情极性分类两个子模块。
评价类分类模块主要用于判断某评论是不是在评价当前对象(歌手或歌曲)。比如“天气让人心烦”是一条负面性的评论,但它并不是在攻击歌手歌曲,并不需要召回;而“唱得让人心烦”就是典型的一条攻击歌手歌曲的评论,需要模型召回。评价类分类模块就主要起到一个初筛的作用。
然后就是情感极性分类模块,它用于判断句子的情感极性是正向、中立还是负向。
对于评价类分类模型的实现,我们是用BERT进行编码,并且在Embedding层融入歌手歌曲实体信息。例如“DT很不错哦。”、“热狗真棒”这类评论,需要告知模型“DT”、“热狗”为歌手实体,使得模型能正确地召回。
对于情感极性分类任务,我们遇到了 三个难点 。首先是 复杂句式 ,比如说“周杰伦比林俊杰唱得棒。”,对周杰伦而言,它是一个正向情感,而对于林俊杰而言,它是一个负向的情感。所以指定不同的Target,可能情感极性就不同。然后是 领域词典 ,当看到“躁”这个字,我们可能会想到急躁或暴躁,这时它是一个负向情感词。但是在音乐领域里,比如“这首歌很躁。”,它却是一个正向的感受。同样的,“悲”这个字在音乐中可能是一个较中性的个人感受,而非负面。第三个问题是 前期训练数据较少 。
为了解决这些难点,针对前两个问题 我们将传统的Embedding与自定义Embedding进行融合 ,图中式子前三项是传统Embedding方式,后三项是我们的自定义的Embedding。图中的Entity Embedding用于指定评价对象,在这个例子中我们指定了“林”。User Vocab Embedding是自定义词典的Embedding,例子中,“棒”在自定义情感词典中是一个正向情感词,需要加上一个正向的Embedding。Adverb Embedding用来处理一些转折句式,此句式中句子重心通常出现在转折词之后,以此来决定句子的情感极性。有了这些特征之后,还需要大量的数据去强化模型对这些特征的理解。我们主要是使用模板去构造大量的难点句式,包括比较,转折型等等。针对前期训练数据比较少的问题,我们引入了DANN结构,我们使用了不同领域的极性分类数据,把它加到模型中,并引入一个Domain Layers领域分类层进行对抗训练,使得BERT能够提取到领域无关性的特征。
两个子模块需要两次BERT编码,模块性能较差。考虑到这两个任务具有一定的特征相关性,可以用Multi Task共享部分编码层,提升模型性能。这里借鉴了MTAN构建模型;此外,Embedding融合则是延用了之前的方法。BERT作为全局共享网络进行文本编码,不同的GRU对应不同的任务,用于特征提取和分类。此外,在损失函数中,加入了方差不确定性,去动态调整两个损失的权重,并起到去噪的作用。在计算梯度时,引入Gradient Surgery,用于修正梯度冲突。
④ 业务效果
模型的业务效果很不错,针对高精确率或高置信度的一些操作,实现自动审核,人工待审量大幅减少。同时模型给出建议操作可以协助审核人员效率提升20%。此外,审核人员的实际操作,可及时反馈算法侧,通过得到的hard样本,完成模型迭代。
03 评论审核-K歌
1. 业务目标
K歌评论审核主要是对一些辱骂性评论进行展示降权。目前评论的日增千万级,人工审核不现实,所以我们需要模型自动去识别辱骂评论,并自动处理。
2. 辱骂模型-V1
V1版主要是判断某条评论是否为辱骂评论,模型结构仍旧基于BERT。 在数据构建方面,我们采取了伪标签加对抗样本增强的方式。 什么是对抗样本?假设有一个正例数据,我们给它一个轻微的扰动,模型会把它判成负例,并且这个扰动不足以改变句子的原始语义,这样就是一条有效的对抗样本。训练中加入对抗样本,可以极大的提升模型的鲁棒性。 在构建对抗样本时,我们使用了一种基于梯度的白盒攻击方法 ,且具有一定的可解释性,它可以告诉我们哪些字词是模型中比较重要的特征,我们还可以通过构建显著图,来了解模型是不是真学到了有用的特征。相比于图像对抗领域,文本对抗更难,是因为文本的特征是离散的,度量比较困难,稍微改动一两个字,文本的语意可能就会发生巨大的改变。比如“这首歌曲真好听呀! ”,我们把“真”改成“不”,它的情感极性就从正向变成负向,但是它们的Jaccard相似度却依旧很高。
这里使用了Hot Flip方法,图中展开式的L代表损失函数,Δ x是轻微扰动。 意味着我们需要沿着梯度上升的方向去找一个Δ x,这个Δ x能够使得损失函数快速增大。此外,因为文本序列的特征是离散的,我们还需要对Δ x进行离散化处理,模型最终给出了一些有效和无效的对抗样本实例。
除此之外,我们对预训练任务做了一定的修改,融合了目前非常火热的Prompt方法 。
一般来说,首先利用大规模的中文语料得到预训练模型,然后利用目标领域的无标签数据再次预训练。这里我们将Prompt运用在Post Train阶段,希望能得到一个更适配于下游任务的预训练模型。Prompt被证明在few shot场景下有不错的效果,其核心思想是将下游任务转换成一个语言模型或者完形填空的任务。在上图例子中,我们在句子前添加Prefix(Prompt Token),句子其他部分采用传统的MLM采样方式,然后对MSK Token进行预测。此外,不同Prompt模板产生的训练效果差异较大,我们希望通过模型自动找到最合适的Prompt Pattern。
这里借鉴了Auto Prompt的思想,把之前确定性的Prompt全部替换成Mask Token,然后让模型自己去决定Mask Token是什么。我们的目标是要找到一个最好的Prompt,使得LABEL部分的预测损失变小。因此需要沿着梯度负方向去寻找这样的Prompt。此外,我们还加入了语言模型,使得生成的Prompt能够更加流畅。
3. 辱骂模型-V2
第一版模型没有考虑用户的关系链和评论的辱骂等级,比如好友评价“唱的不是很好听,需要继续努力。”,这是比较客观的负面评价,如果把这样的评论也沉底或隐藏了,整个K歌只有单一的正向夸赞的评论,这不是我们所期望的。这里需要将辱骂等级重新切分为非负面、客观负面、轻度辱骂和重度辱骂四个等级,负面程度依次递增,然后根据不同的用户关系进行不同程度的隐藏或沉底。此外,我们希望模型的误伤判错能够控制在相邻等级之间,这样业务损失会比较小。
为了解决这个问题,我们把四分类模型变成了多个二分类模型 。例如,对于一条重度辱骂评论,我们会先去判断它是非负面还是其他三类等级,如果是其他三类,我们才会接着进行后面的判断。此外,在模型层面我们加入了分类链去强化标签之间的相关性。其中,GRU每个时刻生成一个0/1标签,最终得到了一个标签序列,去对应一个具体的辱骂等级。比如一条轻度辱骂评论,它对应的分类序列就是110,重度辱骂对应的序列是1110。此外,我们加入了一个V矩阵来加强不同任务的感知。此外,我们还复用了之前的Prompt MLM预训练模型,有不错的提升。
以上是我们隐藏辱骂的一些实例。V2模型每天能打击万级别的新增辱骂评论。
04 评论排序
1. QQ音乐评论排序现状
之前QQ音乐评论排序只有最热和最新两个tab。最热tab排序出现了较严重的马太效应,头部评论万年不变;还会有一些抄袭、骗赞、负面的头部评论,例如“有人看到这句话麻烦点个赞”等;评论的多样性也比较差,头部经常出现重复性或是主题相同的评论。最新tab排序也存在一定的问题。因为评论是按照发布时间逆序排列的,最新评论没有热度因子(点赞、回复)干预排序,所以可能会导致头部评论的内容质量比较差。所以我们要综合考虑时间,互动,NLP因子来给出一个更好的分发方式。
2. 排序模型-V1
目前的评论上报是不完善的,所以我们使用手写经验公式,其中最重要是热度与NLP因子的融合。其中,热度因子主要包括点赞、回复、时间衰减等等;而NLP因子主要是一些质量、主题、情绪等标签。
此外,我们还对头部评论的主题内容进行了多样性重排。我们采用了推荐中常用的DPP算法,同时融合了热度信息,利用Cholesky矩阵分解和贪心的方法求近似解,就可以得到内部相似度较低,而热度较高的评论子集。上述行列式中使用了文本相似度计算,因此我们还需要提前对文本进行向量化处理,这里使用LSA主题模型,先将文档词矩阵进行SVD分解,得到文档主题矩阵,然后再计算相似度。多样性重排的方式很好地解决了头部评论主题重复的问题,提升了内容丰富性。
3. 排序模型-V2
① V2模型的业务目标
V1版的模型存在一个明显的问题,即对一些与歌曲无关或弱相关的一些优质良好评论会给予较高的语义分数。例如上图例子中歌曲《水星记》下的两条评论,模型同时给予了第一条和第二条评论优质的标签。从文本和语言角度看,两条评论都很优美。然而第一条包含了“银河”、“星空”等与歌曲信息相关的主题词,所以它与歌曲的相关性明显更强。但是之前的质量模型并没有充分考虑这种相关性,因此我们需要再加入一个相关性模型,在优质标签的基础上再分档,从而使得与歌曲更相关的评论能够得到更高的语义分数。
此外,我们之前使用的质量模型在判断相关性上也存在明显的缺陷。首先,考虑到我们需要把歌词,演唱会等更多的信息融入到输入中,质量模型采用的Sentence Pair 这种方式会导致输入序列过长,有可能超过BERT模型的最长处理长度;其次使用CLS可能会使模型看到并过分依赖描述信息,导致过拟合。因此我们重新构建了一个相关性模型,并分为相关性预训练和相关性分类任务两个阶段。要做预训练是因为相关性判定需要使用到标注数据,然而其标注成本较高,所以我们想通过一些自监督的方法,使得相关性分类任务能够得到较好的初始化参数。
② 相关性预训练
我们的预训练模型使用了MLM任务和百万量级的QQ音乐评论。考虑到相关性高的评论中的一些字词或者主题等可能来自于歌词,歌曲名或者描述信息,所以在MLM生成Token时时需要考虑这部分信息的。这里分别对歌曲和评论进行编码,然后通过局部多头注意力机制层,用歌曲信息去表示MSK部分。之后,使用一个门控层去帮助模型取舍评论文本和歌曲信息,并最终得到一个向量表示来进行MSK部分的预测。假设评论的某部分和歌曲信息某部分相同或者具有相同的上下文,那么歌曲信息部分对MLM预测的贡献度就较高,对应门控层中红色部分的模也会较大,这在一定程度上反映了歌曲和评论的相关性。
③ 相关性分类任务
我们的相关性分类任务复用了之前的模型结构和参数。之前提到上图红色的部分代表相关性信息,我们这里将它和模型原始BERT Embedding进行了拼接,去做一个强相关,弱相关和无关的三分类任务。我们把相关性标签应用到排序中,相关性较高的优质评论的排名会上升,最终评论点赞率有所提升。
05 未来展望
1. 评论审核
评论审核方面,我们后期的目标是对整体的审核准确率进行持续优化。对人工审核的数据实现自动清洗并且扩充训练集。此外,我们还准备开放更多的音乐评论标签的服务接口。
2. 评论排序
排序上,我们将推进评论流水上报,将经验公式变成排序模型。此外,我们也会对语义因子进行扩展和持续优化。
06 Q & A
Q1:排序中的相似度计算会不会很费资源?
A1:不会。因为我们使用的是LSA方法,它的向量化比较简单,其本质就是做SVD矩阵分解。
Q2:情感分析中提到的转折性句式是什么?
A2:例如“你前面唱的还可以,但是后面唱的不太行”,这句话我们认为它的重心是“但是”转折词后面那句话,即我们认为这是比较偏负向的一条评论。再例如“你后面唱的不行,即使你前面唱得很好”,这样的句子重心就在前面。我们通过加入转折词概念的方式来让模型去知道句子的重心在哪里,帮助模型去判断。
Q3:自定义Embedding和BERT Embedding是如何拼接的?
A3:我们是在传统Embedding的基础上加上自定义Embedding,但是我们是在Norm之后加上的,因为我们发现这种方式效果更好。如果直接将两者拼接,自定义Embedding的信息会被之前的BERT Embedding淹没掉。