Press "Enter" to skip to content

⼤规模短⽂本聚类的设计和实践(下)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

导读:在昨天的文章中,我们介绍了短文本聚类问题,并介绍常用聚类算法,最后分析聚类算法在搜索场景下的难点和挑战。【 揭秘!海量搜索请求下的短文本聚类系统(上) 】 在今天的文章中将具体介绍大规模短文本聚类设计的思路以及我们的迭代升级与思考。

 

1.4 大规模短文本聚类的总体思路

 

考虑到以上难点,我们采⽤了多级拆分,逐个击破的总体思路。

 

 

图1:大规模短文本聚类的总体思路

 

1.我们先将⼤规模短文本,进行多级拆分,基本保证相同含义的query,大概率进入同⼀个分桶中:

 

1.1⼀级拆分:需要保证拆分项在语义层面,含义互斥,也就是相同含义的query,必须进⼊相同的桶中;

 

1.2二级拆分:⼀级拆分后,每个桶内的query量级依然很⼤,还需要进行二级拆分,保证后续计算量级可控;

 

2.对同⼀个桶内的query进行精细化语义聚合,将含义相同的query,合并为⼀个簇;

 

3.对于同⼀个⼀级分桶中的语义簇,进⾏误差校验,将需要合并的簇合并;

 

说明:

 

1.为什幺要拆分? 假设我们的query数量量级为 ,那幺最差情况下,我们需要进行 次相似度计算,才能完成⽂本聚类;然而,如果我们将数据进行拆分,并且以较高的概率保证拆分互斥,,那幺只需要进行 次相似度计算,量级是远⼩于的 ;

 

2. 为什幺需要多级拆分? 如果把原始数据平级拆分的较细,就会降低相似度调用次数;但是平级拆分的越细,就越不能保证语义互斥,这会导致需要进行误差校验的数量激增;如果我们采用多级拆分,保证顶部拆分的准确率,就会减少误差校验的数据量;

 

3.如何进行语义聚簇? 数据拆分后,需要在每个桶内,进行文本聚类,这也是整个方案最核心的地方 ; 目前,有三种办法可以解决:

 

3.1 基于文本字面的检索聚类: 虽然分到同⼀个桶中的数据量已经大大减少了,但是如果两两进行 相似度计算,数据量级依然很⼤;我们发现,常规的关键词搜索,可以保证召回大部分相似的query,只需要为召回的query计算相关性即可。

 

3.2 基于文本表征的聚类:   虽然通过关键词搜索,可以覆盖⼤部分的相似query,但是召回并不全, 为了解决同义问题、句式变换等导致的关键词召回不全的问题,我们使用了基于文本表征的召回方式:将向量化后的query,进行细粒度的聚类,只需要对同一类中的query计算相似度即可;

 

3.3 基于⽂本表征的检索聚类: 考虑细粒度的聚类算法控制力较弱,还可以引入向量检索,通过文本向量召回的方式,解决召回不全的问题。

 

有效性分析

 

1. 解决了数据量级大,要求耗时短的问题: 当前流程可以通过将数据进行二级拆分,可以把大规模数据,拆分为较小的数据块,分配给不同的计算单元进行计算,从而减少耗时;我们进行过估计,在1亿数据上,传统两两对比的方式,计算需要耗时58年;而采用分层的方式, 只需要4天;虽然采用分级向量化聚簇(无相似度)的方式,可以将耗时降低为2天, 但是准确率和召回率较低;

 

2. 优化相似度, 提高相似度服务计算性能: 我们对短文本相似度进行了定制性优化,多实例部署,相似度服务的吞吐能力得到了100倍的提升;

 

3. 聚类算法准确率高: 引入误差修正机制,整体短文本聚类算法准确率从93%提升到了95%,召回率从71%提升到了80%;

 

基于以上分析, 对计算性能和计算效果进行折中, 我们采用了分级向量化聚簇+优化后的相似度作为最后的方案;

算法⽤时准确率召回率
两两对比-相似度A(base)约58年93%71%
两两对比-相似度B()小于10年95%83%
向量化聚簇(无相似度)4天72%32%
分级向量化聚簇(无相似度)2天72%30%
分级向量化聚簇-相似度A(base)3天93%67%
分级向量化聚簇-相似度B(优化)3天95%80%

 

02

 

大规模短文本聚类算法的演进和思考

 

以上是我们经过⼀段时间的探索后,总结出的⼤规模短⽂本聚类问题的解决⽅案。在过程中,我们进行了两个大版本的迭代。

 

2.1  v1.0:明确拆分的思路

 

在解决这个问题的初期,我们面对两种技术方案: 一种是探索适合短文本的表征,将问题转化为特殊的向量聚类的问题,例如simhash;另一种是将数据集合进行拆分,减少数据规模,加速相似度计算,解决聚类问题;经过分析后,我们认为方案一,在选择合适的文本表征上,没有可以指导优化方向的中间指标,很难迭代优化,因此,明确了将数据集合进行拆分的思路。

 

首先, 我们根据query的分类和其他业务要求,将query进行一级拆分,保证拆分结果语义互斥;

 

第二步,进行二级拆分: 为了保证二级拆分后的同一个桶内,数据量级适中,便于进行精细化语义聚合,我们采用了层级化分桶的方式:

 

1. 对query计算高级语义特征,并进行二值化操作,产出一个256维度的由0、1组成的向量

 

2. 首先取前50维向量,进行hash粗聚;如果簇内的数量超过一定数量,则对其中的query,扩展维度到100维,重新进行hash粗聚,直到维数达到256或者簇内数量少于一定数量

 

第三步,对每一个桶内的query,进行精细化语义聚合,将含义相似的query,合并为一个簇中。

 

v1.0 的优缺点分析

 

我们可以看出,由于采用了数据拆分的思路,将数据分桶后,进行精细化语义聚类时,每个分桶之间的数据语义互斥,只需要在每个桶内进行语义聚合, 就可以产出数据了。 这种方式便于并行化计算,对缩短计算耗时有很大贡献。

 

在过程中, 我们也发现,一些需要改进的地方:

 

1. 聚类结果的准确性强依赖于相似度模型,并且是细粒度相似度模型,如果使用粗粒度相似度模型,会导致误召回,因此需要一套可以区分细粒度相似程度的模型。

 

2. 使用层级化分桶进行二级拆分,并不一定能保证语义相似的数据进入一个桶中,层次化拆分使用的query向量表征,暗含了向量在语义表达上,具有随维度增加逐渐细化的特点,但是在产出query向量表征的过程中,并没有施加此导向,不能保证这个假设成立;在v2.0中我们改动了二级拆分的方式,克服了这个缺陷;

 

3. 缺少误差发现和修正机制:不论相似度准确率有多高,不论短文本的分类有多准,都会有误差;我们需要有机制可以发现和修正误差。

 

2.2  v2.0:引⼊细粒度相似度

 

针对v1.0 发现的问题,我们做了三点改动:

 

引入细粒度相似度

 

短文本文本聚类的一个典型使用场景,是对搜索query进行语义级别的合并,将相同需求不同表达的query,合并为一个“需求”,因此对于相似query的认定,标准是较为严格的。已有的相似度模型,已经不能适用了。经过对query的详细分析,我们发现句法分析,短语搭配等特征,能够对提升相似度模型的准确率和召回率有较大帮助,因此,我们自研了一套融合了句法分析,短语搭配和其他特征的相似度模型,取得了较好的收益。

 

在二级拆分中引入聚类模型

 

在v1.0 版本中,层次化分桶的准确率得不到保证,需要有一个更准确的二级拆分方式,达到数据分桶的目的。二级拆分只需要保证相似的短文本,大概率被分到同一个桶中,并不要求桶内任意两个短文本都是相似的,这样的设置非常适合采用向量化后聚类方法解决问题。一方面考虑到预训练模型的性能问题,我们采用了传统词向量加权的方式,产出短文本的词向量;通过kmeans聚类的方式,对一级桶的短文本进行聚类操作,从而保证了二级拆分的准确率。

 

这里可能会有疑问,为什幺不使用向量召回的方式解决问题?其实,向量召回的本质是向量聚类,再辅以高效的向量查找,达到向量召回的目的。在二级拆分中,不需要进行向量查找,而且如果引入会增加额外的时间开销,因此我们并没有使用向量召回。

 

误差修正

 

在v1.0版本中,误差逐层累计且没有得到修正,为了克服这一点,我们在产出的最后一步,引入了误差修正操作。

 

主要存在两种形式的误差: 一种是聚类不全,应该聚合在一起的数据,没有聚合在一起,这类误差主要是由于多级拆分引起的,通过跨越层级的校验,可以解决这个问题;另一种误差是聚类不准,主要是由于相似度计算导致的。我们重点解决聚类不全的问题。

 

为了减少需要校验的数据量级,我们将误差检验的范围,限制在二级分桶内部。在二级分桶后,我们首先采用精细化语义聚合的方式,得到聚类结果。对处于同一个二级桶内的聚类中心,验证其相关性。如果相关性较高,则进一步验证后合并。

 

v2.0 的效果

 

v2.0上线后,能够在很短的时间内处理完成大规模短文本的精细化聚类,聚类准确率达到95%,召回率达到80%,已经服务于百度UGC业务线的内容生产。

 

持续优化

 

v2.0版本基本实现了大规模短文本精细化聚类的功能,但是仍有很多改动空间。例如聚类结果的持久化,重复计算问题,更高效的聚合算法等,后续我们也会持续优化,提供更高效稳定的算法支持。

 

03

 

总结

 

搜索是用户明确表达需求的地方,对搜索query的深入理解和归纳整理,不仅可以为用户提供更优质的搜索体验,还可以找到内容满足的短板。我们通过多级拆分、精细聚合的方式,实现了对大规模短文本的聚类功能,辅助百度UGC业务线进行内容生产,提升了生产效率。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注