✏️ 作者介绍:
王婷婷,搜狐自然语言算法工程师
1. 基于语义向量的内容召回
1.1 场景介绍
随着互联网和移动终端的发展,用户获取信息的需求越来越高——从以前单一地接受信息到现在主动获取自己感兴趣的资讯。搜狐新闻客户端的重要任务就是根据用户喜好向用户推荐他们感兴趣和关心的新闻,从而提升新闻点击率和阅读时长。
搜狐新闻会记录用户的浏览行为以形成用户画像。随着用户浏览新闻的次数不断增加,用户画像也能够更精确地反映用户需求。搜狐新闻 APP 采用自研算法筛选海量新闻资讯,之后再基于用户画像将筛选出来的资讯推送给可能感兴趣的用户,最终达到向用户推荐个性化新闻文章的目的。
搜狐新闻推荐系统中有多种召回方式可以用来寻找用户可能感兴趣的新闻。其中一种召回方式就是基于语义向量的内容召回。它通过提取用户历史浏览新闻的关键词,获得用户感兴趣的关键词。之后,基于这些关键词从海量文章中快速查找用户感兴趣的文章,根据点击率判断新闻热度,最终确定推荐给用户的新闻。搜狐新闻需要为大量用户提供实时新闻。这就要求系统在尽可能短的时间内完成搜索,并以小时为单位,基于用户兴趣关键词在新产生的新闻中搜索用户可能感兴趣的新闻。因此,搜狐新闻推荐系统对向量搜索引擎有两点要求:在处理海量数据时需要准确、快速;在搜索时减少内存占用,能够进行高性能部署。综合上述需求,我们选择将 Milvus 作为语义向量搜索引擎。
1.2 处理流程
基于语义向量的内容召回采用双塔模型结构,双塔模型的两侧分别是用户的语义向量和新闻的语义向量。通过比较两次语义向量的余弦相似度,将最相似的一批新闻送入推荐新闻候选池。然后,再对这批候选新闻进行点击率预估并排序。最后,将预测点击率最高且用户比较感兴趣的新闻推送给用户。
双塔模型的一侧是新闻语义向量,需要用 bert-as-service 工具将新闻转化为语义向量。由于字数超过 512 字的长新闻在向量转化时会丢失信息,我们会在向量转化前提取长新闻的摘要,再将摘要转化为 768 维语义向量。随后我们会从每条新闻中提取两个最主要的主题,根据主题 id 找到对应的已经训练好的两个主题向量(共 200 维)拼接在已有的 768 维语义向量后,构成长度为 968 维的新闻语义向量。我们会从 kafka 接入不断产生的新闻数据,将新闻转化成新闻语义向量后插入 Milvus 数据库。
双塔模型中的另一侧是用户语义向量。通过用户画像,我们先获得一组用户较感兴趣且语义相近的 tag 关键词(例如:血脂、胰腺癌、肝癌、肠癌、癌细胞、癌症、肺癌、高血压)。随后,我们通过 bert-as-service 将 tag 关键词转化成语义向量。用户画像还可以从用户历史浏览新闻提取 tag 关键词。我们会对获取的关键词按照权重排序,并选取权重最高的前 200 个关键词。随后我们将这 200 个关键词按照语义划分并组合成多个关键词词组,并将新生成的关键词词组转化为语义向量。每一组用户感兴趣的 tag 关键词词组都有对应的一组主题[1]。在用户画像中,每个用户的主题都带有代表用户感兴趣程度的权重。我们会从用户相关的所有主题中选择 topic 权重最大的两个主题,基于已经训练好的主题向量,将对应的主题向量拼接到关键词语义向量之后,最终形成 968 维的用户语义向量。尽管搜狐新闻可能会对不同的用户产生相同的关键词,但是由于不同用户的 tag 关键词权重以及关键词对应主题的权重都不相同,不同用户对应的主题向量也不相同,系统在计算用户语义向量和新闻语义向量的余弦相似度后实现新闻的个性化推荐。
我们会每晚计算好前一天用户的语义向量, 将用户语义向量逐条插入 Milvus 数据库中进行搜索,Milvus 计算后返回用户最感兴趣的新闻信息结果,我们再将这些新闻推送给用户。这个过程就是基于语义向量的内容召回。由于新闻具有实时性,需要每小时计算一次,并将该时间段内用户最感兴趣、预测点击率最高的最新新闻推送给用户。此外,我们还会根据日期建立分区并每天删除过期新闻。
在基于语义向量相似度的内容召回项目中,我们每天需要将几千万条用户感兴趣的 tag 关键词词组转化为语义向量,这非常耗时。即使使用 GPU 来处理,也需要几十个小时。为了解决这一技术难题,我们需要将曾经转化好的语义向量保存起来,以便在未来遇到相似的 tag 关键词词组时能够直接检索出其对应的语义向量。具体解决方案是先将转化好的一组 tag 关键词词组的语义向量信息保存起来,并将每天新产生的一组关键词词组转化为 minhash 向量。随后通过杰卡德距离来度量新 tag 关键词词组的 minhash 向量与已保存的 tag 关键词词组向量间距离。如果超过一定阈值,那么判断这两个 tag 关键词词组为相似的词组,新的词组可以借用之前已经转化好的语义信息。试验表明,只要保证杰卡德距离大于 0.8 即能保证试验精度需要 。最终,每天几千万条语义向量转化的时间被压缩到了两小时左右。虽然后期可根据项目需求换用新的方法存储转化好的语义向量,但是用 Milvus 数据库中的杰卡德距离计算两个 tag 关键词词组之间的相似性仍然是不错的工程方法。
2. 短文本分类 badcase 查找
2.1 场景介绍
在新闻的文本分类中,由于短新闻特征较少,如果把不同长度的新闻都放入一个分类器分类会造成文本分类效果不好。我们的解决办法是使用 Milvus 向量搜索引擎可搜索出多条语义近似、评分可靠的长文本分类信息;利用投票法修正短文本的分类。
2.2 处理流程
对于搜狐新闻智能平台,对每条新闻的精准分类对最终的新闻推荐结果至关重要。由于不同新闻长短差异很大,且短新闻特征较少,用同一个分类器对所有新闻进行分类会导致短文本分类的错误率高于长文本分类。如何批量快速找到这些错误分类的短文本、纠正这些短文本的类别,并将这批数据作为训练用的语料集,成为了一个问题。人工标注时间周期较长,且正确率难以保证。为了解决这一问题,我们利用 bert-as-service 把分类器打分超过 0.9 的长新闻转为语义向量插入 Milvus 中。在插入 500 万条长文本语义向量之后,先遍历短文本新闻,将短文本新闻转化为语义向量,用每条短新闻的语义向量搜索 Milvus 库获得余弦相似度最高的 top20 条长新闻。我们随后对这些语义最相似的 top 20 条长新闻的类别进行统计。如果其中超过 18 条新闻的类别都一致,且与查询的短新闻类别不一致,我们则认为短新闻的类别分类错误,需要纠正为与这 18 条长新闻相同的类别。我们迅速找到了全年所有分类错误的短文本,这些短文本的类别经过纠正后,人工抽查显示文本类别的准确率超过 95%。通过利用高置信度的长文本类别信息来修正短文本的分类,我们很短时间内找到了大批 badcase 及对应的正确标注类别。这为我们训练出短文本分类器提供了很好的语料,有助于训练出更好的短文本分类器。
结语
本文介绍了搜狐在新闻推荐和短文本分类错误查找方面的实践。作为开源相似向量搜索引擎,Milvus 极大提升了新闻推荐的实时性以及短文本分类错误查找的效率。在当前这个文本、图像、音频等非结构化数据爆炸式增长的时代,通过 Embedding 技术将非结构化数据映射成多维向量后再进行检索已成为趋势。Milvus 作为分布式向量检索引擎,具有高性能、易部署的特性。Milvus 极大地节省了项目开发成本,显著提高了系统检索性能,并很好地满足了搜狐新闻的技术和业务需求。搜狐新闻将在未来更丰富的业务场景中与 Milvus 再度合作。
参考资料:
1. https://github.com/baidu/Familia
欢迎加入 Milvus 社区
github.com/milvus-io/milvus | 源码
milvus.io | 官网
milvusio.slack.com | Slack 社区
zhihu.com/org/zilliz-11| 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili