NLP 技術在微博 feed 流中的應用

導讀:新浪微博截止2019.9統計的數據,月活躍用戶數爲4.97億,日活躍用戶數爲2.16億,其中約94%爲移動端用戶,今天會和大家分享新浪微博在 feed 流中遇到的 NLP 問題和解決思路。主要包括:

❶ 難點與現存問題

❷ 標籤系統

❸ 物料庫

❹ 多任務、多模態探索

❺ 大規模預訓練模型技術

難點與現存問題

博文內容大多比較短

第一個問題,微博的內容都是比較短的 ( 一般都是100字符以內 ),比如右圖中提到文本 “下午茶”,但是圖片內容並不是美食 “下午茶”,考慮整個微博文本和圖片內容應該分類到美女頻道而不是美食頻道更合適。另外對於短文本使用 LDA/PLSA 等 topic model 效果都不太好。

語言表達隨意化

第二個問題,文本的隨意化和口語化,語法結構不嚴謹,對於內容分析帶來較大挑戰。

用戶搜索行爲序列不能準確獲取

第三個問題,比如:在微博搜索結果頁中,由於文本簡短,大部分的結果在頁面中能看到全文,沒必要點擊進入看內容 ( 除了第二條,需要點擊展開全文 ),而從停留行爲來看,由於一頁展示多條博文,也不能準確定位用戶感興趣的是哪條微博。

用戶 feed 行爲序列不能準確獲取

這個問題與搜索結果頁相似,用戶停留在 feed 流的頁面中,不能準確區分哪條微博爲用戶感興趣的。我們對點擊較高的博文分析發現,點擊較高的博文很多包含多張圖片。由於一條微博可以包含多張圖片,部分高點擊的博文是由於用戶想查看圖片的內容才點擊進入微博的正文頁,但是這樣的點擊不能代表用戶對該博文感興趣。

綜上所述,目前的微博場景很難獲取十分準確的用戶行爲序列 ( 用戶行爲序列包括展示頁,點擊,停留,轉發,評論,贊,收藏等 ),導致使用 LDA/PLSA 主題的方式和用戶行爲序列方式建模效果都不太好。接下來,將爲大家分享下我們的解決辦法和思路。

標籤系統

標籤系統主要包括:博文標籤、用戶興趣 ( 畫像 ) 標籤、博主標籤。今天主要介紹博文標籤和用戶興趣 ( 畫像 ) 標籤。

博文標籤

博文標籤,主要分爲:一二級標籤、實體標籤、關鍵詞標籤。

① 一二級標籤

一級標籤:對應頻道,例如財經,法律,IT 產業,軍事,歷史,美食等標籤。

二級標籤:一級標籤 “財經”,包含的二級標籤:投資,衆籌,貨幣,股票,保險,債券,基金,貸款,美股等。

一二級標籤運用:一級標籤與少量的二級標籤和垂直頻道對應,打上這部分標籤的博文會分發到對應的頻道下,對應的博文會在該頻道進行展示。其次一級和二級標籤也可用於畫像的構建以及推薦中的召回和排序,但是作爲標籤,粒度太粗,不能很好的刻畫用戶興趣。比如,有的用戶只對英語感興趣,如果把大量的教育相關的博文推薦給他,用戶體驗會比較差。

一二級標籤分類系統

目前分類系統使用 fasttext+bert 結合的方案,是由於 bert 效果好,而 fasttext 性能好。我們有如下的方案:針對關注度高 ( 明星 ) 和高質量的博文使用 bert,其他的博文先過一遍 fasttext,若標籤得分高於閥值 ( 95分 ),則不再使用 bert 進行處理;若最高得分只有70分,那麼使用 bert 再預測一次。Bert 是一種多層的編碼器,最近的研究表明,bert 不同層的 embedding 捕獲到了不同的句子知識。比如底層 embedding 捕獲到詞法方面特徵,中間層 embedding 捕獲到句法特徵,高層 embedding 捕獲到語義特徵。因此,我們對 bert 的結構做了優化,使用對各層 embedding 加權後獲得的 embedding 作爲整個博文的表徵,後續的博文質量模型也是這種做法。

② 實體標籤

實體標籤在我們的場景中也叫三級標籤,實體標籤的來源:人工收集、微博熱搜 query 和模型識別。如下圖可看到一二級標籤和實體標籤之間的關係。

實體識別模型

模型如圖結構所示,首先經過 bert 層輸出每個詞對應每個序列標註的概率分佈,再經過 crf 層輸出最終的標註結果。而這些序列標註的訓練數據是由人工標註的。

③ 關鍵詞標籤

關鍵詞來源爲兩塊:名詞短語和用戶 query。這是由於博文的文本較短所決定的 ( 90%以上都是100個字符以內 ),使用傳統的主題模型方式並不奏效。

a. 名詞短語抽取

首先我們先從名詞短語抽取關鍵詞說起,我們可從某個句子中獲取依存句法相關信息。

如上圖所示,有 Stanford NLP、哈工大 LTP 和 HanLP 等工具包可以獲取句子的依存句法,可以根據多個 parser 解析出來的依存句法對名詞短語進行提取,例如,擊劍、比賽兩個詞。首先在 stanford NLP 中擊劍、比賽爲一個名詞短語且在一個語塊 ( chunker ) 下,同樣其他依存句法工具也是擊劍、比賽都爲名詞短語並且都爲同一個語塊 ( chunker )。這樣多個句法分析工具輸出結果都是一致的,我們就認爲擊劍比賽可以作爲標籤使用。

其次也可以從不同的分詞結果對名詞短語進行提取和校驗。通過下列方式可以獲取多個不同的分詞結果:

❶ 同一個分詞器不同的分詞粒度。

❷ 同一個分詞器 nbest ( 其它可能 ) 的結果

❸ 不同的分詞器

使用不同的分詞結果可以用於做名詞短語提取正確性的校驗。下文我們會詳細闡述提取規則。

我們提取關鍵詞短語有如下規則

❶ 名詞短語在多個句法 parser 中,在同一個 chunker 下,例如 “擊劍比賽” 三個工具輸出都是同一個 chunker。

❷ 長度大於等於三個字以上的名詞,長度小於 L 的名詞短語,不宜太長 ( 實際操作中長度不超過6 )。

❸ 名詞短語邊界與分詞結果兼容,否則名詞短語及名詞短語所在同一 chunker 的短語不能作爲候選 。例如我們使用 Stanford NLP 依存句法結果與一個分詞結果做兼容,依存句法結果:香農/在/信息論/中/把/信息/熵定義/爲/自/信息/的/期望 ,分詞器的結果:香農/在/信息論/中/把/信息熵/定義/爲/自信息/的/期望。

可得到如下結論

  • “信息論” 依存句法和分詞都是同一個詞說明兼容;
  • “信息熵定義” 依存句法分割爲 “信息” 和 “熵定義”,而分詞結果爲 “信息熵” 和 “定義”,這兩個切分的邊界不一致。即依存句法邊界在信息、熵的中間,而分詞邊界在熵、定義中間說明與分詞不兼容。若依存句法爲信息/熵/定義,那麼熵、定義是拆開的,邊界算是與分詞保持一致,那麼 “信息熵” 則與分詞結果兼容;
  • “自信息” 依存句法爲/自/信息/,分詞結果爲/自信息/,這裏雖然依存句法自、信息被拆開了,但是與分詞結果 “自信息” 是兼容的。
  • “信息熵定義”,依存句法結果爲/信息/熵定義/,分詞結果爲/信息熵/定義/,因爲分詞結果/信息熵/定義/是拆開的,並且依存句法拆分不一致所以與分詞結果不兼容,除非依存句法與分詞結果拆分一致都爲/信息熵/定義/,那麼才說明與分詞兼容。

❹ 使用多個分詞結果校驗提升關鍵詞精度

最後,我們可根據以上所說的實體識別和名詞短語規則將博文中詞語提取出來做爲關鍵詞的候選。

b. 用戶 query 提取

用戶 query 作爲關鍵詞的條件:

❶ Query 必須爲高頻

❷ 需要限制長度,不易太長

❸ 另外,query 會存在邊界錯誤的情況。可使用新詞發現的方式,通過左右信息熵和緊密度進行噪音過濾。

c. 匹配算法

首先,我們可以使用高效匹配算法,Trie 樹/Hash table、Double array trie (dat)、AC 自動機 ( 三者中 AC 匹配效率最高 ), 500w+ 的詞典通過這些匹配算法,在博文上進行匹配。接着我們使用分詞工具對文章進行分詞,來校驗分詞的結果邊界是否與匹配算法的結果兼容,輸出最終兼容的結果。

其實該方法與上文說的提取名詞短語思路相似,例如:關鍵詞爲 “史記”,而文中爲 “歷史記錄”。在使用匹配算法時會將 “歷史記錄” 中的 “史記” 匹配上,但是經過分詞工具時,分出來歷史/記錄,而史記被分開,“史” 與 “歷” 鏈接,沒有單獨成塊,同時 “記” 也與 “錄” 鏈接,那麼可以判定與其不能兼容。

有的同學會問,如果把關鍵詞/實體詞典加入分詞用戶詞典,是不是同時解決了匹配問題和消歧問題?其實這是很難做到的,因爲一般的分詞詞典詞彙量約30-50萬,分詞的過程本身就是對句子消歧的過程,在分詞的過程中往往藉助詞頻、詞性等其它信息,關鍵詞/實體詞 500W+,遠超分詞詞典中詞數量,如果放入分詞用戶詞典,這些詞會在匹配之後,在分詞結果中保證不會被切開 ( 不同策略有所區別 ),將對分詞的效果產生很大的負面影響。

d. 相關性

使用匹配算法和分詞驗證兼容性得到以上關鍵詞,其中天龍八部、新笑傲江湖等是和電影相關的詞,但是與博文中的主題相關性不一致 ( 主題是旅遊 ),由於關鍵詞需要映射到用戶畫像上來統計用戶興趣,這些詞不能代表用戶的偏好。

標籤與博文的相關性計算流程爲:獲取文本向量 -> 向量相似度計算 -> 設置閾值過濾標籤。其中,我們使用 bert 獲取文本向量,博文和標籤 ( 關鍵詞 ) 分別以字的形式輸入至 bert 模型中,對模型最後一層的每個字相加求均值,效果最好 ( 不同文本相似度計算任務向量取法有所區別,有的任務取最後一層 cls 的向量效果較好 )。我們用於計算相似度的 bert 模型是基於博文的分類 fine-tuning 結果的模型。

除了標籤還進行了同義詞、近義詞和上下文詞的挖掘,這裏不展開做過多闡述。

④ 博文 embedding 標籤

Embedding 標籤通過用戶的點擊序列建模獲取。模型如圖所示,特徵爲 f0:用戶id,f1: 用戶的自身屬性,f2: 用戶點擊列表,f3: 博文的id,f4:博文自身屬性,label 爲是否點擊博文。如前文所述,用戶的行爲序列不能十分精準的獲取,所以 embedding 的效果並不好。

以上就是基於博文的一些打標籤的方式,下面我們再來討論一下基於用戶方面的標籤。

用戶興趣標籤

① 首先是基於模型 embedding 的用戶興趣標籤:上文中有介紹,此方法效果不太好。

② 基於統計的標籤

❶ 標籤可以分成三種類型,分別爲長期、短期和即時。分別進行統計,就有了不同類型的標籤,可用於做召回或者排序模型的特徵。

❷ 關鍵詞用戶興趣標籤的特徵有以下兩個方面:一是,關鍵詞在特定的用戶行爲中的曝光率、互動率、轉評贊率和平均停留時長;二是,關鍵詞在全量用戶行爲中的曝光率、互動率、轉評贊率和平均停留時長,用來表示在大衆整體的偏好,可用於排序的輸入特徵。

❸ 將用戶生成博文 embedding 映射到用戶興趣標籤中。

❹ 在以上計算用戶興趣的標籤時,會用到一些平滑的策略。

物料庫

對用戶發博的博文做預處理,最終構建一個統一的基礎物料庫,實現各業務的物料共享,構建各業務需要的物料特徵。

段子識別模型

各層的權重在訓練過程中優化獲得。在權重embedding的基礎上進行reduce_mean操作獲取到最終的embedding表示,進行sigmoid操作獲取到相應的概率分數。我們基於人工標註的數據進行 bert 的 fine-turning。

物料評級模型

物料評級模型分成兩塊:一塊是博文的內容,使用 bert 進行文本向量的抽取;另一塊爲博主的特徵和上下文特徵 ( 博主發博的上下文 ),比如博主等級,粉絲數,健康等級,博主暱稱等,把相關特徵拼接在一起,進行多分類。

多模態

上文也介紹過,對於文本較短的博文,我們沒法獲取太多的信息,這樣需要藉助多模態信息。

比如通過圖像信息對文本內容的信息進行補充。那麼通過該圖像模態,我們可以打上美女這樣的標籤。

博文中出現了蘋果,可能指代吃的蘋果或者蘋果公司。若藉助圖像可一目瞭然去除歧義。

多模態對偶模型

上圖是在 BERT 發佈之前的做法:多模態對偶模型,其中文本編碼使用 lstm 模塊,圖像編碼則使用 Inception-Resnet-V2 模塊。兩者編碼對齊到同一個長度進行 attention-both 計算,之後兩個模塊分別與文本編碼和圖像編碼進行加權計算,然後向量 add 輸出多模態向量,最後解碼進行標籤分類。Attention-both 可以這樣理解:由於 image、文本都編碼爲語義向量,單獨的使用文本進行解碼時,可以利用圖片的 attention 信息,而單獨使用圖片解碼時,可以利用到文本的 attention 信息,Attention-both 就是這兩者的結合。模型效果相對於文本模型有一定的提升,但是性能會比較慢。

BERT 多模態模型

① 預訓練模型

BERT 出來之後,微軟發表了圖像結合 BERT 的多模態預訓練文章。

其預訓練除了文本還加入了圖像的部分。首先把完整的圖像做切分 ( Fast RCNN ),每個爲一個個小塊圖片,並且做 mask 輸入到模型中進行預測還原。

文本和圖片的向量融合再進行預訓練,輸出文本和圖片的聯合向量 。聯合向量可用於相似博文的召回和根據博文內容來檢索相似圖片 ( 自動配圖 )。

② 多模態打標籤

我們也嘗試在多模態預訓練之後做打標籤的任務,預訓練的向量之後進行多分類的 finetuning。

多任務

對比之前版本的質量模型,多任務新增了 ctr 和停留時長的任務。整體效果會有些提升。

大規模預訓練模型技術

有以下兩種模型:BERT 和 GPT2,而這兩種模型是有區別的。BERT 主要做編碼,對文本進行理解。GPT2 則爲做生成任務,可輔助寫作。杜則堯同學開源了基於中文的 GPT2 模型:

https://github.com/Morizeyao/GPT2-Chinese

感興趣可以具體瞭解。

除了 BERT 和 GPT2,還有 T5。T5 整合了 NLP 的四大任務:序列標註 ,分類任務 ,句子關係判斷 ,生成式任務。

我們目前在大規模預訓練模型技術,做了以下幾塊工作:

❶ 實現了 GPT2 模型的訓練和推理

❷ 同時也實現了 T5 模型訓練和推理

❸ 由於模型參數太多,性能太慢,我們嘗試了模型的蒸餾、量化和 Tensor RT 以便提升性能

❹ 由於 T5 訓練時是大雜燴,把所有任務和內容放在一塊訓練,我們認爲把更相似的、可以相互影響的任務一起訓練效果很更好

除此之外還孵化了以下幾個項目

❶ 機器翻譯

❷ 複述系統

❸ 人工輔助寫作系統

❹ 拼寫糾錯、語法檢查和用詞潤色

總結

今天主要講了新浪微博在 feed 流中遇到的 NLP 問題和解決思路。我們內部正與產品、架構團隊積極溝通,以獲取高精度的用戶行爲序列用於用戶行爲的分析和建模。由於博文較短,我們沒有采用主流 LDA/PLSA 技術解決相關問題,而採用了更爲傳統的 NLP 技術和一些 trick 完成了實體/關鍵詞的挖掘和相關性計算。

從技術來講,隨着預訓練模型的出現,NLP 最近這幾年取得了實質性的進展,但不可忽略的是:傳統的 NLP 技術在某些場景下依然發揮着重要的作用。另外,一個技術趨勢是在解決相關問題時逐漸從單一的技術走向多任務、多模態、多語言的融合。

作者介紹

董興華

新浪微博 | 資深算法專家

本文來自 DataFunTalk

原文鏈接

https://mp.weixin.qq.com/s/T2Nv7dQvZR6sVht1LfKSlw

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