
概要
最近天貓用戶端上線了一個新功能“大家最關心”,當使用者搜尋某些商品類别(比如“冰箱”)時,搜尋結果中會出現一個子產品,列出該類别下使用者經常問到的一些問題(比如“聲音大嗎”)。
如果使用者對這些問題感興趣,可以繼續點選進去看到更詳細的資訊。
這裡面包含了所有常問到的問題。當使用者選擇某具體問題時,子產品還會從所有使用者寫的商品評論裡選出針對該問題的評論,并參考商品銷量及評論情感等對商品進行排序,幫使用者選出他關心的問題下較合适的商品(比如“無異味的冰箱”)。
目前該子產品已經覆寫了沙發、床、電視櫃、餐桌、餐椅、茶幾、床墊、吊燈、吸頂燈、冰箱、洗衣機、掃地機器人、空氣淨化器、淨水器、手機、耳機、筆記本電腦、投影機、藍牙音箱等這幾個大類。
要解決的問題
要實作上面的子產品需要解決如下的問題:
問題選取
使用者送出的問題裡有些是針對某一商品的,比如“有多重?”,“什麼面料的?”,有些是沒有明确答案的,比如“好用嗎?”,“哪個顔色好看?”,這些問題都應該去掉,隻保留對某類商品通用的問題,比如“好安裝嗎?”,“掉色嗎?”。
重複問題合并
使用者送出的問題裡很多意思都是重複的,比如“聲音大嗎?”,“聲音大不大?”,“冰箱聲音大嗎?”,這類問題在子產品中不能重複顯示,而是顯示最有代表性的一個。
問題和商品評論的關聯
和“問大家”裡的回答不同,當使用者送出商品評論時,并不是針對具體問題去寫的。比如這個評論“加濕器霧氣很大,也沒有多大的噪音,顔色比白色好看”裡提到了商品的多個特性,而不是針對“噪音大嗎?”這樣的問題作了回答。是以,評論資料需要和問題資料進行關聯。一個評論可以回答多個問題,也可能回答不了任何問題。隻有正确生成了評論-問題間的映射,才能在每個子產品裡顯示最相關的商品評論。
資料
該子產品用到的資料主要來自下面幾張表:
- 淘寶-社群-内容庫(tbods.s_macross_feed):該表包含了淘寶網上“問大家”子產品裡使用者送出的關于商品的所有問題和答案。
- ha3的全量評價表(search_kg.s_kg_all_comment_for_ha3):該表包含了淘寶網上使用者送出的所有商品評論。
此外,還用到了淘系商品全量表(tbcdm.dim_tb_itm),賣家評分表(search_ats.ali_seller_matrix_open_d)和商品品類詞表。
預處理
由于原始資料中存在噪聲,資料需要被預處理後才能做為後續算法的輸入。
對于問題,特殊字元和标點會從句子中删除。對于評論,空評論,無效評論和預設評論(“評價方未及時做出評價,系統預設好評!”)會從資料中删除。同時,被提問次數低的問題,銷量低的商品,評分低的賣家也會從資料中移除。這樣可以提高資料品質,并減少後續的計算量。
算法
詞向量
由于訓練資料集較少,我們直接使用了預訓練的fastText資料做為中文的word embedding,該資料集使用了中文維基百科的文章進行訓練,具體可參見【1】。
問題過濾
将問題轉化為詞向量之後,我們構造了如下分類器來判斷問題是否應該被過濾。
首先,我們使用Bidirectional LSTM來學習對整句的了解,然後取出最終的hidden state,經過dropout layer之後,通過MLP來生成一個是否需要過濾該問題的機率。對于該模型,我們從幾個類别中挑出了5000多個常見的問題,對該問題是否需要被過濾掉(是否是“針對問題”,“常見問題”,…)進行人工标注,然後随機使用80%的資料做訓練,20%的資料做測試。最後選取在測試資料上準确率大于95%的模型釋出到線上。
類目下所有問題經過過濾後,我們将其按頻率從高到低排序,做為下一步的輸入。
問題聚類
在對問題進行聚類之前,我們首先需要構造一個分類器,用于判斷兩個問題是否是同樣的意思。這個問題是NLP領域中的一個開放問題,最近有很多新算法的提出,可以參考【2】。由于我們訓練資料不大,采用了如下簡單的模型:
由于問題對中的兩個問題在分類器中處于同樣的地位,我們在模型中使用了對稱的網絡結構。對于每個問題,我們首先使用Bidirectional LSTM來對句子意思進行編碼,然後把目前問題的隐層表示作為query(target),另外一個問題的隐層表示作為memory(source)。接着使用下面的公式算出兩個序列間每對位置的相似度:
假設隐層維數是d,則W是一個d*d的變量。然後使用下面的公式對query的每個位置算出attention vector:
其中WcWc是一個d*2d的變量。Attention vector将作為第二層Bidirectional LSTM的輸入。這裡使用的是Luong’s attention,具體算法見【3】。
最後,我們将兩個問題在第二層Bidirectional LSTM的最終隐層輸出連接配接在一起,經過dropout之後,再由一個MLP生成這兩個問題是重複問題的機率。
為了生成訓練資料集,我們從高頻問題裡生成了1萬多的問題對,對是否是重複問題進行人工标注,最後用和“1. 問題過濾”類似的方法檢驗模型。
為了進一步提高聚類結果的準确率,我們設計了一個新的聚類算法,而不是簡單由模型結果判定兩個問題是否應該歸為一類,具體如下:
- 将問題按頻率降序排列,周遊每一個問題。
- 如果沒有任何類,建立一個新類并将目前問題加入其中。
- 否則,對于每個已有類中所有問題,由模型判斷目前問題是否和這些問題重複。如果目前問題和某個類中所有問題都重複,則将目前問題加入該類;如果目前問題和所有類中的所有問題都不重複,則建立一個新類并将目前問題加入其中;如果前面兩個條件都不滿足,就跳過目前問題處理下一個。
- 輸出分類成功的問題以及對應的類編号。
通過使用新的聚類算法,召回率有所損失,但是準确率得到了很大的提高。
問題和評論的關聯
判斷一段話中是否包含某問題的答案是NLP領域裡非常難的一個問題。目前這個問題并沒有很好的解決方案。由于沒有現成的訓練資料集,我們使用了“問大家”中的資料做訓練。我們嘗試了和“2. 問題聚類”中類似的模型(由于問題和段落不是對稱的,模型的兩側不再共享參數),但是在商品評論資料上應用時發現準确率較低。模型性能差的主要原因是“問大家”裡的回答都是很短的句子,而商品評論大部分都是長得多的段落。這種訓練資料和測試資料的差異導緻了模型通用性的缺失。為了解決這一問題,我們采用了基于規則(關鍵詞比對)的評論檢索方式。這種方法的缺點是召回率和可擴充性比模型低,但優點是準确率要高得多。
後續工作
- 将該子產品在手淘上線,提高使用者數。
- 使用模型來生成和問題相關的評論,使該方法能夠容易擴充到更多的類目上,來增加對商品的覆寫率。
- 使用最新的機器閱讀了解模型(比如BERT)來提高模型準确率。
參考資料:
【1】 https://fasttext.cc/docs/en/pretrained-vectors.html
【2】
https://www.kaggle.com/c/quora-question-pairs【3】
https://arxiv.org/abs/1508.04025