基於語義向量的內容召回和短文本分類的錯誤查找-搜狐的 Milvus 實戰


✏️  作者介紹:

王婷婷搜狐自然語言算法工程師


 

  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

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章