導讀:大規模短文本聚類系統,旨在精準高效地將海量搜索query進行總結概括,凝練成爲含義內聚表達清晰的「需求」,不只能夠更好地知足用戶需求,還能找到內容知足的長短版。如何保證聚類系統的高準確性,如何提升聚類系統的運行效率,是咱們團隊的工做重點。咱們經過多級拆分、精準匹配語義類似度、偏差修正等手段,逐步提高了系統的各項效果和性能指標。本文基於咱們的實際工做經驗,分享了大規模短文本聚類的設計和實踐。前端
1、背景和問題介紹 算法
搜索是用戶明確表達需求的場景,百度搜索天天承接海量請求,query的表達多種多樣。大規模短文本聚類系統,核心目的就是對以query爲表明的短文本進行總結概括,精準高效地將含義相同表達不一樣的短文本,凝練成含義內聚表達清晰的「需求」。這種方式不只能夠壓縮短文本量級,還能更好的知足用戶需求,幫助內容提供方,提供更好的內容。目前已經輔助了百度UGC產品的內容生產。微信
在這一節中,咱們先介紹短文本聚類問題,並介紹經常使用聚類算法,最後分析聚類算法在搜索場景下的難點和挑戰。架構
聚類是一種經常使用的無監督算法,按照某個距離度量方式把一個數據集分割成不一樣的類或簇,使得同一個簇內的數據對象的類似性儘量大,同時不在同一個簇中的數據對象的差別性也儘量地大。app
通常來講,搜索query以短文本爲主。從大量的短文本中,儘量地將含義一致的全部文本,聚合在一塊兒,造成一個「需求簇」,就是短文本聚類問題。框架
舉例來講:
分佈式
編號 | query | 聚類 | 簇中⼼ |
1 | ⼿機碎屏了怎麼辦? | Clu-1 | ⼿機屏幕摔碎了怎麼辦 |
2 | 求助,⼿機屏幕摔碎了 | Clu-1 | ⼿機屏幕摔碎了怎麼辦 |
3 | ⼆⽉⼆什麼意思 | Clu-2 | ⼆⽉⼆⻰擡頭的典故 |
4 | ⻰擡頭什麼意思 | Clu-2 | ⼆⽉⼆⻰擡頭的典故 |
5 | ⻰擡頭有什麼典故 | Clu-2 | ⼆⽉⼆⻰擡頭的典故 |
其中,query="⼿機碎屏了怎麼辦?" 和query=「求助,⼿機屏幕摔碎了」是相同的需求,能夠聚合成爲⼀個簇;query="⼆⽉⼆什麼意思",query="⻰擡頭什麼意思" 和query="⻰擡頭有什麼典故"是相同的需求,能夠聚合成爲⼀個簇。
能夠看出,搜索query場景下的短⽂本聚類問題,和常規聚類問題,有⼀個明顯的區別:「簇」的內涵相對集中,也就是說,聚合完成後,簇的量級相對較⼤,同⼀個簇內的數據,距離較近。
ide
在⽂本聚類領域,simhash是⼀種常⽤的局部敏感哈希算法,經常被⽤來做爲搜索引擎中的⽹⻚去重算法。它⼒圖以較⾼的機率,將類似的⽂檔映射爲相同的哈希值,從⽽起到聚類(去重)的⽬的。
simhash算法⼀般會將⽂檔進⾏分詞處理,並給出每一個詞的權重,再爲每一個詞計算⼀個哈希值,將全部詞的哈希值加權對位求和後,再採⽤對位⼆值化降維,產出最終⽂檔的哈希值。過程當中使⽤了詞的重要性加權,因此重要的詞對最終⽂檔哈希值的影響會更⼤,⽽不重要的詞,對最終⽂檔哈希值的影響就會更⼩,從⽽類似的⽂檔,產⽣相同哈希值的可能性就會更⼤。
在⻓⽂檔聚類(去重)領域,simhash是⼀種⾼效的算法,可是,對短⽂本聚類⽽⾔,因爲⽂本⻓度⼤幅度減小,simhash的有效性⼤⼤下降了,不能保證產出結果的準確性。 函數
另⼀種常⽤的⽂本聚類⽅式,⾸先會將⽂本向量化,再採⽤常規聚類⽅法進⾏聚類。其中,⽂本向量化的⽅式不少,從早期的tf-idf,到⽅便快捷的word2vec,甚⾄是採⽤bert,ernie等預訓練模型產出的⽂本向量,均可以做爲⽂本的向量化表徵。⼀般來講,向量化⽅法會暗含分佈式假設,產出的文本向量,能夠在⼀定程度上解決同義詞的問題。
聚類的⽅式也多種多樣,例如常⽤的kmeans,層級化聚簇,single-pass等。特別須要注意的是,在設計聚類算法的距離度量時,須要特別考慮向量化的⽅式,針對不一樣的向量化⽅式,設計不一樣的距離度量。
這類算法存在三點問題:性能
一、以kmeans爲表明的聚類算法,存在超參數「簇數量」,只能藉助經驗和輔助指標進⾏斷定;
二、對短⽂本聚類問題,簇的數量每每特別⼤,會致使聚類算法性能嚴重降低;
三、聚類結果準確率受向量化和聚類算法雙重影響,難以表達數據的細粒度差別。
儘管短⽂本聚類算法,在業界具備較多應⽤場景,可是在研究領域,它還是⼀個相對⼩衆的分⽀,主要採⽤改進⽂本向量化表示的⽅案,例如句⼦向量被設計成詞向量加權矩陣的第⼀主成分,⽽⾮直接加權;例如採⽤聚簇引導的向量迭代的⽅式,改進向量化表示,例如SIF+Aut。但不管是哪一種改進,都會增長較⼤的計算開銷,在⼯業界並不現實。
算法 | 準確率 | NMI |
simhash | 35.1 | - |
向量化聚簇tf-idf | 33.8 | 21.4 |
SIF+Aut | 77.1 | 56.7 |
咱們⾯對的問題是⼤規模短⽂本聚類,它還包含3個隱含的限制條件:
一、聚類結果的準確性要求⾮常嚴格;二、短⽂本數量規模⾮常⼤;三、數據產出時效要求高;
不難看出,常規算法在運算效率和準確性方面,很難同時知足上述三個要求;而工業界並無成熟框架,能夠解決這個問題;學術界算法距離工業場景應用還有必定距離;咱們須要一種新的思路來解決問題。
在設計算法時,須要重點考慮以下問題:
一、數據量級⼤,系統吞吐高:搜索query的量級是不言而喻的,對於億級別數據,進行高效計算,很是考驗算法設計能力和工程架構能力;
2、聚類算法準確率要求高:首先,聚類算法是無監督算法,採用向量空間上的距離度量,衡量聚類結果的彙集程度,本質上並無準確率的概念;可是,在搜索query場景下,聚類算法就有了明確的衡量指標:經過統一的文本類似性評估標準,能夠後驗評估出在同一個簇中,結果是否類似, 在不一樣的簇中,數據是否不類似,從而能夠衡量出聚類準確率。這爲短文本聚類算法戴上了「緊箍咒」:並非任意聚類算法都適用,須要考慮和文本類似度結合更緊密的聚類算法。
「結合更緊密」是從向量空間中距離的定義來考慮的,例如,由類似度模型給出的類似度度量,並不必定是向量空間上「距離」。具體來講,向量空間上的一個定義良好的「距離」,須要知足三角不等式:distance(A,B)+distance(B,C)>=distance(A,C), 可是,對於類似度,similarity(A,B)+similarity(B,C)與similarity(A,C)並不必定有穩定的數量關係。所以,不能直接使用聚類模型,只能將類似度做爲「場外指導」,實現類似度指導下的聚類算法。這致使通常的聚類算法不能直接用於短文本聚類。
三、文本類似度要求精度高,耗時短:文本類似度是一個場景依賴問題,對於一樣的query對,在不一樣的場景下,可能有大相徑庭的斷定結果。在搜索場景下,對類似度的精度要求很是高,每每一字之差,就是徹底不一樣的需求,所以模型須要可以精確捕獲文本的細粒度差別;另外一方面,但願儘量地將相同需求的query聚合成爲一個簇,減小漏召回的狀況;也就是說,對於短文本聚類問題,對文本類似度的準確率和召回率都有很高要求;除此以外,爲了適應大規模的調用,文本類似度服務須要具備響應時長短、易擴展等特色。
四、文本表徵複雜:文本表徵指的是經過某種方式將文本轉化爲語義向量,用於後續文本聚類。文本向量的產出方式多種多樣,例如在simhash中,採用加權hash函數表達文本信息;還能夠用word2vec詞向量加權產生文本的向量信息。除此以外,短文本的類別,關鍵詞等信息,也是文本表徵的重要組成部分;在文本向量化時,須要重點考慮如何在向量空間中體現類似度。文本表徵是一項重要且基礎的算法,選擇不一樣的文本表徵,決定了不一樣的類似度度量方式,直接影響聚類模型選型,間接影響最終結果。
五、偏差的發現和修復:從文本表徵到文本類似度,再到聚類算法,每一步都會積累偏差,從而影響最終結果。對於大規模文本聚類,這個問題尤其明顯,也是容易被忽略的環節。
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% |
以上是咱們通過⼀段時間的探索後,總結出的⼤規模短⽂本聚類問題的解決⽅案。在過程當中,咱們進⾏了兩個⼤版本的迭代。
在解決這個問題的初期,咱們面對兩種技術方案:一種是探索適合短文本的表徵,將問題轉化爲特殊的向量聚類的問題,例如simhash;另外一種是將數據集合進行拆分,減小數據規模,加速類似度計算,解決聚類問題;通過分析後,咱們認爲方案一,在選擇合適的文本表徵上,沒有能夠指導優化方向的中間指標,很難迭代優化,所以,明確了將數據集合進行拆分的思路。
首先,咱們根據query的分類和其餘業務要求,將query進行一級拆分,保證拆分結果語義互斥;
第二步,進行二級拆分:爲了保證二級拆分後的同一個桶內,數據量級適中,便於進行精細化語義聚合,咱們採用了層級化分桶的方式:
1. 對query計算高級語義特徵,並進行二值化操做,產出一個256維度的由0、1組成的向量
2. 首先取前50維向量,進行hash粗聚;若是簇內的數量超過必定數量,則對其中的query,擴展維度到100維,從新進行hash粗聚,直到維數達到256或者簇內數量少於必定數量
第三步,對每個桶內的query,進行精細化語義聚合,將含義類似的query,合併爲一個簇中。
咱們能夠看出,因爲採用了數據拆分的思路,將數據分桶後,進行精細化語義聚類時,每一個分桶之間的數據語義互斥,只須要在每一個桶內進行語義聚合, 就能夠產出數據了。這種方式便於並行化計算,對縮短計算耗時有很大貢獻。
在過程當中, 咱們也發現,一些須要改進的地方:
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版本基本實現了大規模短文本精細化聚類的功能,可是仍有不少改動空間。例如聚類結果的持久化,重複計算問題,更高效的聚合算法等,後續咱們也會持續優化,提供更高效穩定的算法支持。
搜索是用戶明確表達需求的地方,對搜索query的深刻理解和概括整理,不只能夠爲用戶提供更優質的搜索體驗,還能夠找到內容知足的短板。咱們經過多級拆分、精細聚合的方式,實現了對大規模短文本的聚類功能,輔助百度UGC業務線進行內容生產,提高了生產效率。
閱讀原文
https://mp.weixin.qq.com/s/-QCY1v6oCj3ibjTDHHpiOQ
推薦閱讀
|百億級流量的百度搜索中臺,是怎麼作可觀測性建設的?
|十億級流量的搜索前端,是怎麼作架構升級的?
|百度信息流和搜索業務中的彈性近線計算探索與應用
---------- END ----------
「百度Geek說」全新上線
有興趣的同窗,也能夠加入「百度Geek說微信交流微信羣」,在羣內繼續交流。
若是你對百度的其餘崗位感興趣,請加入「百度Geek說官方招聘羣」,瞭解最新崗位動態,總有一款JD適合你。
技術乾貨 · 行業資訊 · 線上沙龍 · 行業大會
招聘信息 · 內推信息 · 技術書籍 · 百度周邊