点击关注「百度Geek说」
更多技术干货等着你
搜索是用户明确表达需求的场景,百度搜索每天承接海量请求,query的表达多种多样。大规模短文本聚类系统,核心目的就是对以query为代表的短文本进行总结归纳,精准高效地将含义相同表达不同的短文本,凝练成含义内聚表达清晰的“需求”。这种方式不仅可以压缩短文本量级,还能更好的满足用户需求,帮助内容提供方,提供更好的内容。目前已经辅助了百度UGC产品的内容生产。
在这一节中,我们先介绍短文本聚类问题,并介绍常用聚类算法,最后分析聚类算法在搜索场景下的难点和挑战。
聚类是一种常用的无监督算法,按照某个距离度量方式把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。
一般来说,搜索query以短文本为主。从大量的短文本中,尽可能地将含义一致的所有文本,聚合在一起,形成一个“需求簇”,就是短文本聚类问题。
1、以kmeans为代表的聚类算法,存在超参数“簇数量”,只能借助经验和辅助指标进⾏判定; 2、对短⽂本聚类问题,簇的数量往往特别⼤,会导致聚类算法性能严重下降; 3、聚类结果准确率受向量化和聚类算法双重影响,难以表达数据的细粒度差异。
1、聚类结果的准确性要求⾮常严格; 2、短⽂本数量规模⾮常⼤; 3、数据产出时效要求高;
不难看出,常规算法在运算效率和准确性方面,很难同时满足上述三个要求;而工业界并没有成熟框架,可以解决这个问题;学术界算法距离工业场景应用还有一定距离;我们需要一种新的思路来解决问题。
在设计算法时,需要重点考虑如下问题:
“结合更紧密”是从向量空间中距离的定义来考虑的,例如,由相似度模型给出的相似度度量,并不一定是向量空间上“距离”。具体来说,向量空间上的一个定义良好的“距离”,需要满足三角不等式:
distance(A,B)+distance(B,C)>=distance(A,C), 但是,对于相似度,
similarity(A,B)+similarity(B,C)与similarity(A,C)并不一定有稳定的数量关系。因此,不能直接使用聚类模型,只能将相似度作为“场外指导”,实现相似度指导下的聚类算法。这导致一般的聚类算法不能直接用于短文本聚类。
3、文本相似度要求精度高,耗时短:文本相似度是一个场景依赖问题,对于同样的query对,在不同的场景下,可能有截然不同的判定结果。在搜索场景下,对相似度的精度要求非常高,往往一字之差,就是完全不同的需求,因此模型需要能够精确捕获文本的细粒度差异;另一方面,希望尽可能地将相同需求的query聚合成为一个簇,减少漏召回的情况;也就是说,对于短文本聚类问题,对文本相似度的准确率和召回率都有很高要求;除此之外,为了适应大规模的调用,文本相似度服务需要具有响应时长短、易扩展等特点。
4、文本表征复杂:文本表征指的是通过某种方式将文本转化为语义向量,用于后续文本聚类。文本向量的产出方式多种多样,例如在simhash中,采用加权hash函数表达文本信息;还可以用word2vec词向量加权产生文本的向量信息。除此之外,短文本的类别,关键词等信息,也是文本表征的重要组成部分;在文本向量化时,需要重点考虑如何在向量空间中体现相似度。文本表征是一项重要且基础的算法,选择不同的文本表征,决定了不同的相似度度量方式,直接影响聚类模型选型,间接影响最终结果。
5、误差的发现和修复:从文本表征到文本相似度,再到聚类算法,每一步都会积累误差,从而影响最终结果。对于大规模文本聚类,这个问题尤为明显,也是容易被忽略的环节。
3.1 基于⽂本字⾯的检索聚类:虽然分到同⼀个桶中的数据量已经⼤⼤减少了,但是如果两两进⾏相似度计算,数据量级依然很⼤;我们发现,常规的关键词搜索,可以保证召回⼤部分相似的query,只需要为召回的query计算相关性即可。
3.2 基于⽂本表征的聚类: 虽然通过关键词搜索,可以覆盖⼤部分的相似query,但是召回并不全, 为了解决同义问题、句式变换等导致的关键词召回不全的问题,我们使用了基于文本表征的召回方式:将向量化后的query,进行细粒度的聚类,只需要对同一类中的query计算相似度即可;
3.3 基于⽂本表征的检索聚类:考虑细粒度的聚类算法控制力较弱,还可以引入向量检索,通过文本向量召回的方式,解决召回不全的问题。
1. 解决了数据量级大,要求耗时短的问题:当前流程可以通过将数据进行二级拆分,可以把大规模数据,拆分为较小的数据块,分配给不同的计算单元进行计算,从而减少耗时;我们进行过估计,在1亿数据上,传统两两对比的方式,计算需要耗时58年;而采用分层的方式, 只需要4天;虽然采用分级向量化聚簇(无相似度)的方式,可以将耗时降低为2天, 但是准确率和召回率较低;
2. 优化相似度, 提高相似度服务计算性能:我们对短文本相似度进行了定制性优化,多实例部署,相似度服务的吞吐能力得到了100倍的提升;
3. 聚类算法准确率高:引入误差修正机制,整体短文本聚类算法准确率从93%提升到了95%,召回率从71%提升到了80%;
基于以上分析, 对计算性能和计算效果进行折中, 我们采用了分级向量化聚簇+优化后的相似度作为最后的方案;
在解决这个问题的初期,我们面对两种技术方案:一种是探索适合短文本的表征,将问题转化为特殊的向量聚类的问题,例如simhash;另一种是将数据集合进行拆分,减少数据规模,加速相似度计算,解决聚类问题;经过分析后,我们认为方案一,在选择合适的文本表征上,没有可以指导优化方向的中间指标,很难迭代优化,因此,明确了将数据集合进行拆分的思路。
首先,我们根据query的分类和其他业务要求,将query进行一级拆分,保证拆分结果语义互斥;
第二步,进行二级拆分:为了保证二级拆分后的同一个桶内,数据量级适中,便于进行精细化语义聚合,我们采用了层级化分桶的方式:
1. 对query计算高级语义特征,并进行二值化操作,产出一个256维度的由0、1组成的向量
2. 首先取前50维向量,进行hash粗聚;如果簇内的数量超过一定数量,则对其中的query,扩展维度到100维,重新进行hash粗聚,直到维数达到256或者簇内数量少于一定数量
第三步,对每一个桶内的query,进行精细化语义聚合,将含义相似的query,合并为一个簇中。
我们可以看出,由于采用了数据拆分的思路,将数据分桶后,进行精细化语义聚类时,每个分桶之间的数据语义互斥,只需要在每个桶内进行语义聚合, 就可以产出数据了。这种方式便于并行化计算,对缩短计算耗时有很大贡献。
在过程中, 我们也发现,一些需要改进的地方:
1. 聚类结果的准确性强依赖于相似度模型,并且是细粒度相似度模型,如果使用粗粒度相似度模型,会导致误召回,因此需要一套可以区分细粒度相似程度的模型。
2. 使用层级化分桶进行二级拆分,并不一定能保证语义相似的数据进入一个桶中,层次化拆分使用的query向量表征,暗含了向量在语义表达上,具有随维度增加逐渐细化的特点,但是在产出query向量表征的过程中,并没有施加此导向,不能保证这个假设成立;在v2.0中我们改动了二级拆分的方式,克服了这个缺陷;
3. 缺少误差发现和修正机制:不论相似度准确率有多高,不论短文本的分类有多准,都会有误差;我们需要有机制可以发现和修正误差。
针对v1.0 发现的问题,我们做了三点改动:
引入细粒度相似度
短文本文本聚类的一个典型使用场景,是对搜索query进行语义级别的合并,将相同需求不同表达的query,合并为一个“需求”,因此对于相似query的认定,标准是较为严格的。已有的相似度模型,已经不能适用了。经过对query的详细分析,我们发现句法分析,短语搭配等特征,能够对提升相似度模型的准确率和召回率有较大帮助,因此,我们自研了一套融合了句法分析,短语搭配和其他特征的相似度模型,取得了较好的收益。
在二级拆分中引入聚类模型
在v1.0 版本中,层次化分桶的准确率得不到保证,需要有一个更准确的二级拆分方式,达到数据分桶的目的。二级拆分只需要保证相似的短文本,大概率被分到同一个桶中,并不要求桶内任意两个短文本都是相似的,这样的设置非常适合采用向量化后聚类方法解决问题。一方面考虑到预训练模型的性能问题,我们采用了传统词向量加权的方式,产出短文本的词向量;通过kmeans聚类的方式,对一级桶的短文本进行聚类操作,从而保证了二级拆分的准确率。
这里可能会有疑问,为什么不使用向量召回的方式解决问题?其实,向量召回的本质是向量聚类,再辅以高效的向量查找,达到向量召回的目的。在二级拆分中,不需要进行向量查找,而且如果引入会增加额外的时间开销,因此我们并没有使用向量召回。
误差修正
在v1.0版本中,误差逐层累计且没有得到修正,为了克服这一点,我们在产出的最后一步,引入了误差修正操作。
主要存在两种形式的误差: 一种是聚类不全,应该聚合在一起的数据,没有聚合在一起,这类误差主要是由于多级拆分引起的,通过跨越层级的校验,可以解决这个问题;另一种误差是聚类不准,主要是由于相似度计算导致的。我们重点解决聚类不全的问题。
为了减少需要校验的数据量级,我们将误差检验的范围,限制在二级分桶内部。在二级分桶后,我们首先采用精细化语义聚合的方式,得到聚类结果。对处于同一个二级桶内的聚类中心,验证其相关性。如果相关性较高,则进一步验证后合并。
v2.0 的效果
v2.0上线后,能够在很短的时间内处理完成大规模短文本的精细化聚类,聚类准确率达到95%,召回率达到80%,已经服务于百度UGC业务线的内容生产。
持续优化
v2.0版本基本实现了大规模短文本精细化聚类的功能,但是仍有很多改动空间。例如聚类结果的持久化,重复计算问题,更高效的聚合算法等,后续我们也会持续优化,提供更高效稳定的算法支持。
搜索是用户明确表达需求的地方,对搜索query的深入理解和归纳整理,不仅可以为用户提供更优质的搜索体验,还可以找到内容满足的短板。我们通过多级拆分、精细聚合的方式,实现了对大规模短文本的聚类功能,辅助百度UGC业务线进行内容生产,提升了生产效率。
招聘信息
无论你是前端、后端、架构、算法,这里有上百个职位等着你,欢迎投递简历,百度移动生态事业群,期待大家加入!
简历投递邮箱:
data_effective_rec@baidu.com
---------- END ----------
「百度Geek说」全新上线
有兴趣的同学,也可以加入「百度Geek说微信交流微信群」,在群内继续交流。
如果你对百度的其他岗位感兴趣,请加入「百度Geek说官方招聘群」,了解最新岗位动态,总有一款JD适合你。
「百度Geek说」
官方交流群
「百度Geek说」
官方招聘群