算法有沒(méi)有價(jià)值觀?知乎從技術(shù)維度給出了解釋
本文將來(lái)了解知乎這家公司的算法思路和應(yīng)用,且詳細(xì)介紹了知乎算法是如何通過(guò)識(shí)別垃圾廣告導(dǎo)流信息,處理人身攻擊類內(nèi)容,或是識(shí)別答非所問(wèn)等方面來(lái)維護(hù)平臺(tái)氛圍和內(nèi)容質(zhì)量的,其中不少思路值得業(yè)內(nèi)工程師們借鑒。enjoy~
你有沒(méi)有過(guò)這種體驗(yàn)?標(biāo)題挺吸引人,點(diǎn)進(jìn)去看是廣告,剛想評(píng)論心儀文章,評(píng)論區(qū)已經(jīng)被噴子占領(lǐng)。類似這樣的不良社區(qū)氛圍非常傷害大家的閱讀體驗(yàn)。例如美團(tuán)收購(gòu)摩拜的事件,一篇販賣焦慮的文章《摩拜創(chuàng)始人套現(xiàn)15億背后,你的同齡人,正在拋棄你》掃蕩了朋友圈,但同樣的事件,在知乎上“怎么看待美團(tuán)收購(gòu)摩拜”的問(wèn)題下,高贊回答都是客觀理性的分析,讀者在評(píng)論區(qū)的互動(dòng)也異?;钴S卻不是對(duì)立攻擊。
為什么知乎上還能有這樣的理性討論?客觀、理性和專業(yè)的用戶、回答者是關(guān)鍵,而用戶愿意在知乎而非其他平臺(tái)客觀討論的基礎(chǔ),則是其社區(qū)環(huán)境、崇尚專業(yè)和友善的氛圍所決定的,這也正是知乎對(duì)比其他平臺(tái)的最大優(yōu)勢(shì)之一。
隨著AI 時(shí)代來(lái)臨,算法被廣泛用于內(nèi)容推薦和廣告變現(xiàn)上,算法推薦對(duì)內(nèi)容氛圍的破壞正在引發(fā)業(yè)界擔(dān)憂和反思。近期,快手和今日頭條就因?yàn)椤八惴☉?yīng)當(dāng)有怎樣的價(jià)值觀”而廣受輿論關(guān)注,4月9日下午,今日頭條等四款應(yīng)用遭遇全網(wǎng)下架處理。
同樣是算法,全行業(yè)都在研究用戶喜好,拼命推薦內(nèi)容,而知乎似乎更關(guān)注內(nèi)容生產(chǎn)的本身,將算法大規(guī)模應(yīng)用于社區(qū)氛圍的管理,以生產(chǎn)出有價(jià)值和對(duì)用戶有幫助的內(nèi)容。知乎通過(guò)開(kāi)發(fā)“悟空”、“瓦力”等算法機(jī)器人7X24小時(shí)管理社區(qū)氛圍,譬如,“瓦力”每天處理內(nèi)容近萬(wàn)條,對(duì)于舉報(bào)上來(lái)的不友善內(nèi)容,0. 3 秒內(nèi)進(jìn)行處理。這個(gè)速度在整個(gè)行業(yè)都是名列前茅的。
知乎也決心加強(qiáng)技術(shù)能力的建設(shè),在技術(shù)圈,今年知乎大力招募算法人才的消息已經(jīng)不脛而走,明顯已開(kāi)始發(fā)力。而知乎在大眾和互聯(lián)網(wǎng)圈的品牌效應(yīng)也是驚人,身邊不少技術(shù)朋友表現(xiàn)出了興趣。下面我們可以從知乎技術(shù)團(tuán)隊(duì)發(fā)布的專欄了解下這家公司的算法思路和應(yīng)用,這幾篇文章詳細(xì)介紹了知乎算法是如何通過(guò)識(shí)別垃圾廣告導(dǎo)流信息,處理人身攻擊類內(nèi)容,或是識(shí)別答非所問(wèn)等方面來(lái)維護(hù)平臺(tái)氛圍和內(nèi)容質(zhì)量的,其中不少思路值得業(yè)內(nèi)工程師們借鑒。(以下內(nèi)容知乎技術(shù)授權(quán)“吳懟懟”發(fā)布,如有不妥之處歡迎指正討論)
以下為Quote:
算法在社區(qū)氛圍的應(yīng)用(一):識(shí)別垃圾廣告導(dǎo)流信息
近期,我們發(fā)現(xiàn)社區(qū)內(nèi)出現(xiàn)了垃圾廣告的導(dǎo)流內(nèi)容,影響用戶體驗(yàn),破壞認(rèn)真、專業(yè)和友善的社區(qū)氛圍。為了解決這種情況,我們進(jìn)行了大量努力和探索。最開(kāi)始在識(shí)別導(dǎo)流信息上采用的是干擾轉(zhuǎn)換+正則匹配+匹配項(xiàng)回溯的方式進(jìn)行異常導(dǎo)流信息的識(shí)別與控制,取得了很好的效果。
但是我們發(fā)現(xiàn),隨著我們處理這些內(nèi)容的同時(shí),他們正在逐步增加導(dǎo)流信息的各種變體,常見(jiàn)的有以下幾種方式:第一種變體是導(dǎo)流前綴的變化,如 QQ 導(dǎo)流前綴變化成企鵝,「騰順」等等;第二變體是不使用前綴,如退款 123377281;第三種變體是導(dǎo)流中隨機(jī)插入非特殊字符,如 319xxxx053xxxx7178。我們對(duì)這些變體進(jìn)行了收集整理和分析。
通過(guò)對(duì)典型導(dǎo)流樣本的分析,我們發(fā)現(xiàn)盡管導(dǎo)流信息變體在不斷演化,但是它們所在的上下文變化并不明顯。因此,我們嘗試通過(guò)序列標(biāo)注的方式來(lái)識(shí)別導(dǎo)流內(nèi)容,提高算法的識(shí)別準(zhǔn)確度。
模型
常用的序列標(biāo)注算法,有 HMM、CRF、RNN、BILSTM-CRF 等。BILSTM-CRF 在多個(gè)自然語(yǔ)言序列標(biāo)注問(wèn)題(NER、POS)上都表現(xiàn)優(yōu)秀,同時(shí),通過(guò)實(shí)驗(yàn),我們也發(fā)現(xiàn) BILSTM-CRF 表現(xiàn)優(yōu)于其他模型。
網(wǎng)絡(luò)結(jié)構(gòu)
BILSTM-CRF 模型結(jié)構(gòu)如下圖所示:
第一層為 Embedding 層,將輸入文本轉(zhuǎn)換為詞向量表示。
第二層為雙向 LSTM 層。LSTM 具有強(qiáng)大的序列建模能力,能夠捕捉長(zhǎng)遠(yuǎn)的上下文信息,同時(shí)還擁有神經(jīng)網(wǎng)絡(luò)擬合非線性的能力。相比單向的 LSTM,雙向 LSTM 不僅能夠利用以前的上下文信息,還能利用未來(lái)的上下文信息。
第三層為一個(gè)全連接層。作用是將上一層的輸出,映射為 [T,C] 的向量,T為輸入序列長(zhǎng)度,C為標(biāo)簽數(shù)量。輸出的也就是每個(gè) timestep 對(duì)應(yīng)的狀態(tài) score。
最后一層為 linear-chain CRF 層。CRF 計(jì)算的是一種聯(lián)合概率,優(yōu)化的是整個(gè)序列(最終目標(biāo)),而不是將每個(gè)時(shí)刻的最優(yōu)拼接起來(lái)。在 CRF 層,使用 viterbi 解碼算法從狀態(tài) score 和轉(zhuǎn)移矩陣中解碼得到輸出狀態(tài)序列。
BILSTM-CRF 模型同時(shí)結(jié)合了 LSTM 和 CRF 的優(yōu)點(diǎn),使得其在序列標(biāo)注任務(wù)上具有極強(qiáng)的優(yōu)勢(shì)。
CRF
從上述網(wǎng)絡(luò)結(jié)構(gòu),可知要優(yōu)化的目標(biāo)函數(shù)由最后一層決定。
通常給定一個(gè)線性鏈條件隨機(jī)場(chǎng) ,當(dāng)觀測(cè)序列為時(shí),
標(biāo)簽序列為的概率可寫為
其中,Z(x) 為歸一化函數(shù),對(duì)所有可能的標(biāo)簽序列求和。
是特征函數(shù),通??紤]轉(zhuǎn)移特征和狀態(tài)特征兩方面。狀態(tài)特征描述標(biāo)簽之間的相似程度,是上一層網(wǎng)絡(luò)的輸出。
轉(zhuǎn)移特征考慮狀態(tài)之間的變化趨勢(shì)
在模型的概率給出之后,可以使用最大似然估計(jì)優(yōu)化參數(shù),即最小化負(fù)對(duì)數(shù)似然 -logP(y|x),從而得到整個(gè)網(wǎng)絡(luò)的 loss function。
是否包含前后綴?
訓(xùn)練模型之前,我們需要標(biāo)記訓(xùn)練數(shù)據(jù)。
標(biāo)記訓(xùn)練數(shù)據(jù)的一個(gè)問(wèn)題是,是否要包含導(dǎo)流信息的前后綴。如「加V:xxxxxx」,是否需要包含「加V」。通常情況下,答案應(yīng)該是不包含,因?yàn)槲覀兊膶?shí)體是微信號(hào),「加 V」不屬于我們要識(shí)別的實(shí)體。
但是,我們?cè)趯?shí)驗(yàn)過(guò)程中發(fā)現(xiàn),如果不加前后綴,模型會(huì)把大量的英文單詞,或者字母數(shù)字組合,標(biāo)記為導(dǎo)流內(nèi)容。原因是,作為中文社區(qū),英文單詞出現(xiàn)頻率很低,同時(shí)大部分導(dǎo)流信息都是字母數(shù)字組合,從而使得模型出現(xiàn)錯(cuò)誤。
針對(duì)這種情況,我們?cè)谔幚頂?shù)據(jù)時(shí),將導(dǎo)流信息的前后綴也作為實(shí)體的一部分,有效的降低了上述問(wèn)題出現(xiàn)的概率。
實(shí)體編碼
序列標(biāo)注模型另一個(gè)需要注意的問(wèn)題是,實(shí)體編碼的格式。常用的序列實(shí)體編碼方式有IO、BIO、BMEWO三種。
IO 編碼是最簡(jiǎn)單的編碼,它將屬于類型X的實(shí)體的序列元素標(biāo)記為 I_X,不屬于任何實(shí)體的序列元素標(biāo)記為 O。這種編碼存在缺陷,因?yàn)樗荒艽肀舜讼噜彽膬蓚€(gè)實(shí)體,因?yàn)闆](méi)有邊界標(biāo)簽。
BIO 編碼是當(dāng)前實(shí)體編碼的行業(yè)標(biāo)準(zhǔn)。它將表示實(shí)體的 I_X 標(biāo)簽細(xì)分為實(shí)體開(kāi)始標(biāo)簽 B_X和實(shí)體延續(xù)標(biāo)簽 I_X。
BMEWO 編碼進(jìn)一步區(qū)分實(shí)體結(jié)束元素 E_X 和實(shí)體中間元素令 M_X,并為單元素實(shí)體添加一個(gè)全新的標(biāo)簽 W_X。
上述三種編碼的示例,如下所示:
綜合考慮,我們選擇 BIO 編碼,一是滿足我們對(duì)于導(dǎo)流信息的區(qū)分,二是其標(biāo)記方式相對(duì)通用。
效果
在實(shí)驗(yàn)階段,分別將 HMM、BILSTM、BIGRU、BILSTM-CRF 做了一系列的對(duì)比,將表現(xiàn)比較好的 BILSTM-CRF 放在線上與原本的 Base 模型進(jìn)行 AB 實(shí)驗(yàn)。從結(jié)果上來(lái)看,寬深度學(xué)習(xí)模型在線下/線上都有比較好的效果。線上實(shí)驗(yàn)結(jié)論如下:
后續(xù)的改進(jìn)
為了提高模型的效果,我們需要使用更多的訓(xùn)練數(shù)據(jù),構(gòu)造更復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),使用更多的超參數(shù)設(shè)置訓(xùn)練模型。然而,不斷增加的模型尺寸和超參數(shù)極大地延長(zhǎng)了訓(xùn)練時(shí)間。很明顯,計(jì)算能力已經(jīng)成為了模型優(yōu)化的主要瓶頸。相比 CNN 和 Attention 等操作,LSTM 仍然不太適應(yīng)多線程 /GPU 計(jì)算,訓(xùn)練速度偏慢,不能充分利用GPU的并行計(jì)算優(yōu)勢(shì)。因此,我們還在嘗試 SRU 等RNN 加速方案,希望在模型效果損失不大的情況下,提高模型的訓(xùn)練速度。
我們當(dāng)前采用的是Char-based model,Char-based model在一個(gè)優(yōu)勢(shì)在于利用詞元(lemmas)和形態(tài)學(xué)信息(morphological information ),能更好的處理導(dǎo)流內(nèi)容內(nèi)部結(jié)構(gòu),如手機(jī)號(hào)的組成。另一方面,Word-based model 更多的利用詞語(yǔ)信息,詞語(yǔ)比字具有更高的抽象等級(jí),通常正確率會(huì)更高。我們希望通過(guò)訓(xùn)練一個(gè)新的分詞模型的方式,使得在保持處理導(dǎo)流內(nèi)容內(nèi)部結(jié)構(gòu)的情況下,構(gòu)建 Word-based model。
算法在社區(qū)氛圍的應(yīng)用(二):深度學(xué)習(xí)在不友善文本識(shí)別中的應(yīng)用
此前,我們常常收到知友們的反饋說(shuō)「好煩哦,TA 又不友善了」、「我要舉報(bào) XX,TA 在評(píng)論區(qū)又開(kāi)始杠上了」、「這種辱罵他人的人,你們都不處理嗎?」等等。今年年初,我們開(kāi)始嘗試用深度學(xué)習(xí)算法輔助審核人員處理不友善問(wèn)題,經(jīng)過(guò)近三個(gè)月的探索和嘗試,目前該算法第一版已經(jīng)上線,并且取得相對(duì)不錯(cuò)的效果。
知乎不友善文本識(shí)別應(yīng)用的場(chǎng)景和策略
目前,瓦力識(shí)別不友善的算法已經(jīng)應(yīng)用在知友們的舉報(bào)和社區(qū)實(shí)時(shí)產(chǎn)生的內(nèi)容中。針對(duì)這兩種內(nèi)容的不同場(chǎng)景和特點(diǎn),我們采用了不同的處理策略:
舉報(bào)內(nèi)容的處理策略
瓦力有效地提升了我們的舉報(bào)處理效率和響應(yīng)速度。目前,我們每天約收到知友們近 25,000 條舉報(bào)。在這些舉報(bào)中,大約有 7,000 條是關(guān)于不友善的內(nèi)容。模型訓(xùn)練階段,我們利用經(jīng)過(guò)人工標(biāo)注的舉報(bào)內(nèi)容進(jìn)行模型訓(xùn)練。線上預(yù)測(cè)階段,如果模型預(yù)測(cè)某條內(nèi)容屬于不友善的概率x 大于閾值 p_abuse,瓦力會(huì)在 0.3 秒間完成判斷并直接刪除,內(nèi)容被處理后,知友們也會(huì)收到相應(yīng)的私信通知;如果模型預(yù)測(cè)該內(nèi)容屬于非不友善類型的概率 x 大于閾值 p_friend,則認(rèn)為該內(nèi)容屬于非不友善內(nèi)容,那么該舉報(bào)會(huì)被忽略;不滿足以上條件的內(nèi)容,我們會(huì)進(jìn)行多次人工審核判斷,人工審核后的判斷標(biāo)準(zhǔn)也會(huì)用于下一輪模型的迭代和升級(jí)。
我們重視每一個(gè)舉報(bào),并根據(jù)舉報(bào)內(nèi)容增強(qiáng)瓦力可識(shí)別的范圍和準(zhǔn)確度,還會(huì)每日人工復(fù)核知友們的舉報(bào),針對(duì)可能存在不同處理意見(jiàn)的舉報(bào),會(huì)根據(jù)規(guī)范與實(shí)際的應(yīng)用場(chǎng)景多次復(fù)審。在這里,我們也非常感謝知友們的每一次舉報(bào),感謝大家與我們一起并肩維護(hù)社區(qū)氛圍,我們也正是在知友們的舉報(bào)中逐漸形成統(tǒng)一的判斷標(biāo)準(zhǔn)。
全量?jī)?nèi)容的處理策略
我們會(huì)對(duì)每天新產(chǎn)生的內(nèi)容進(jìn)行全量審核,每天可以實(shí)時(shí)攔截處理 3,000 條內(nèi)容。在實(shí)際的操作過(guò)程中,我們發(fā)現(xiàn)全量?jī)?nèi)容有如下兩個(gè)特點(diǎn)使其不能跟舉報(bào)內(nèi)容共用模型和策略:
- 不友善樣本和非不友善樣本分布非常不均衡;
- 詞語(yǔ)分布和舉報(bào)內(nèi)容有區(qū)別。比如,舉報(bào)內(nèi)容中包含「SB、NC」之類的臟詞的基本屬于不友善類型;但是在全量?jī)?nèi)容中臟字、臟詞可能出現(xiàn)在影視作品討論、陳述自己的經(jīng)歷等場(chǎng)景等非不友善內(nèi)容中,例如:坑到你頭皮發(fā)麻?!遏敯嘀巧潭傥濉?/li>
由于數(shù)據(jù)不均衡、數(shù)據(jù)排查標(biāo)注成本較高和上述數(shù)據(jù)的分布特點(diǎn),全量?jī)?nèi)容模型要做到準(zhǔn)確率 98% 以上非常困難,因此我們根據(jù)人工審核量,選擇一個(gè)適宜的閾值,在保證每天召回量的基礎(chǔ)上,維持召回內(nèi)容的處理準(zhǔn)確率到 80% 以上,并將召回的內(nèi)容進(jìn)行人工審核。
知乎社區(qū)不友善文本識(shí)別系統(tǒng)基本框架
目前,不友善內(nèi)容處理系統(tǒng)架構(gòu)如下圖所示(以知友舉報(bào)內(nèi)容識(shí)別識(shí)別系統(tǒng)為例,全量?jī)?nèi)容識(shí)別系統(tǒng)與其類似)
不友善內(nèi)容處理系統(tǒng)框圖
我們?cè)谶x擇模型時(shí)在小批量數(shù)據(jù)集上對(duì)比了 lstm 模型、svm 和樸素貝葉斯模型,lstm 模型表現(xiàn)最好,因此我們的模型優(yōu)化工作主要集中在深度學(xué)習(xí)模型上。
詞向量
將詞用「詞向量」表示是深度學(xué)習(xí)模型處理 NLP 問(wèn)題的關(guān)鍵一步,我們的系統(tǒng)中使用 Google 提出的 word2vec 詞向量模型,訓(xùn)練數(shù)據(jù)采用來(lái)自知乎社區(qū) 300 多萬(wàn)條真實(shí)的提問(wèn)、評(píng)論、回答數(shù)據(jù),內(nèi)容涉及娛樂(lè)、政治、新聞、科學(xué)等各個(gè)領(lǐng)域,詞向量維度采用 128 維,訓(xùn)練模型窗口大小 5。
Word2vec 的原理和使用方法這里就不做過(guò)多介紹了,有興趣的可以閱讀文獻(xiàn)[1],Python 版本實(shí)現(xiàn)的可以參考 gensim官方文檔。
text-cnn
TextCNN 是利用卷積神經(jīng)網(wǎng)絡(luò)對(duì)文本進(jìn)行分類的算法,2014 年由 Yoon Kim 提出(見(jiàn)參考[3])。 TextCNN 的結(jié)構(gòu)比較簡(jiǎn)單,其模型的結(jié)構(gòu)如下圖:
ext-cnn 網(wǎng)絡(luò)結(jié)構(gòu)
Embedding Layer——該層將輸入的自然語(yǔ)言編碼成 distributed representation,我們的模型該層使用 word2vec 預(yù)先訓(xùn)練好的詞向量,同時(shí)該層設(shè)置為 trainable。
Convolution Layer——這一層主要是通過(guò)卷積,提取文本的 n-gram 特征,輸入文本通過(guò) embedding layer 后,會(huì)轉(zhuǎn)變成一個(gè)二維矩陣,假設(shè)文本的長(zhǎng)度為 |T|,詞向量的大小為 |d|,則該二維矩陣的大小為 |T|x|d|,接下的卷積工作就是對(duì)這一個(gè) |T|x|d| 的二維矩陣進(jìn)行的。卷積核的大小一般設(shè)為 n x |d|,n 是卷積核的長(zhǎng)度,|d| 是卷積核的寬度(LP 中通常取詞向量的維度)。我們的模型中 n 取 [2,3,4,5]4 個(gè)值,每個(gè)值固定取 128 個(gè) filter。
Max Pooling Layer——最大池化層,對(duì)卷積后得到的若干個(gè)一維向量取最大值,然后拼接在一塊,作為本層的輸出值。如果卷積核的 size=2,3,4,5 每個(gè) size 有 128 個(gè) filter,則經(jīng)過(guò)卷積層后會(huì)得到 4×128 個(gè)一維的向量,再經(jīng)過(guò) max-pooling 之后,會(huì)得到 4×128 個(gè) scalar 值,拼接在一塊,最終得到一個(gè) 512×1 的向量。max-pooling 層的意義在于對(duì)卷積提取的 n-gram 特征,提取激活程度最大的特征。
Fully-connected Layer——將 max-pooling layer 后再拼接一層,作為輸出結(jié)果。實(shí)際中為了提高網(wǎng)絡(luò)的學(xué)習(xí)能力,可以拼接多個(gè)全連接層。
Softmax——根據(jù)類別數(shù)目設(shè)定節(jié)點(diǎn)數(shù),我們不友善文本識(shí)別項(xiàng)目是二分類問(wèn)題,設(shè)置一個(gè)節(jié)點(diǎn),激活函數(shù)選擇 sigmoid。
Bi-LSTM
CNN 最大問(wèn)題是固定 filter_size 的視野,無(wú)法建模更長(zhǎng)的序列信息,自然語(yǔ)言處理中更常用的是 RNN,因?yàn)?RNN 能夠更好的表達(dá)上下文信息。在文本分類任務(wù)中,由于語(yǔ)句過(guò)長(zhǎng),會(huì)出現(xiàn)梯度消失或梯度爆炸的問(wèn)題,基本的RNN網(wǎng)絡(luò)難于處理語(yǔ)言中的長(zhǎng)程依賴問(wèn)題,為了解決這個(gè)問(wèn)題,人們提出了 LSTM 模型。我們?cè)趯?duì)比 LSTM 和 Bi-LSTM 效果后選擇了 Bi-LSTM,Bi-LSTM 從某種意義上可以理解為可以捕獲變長(zhǎng)且雙向的「n-gram」信息。圖 3 是 Bi-LSTM 用于分類問(wèn)題的網(wǎng)絡(luò)結(jié)構(gòu),黃色的節(jié)點(diǎn)分別是前向和后向RNN的輸出,示例中的是利用最后一個(gè)詞的結(jié)果直接接全連接層 softmax 輸出了。我們的實(shí)際使用的網(wǎng)絡(luò)結(jié)構(gòu)在全聯(lián)接層之后加了一層 dropout 層,dropout 輸出接 sigmoid 二元分類層。RNN、LSTM、BI-LSTM 可以參考文獻(xiàn)[4]。
用于文本分類的雙向 LSTM 網(wǎng)絡(luò)結(jié)構(gòu)
我們參考論文 A C-LSTM Neural Network for Text Classification 來(lái)實(shí)現(xiàn) CNN-LSTM 文本分類模型,模型的網(wǎng)絡(luò)結(jié)構(gòu)如下所示(該圖直接來(lái)自論文)
CNN-ISTM 網(wǎng)絡(luò)結(jié)構(gòu)
效果
舉報(bào)的內(nèi)容
知友舉報(bào)內(nèi)容不管是直接刪除還是直接忽略,都要求算法有較高的準(zhǔn)確率(本文準(zhǔn)確率沒(méi)有特別說(shuō)明的情況下指 precision),經(jīng)過(guò)對(duì)比不同模型的評(píng)測(cè)效果,目前線上選用模型和準(zhǔn)確率、召回率如下:
全量?jī)?nèi)容
經(jīng)過(guò)模型調(diào)優(yōu)和對(duì)比不同模型的評(píng)測(cè)效果,目前線上使用的模型和準(zhǔn)確率、召回率如下:
后續(xù)工作
我們會(huì)利用更多數(shù)據(jù)模型,嘗試更復(fù)雜定神經(jīng)網(wǎng)絡(luò)并進(jìn)行語(yǔ)義分析。通過(guò)分析實(shí)際操作中的 bad case 可以發(fā)現(xiàn),有些文本帶有臟字、臟詞但并不屬于不友善類別,同時(shí)也存在一些很隱晦的不友善內(nèi)容,主要有以下三類:
- 影視、社會(huì)熱點(diǎn)事件討論中,評(píng)價(jià)影視作品中的人物或者熱點(diǎn)事件當(dāng)事人,例如:這個(gè)視頻難道不是貨車司機(jī)的錯(cuò),有時(shí)候又想去延安路龍翔橋附近斑馬線前停一天車,MDZZ 規(guī)定。
- 陳述自己等經(jīng)歷,例如:我當(dāng)時(shí)竟然信了,覺(jué)得當(dāng)時(shí)的自己就是 FJ 。
- 詼諧詞語(yǔ)或反語(yǔ),例如:你真聰明,連這都不會(huì);有哪些人工 ZZ 發(fā)明。
我們會(huì)繼續(xù)嘗試用深度學(xué)習(xí)做語(yǔ)義分析,對(duì)文本進(jìn)行語(yǔ)義角色標(biāo)注(見(jiàn)參考文獻(xiàn)[6]),抽取句子的施事者(Agent)、受事者(Patient)、客體及其對(duì)應(yīng)的描述詞;通過(guò)語(yǔ)義相似度構(gòu)建語(yǔ)義詞典;將語(yǔ)義信息融合到我們的不友善文本識(shí)別模型中。
參考文獻(xiàn):
- [1]https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf
- [2] https://radimrehurek.com/gensim/models/word2vec.html
- [3]https://arxiv.org/abs/1408.5882
- [4]https://blog.csdn.net/zzulp/article/details/79379960
- [5]https://arxiv.org/pdf/1511.08630.pdf
- [6] Chinese semantic role labeling with shallow parsing
算法在社區(qū)氛圍的應(yīng)用(三): 機(jī)器學(xué)習(xí)在答非所問(wèn)識(shí)別上的運(yùn)用
跳繩的好處有哪些?可以鍛煉哪些肌肉?
A:心肺功能比之前有提高。
B:有助于提高身體的乳酸閾值。
C:有助于提高身體的協(xié)調(diào)性。
D:謝謝,我去買了跳繩。
請(qǐng)問(wèn),以上哪個(gè)答案是答非所問(wèn)?
現(xiàn)在,瓦力可直接識(shí)別并處理該題中的答非所問(wèn)內(nèi)容。
我們鼓勵(lì)認(rèn)真、專業(yè)的分享,期待每一次討論都能碰撞出更多有價(jià)值的信息,并希望每一個(gè)用心的回答都能夠得到好的展示,為他人帶來(lái)更多幫助。但是,我們也發(fā)現(xiàn)在社區(qū)中出現(xiàn)了答非所問(wèn)類的內(nèi)容,影響知友們獲取有價(jià)值內(nèi)容的效率。
為了更好地識(shí)別答非所問(wèn)類內(nèi)容,我們采用了多種模型,包括傳統(tǒng)的機(jī)器學(xué)習(xí)模型和比較新的深度學(xué)習(xí)模型。通過(guò)前期對(duì)語(yǔ)料的分析,我們發(fā)現(xiàn)語(yǔ)言用詞、作者歷史行為、知友對(duì)內(nèi)容的反饋信息等都具有比較明顯的區(qū)分度,因而我們嘗試使用特征工程和傳統(tǒng)機(jī)器學(xué)習(xí)方法實(shí)現(xiàn)了瓦力識(shí)別答非所問(wèn)的第一版模型,并達(dá)到了一個(gè)相對(duì)不錯(cuò)的效果。
Random Forest
隨機(jī)森林 (Random Forest) 是樹(shù)模型里兩個(gè)常用模型之一(另一個(gè)是 Gradient Boosting Decision Tree)。顧名思義,就是用隨機(jī)的機(jī)制建立一個(gè)森林,森林由多棵分類樹(shù)構(gòu)成。當(dāng)新樣本進(jìn)入時(shí),我們需要將樣本輸入到每棵樹(shù)中進(jìn)行分類。打個(gè)形象的比喻,知乎森林召開(kāi)議會(huì),討論@劉看山
到底是狗還是北極狐(看山,我知道你是北極狐的,手動(dòng)捂臉逃…),森林中的每棵樹(shù)都獨(dú)立發(fā)表了自己對(duì)這個(gè)問(wèn)題的觀點(diǎn),做出了自己的判斷。最終劉看山是狗還是北極狐,要依據(jù)投票情況來(lái)確定,獲得票數(shù)最多的類別就是這片森林對(duì)其的分類結(jié)果。如同圖一所示意境。
森林會(huì)議
樣本
通過(guò)訓(xùn)練語(yǔ)料和業(yè)務(wù)數(shù)據(jù),進(jìn)行特征工程,提取出了以下三類特征:
- 回答和問(wèn)題的文本特征:如二者的詞向量、詞向量相似度、關(guān)鍵詞相似度、話題相似度等;
- 回答的統(tǒng)計(jì)特征:如回答的贊同、反對(duì)、評(píng)論、舉報(bào)等是用戶對(duì)其的交互特征;
- 回答作者的統(tǒng)計(jì)特征:正向行為,如關(guān)注、回答、提問(wèn)、評(píng)論、舉報(bào)等,負(fù)向行為,如回答被贊同、被反對(duì)、被感謝、被舉報(bào)等。
同時(shí),通過(guò)歷史積累、用戶標(biāo)注、策略生成產(chǎn)生出了訓(xùn)練樣本集,然后用以上特征類別表示出每條樣本。
分類樹(shù)
使用隨機(jī)有放回抽樣選取每棵樹(shù)的訓(xùn)練樣本,隨機(jī)選取 m 個(gè)特征 (m < 總特征數(shù)) 進(jìn)行無(wú)限分裂生長(zhǎng),成長(zhǎng)為能獨(dú)立決策的樹(shù)。
投票決策
通過(guò)建好的多棵分類樹(shù),對(duì)新的樣本進(jìn)行決策投票,獲得最終的分類結(jié)果。
對(duì)于 Random Forest 的實(shí)現(xiàn),有很多優(yōu)秀開(kāi)源的實(shí)現(xiàn),在實(shí)際中我們封裝了 Spark 中的 Random Forest 完成了模型的迭代。最終取得了 Precision 97%,Recall 58% 左右的不錯(cuò)結(jié)果。
細(xì)心的知友可能注意到了,我們的特征里有一類特征是與時(shí)間和回答的暴光有關(guān)的,即回答和作者的統(tǒng)計(jì)特征。為此我們?cè)诂F(xiàn)有模型的基礎(chǔ)上分析了這類特征的時(shí)間累積效果,如圖二所示。從圖中可以看到,經(jīng)過(guò)一天的統(tǒng)計(jì)特征累積,Precision 達(dá)到了 90%,但 Recall 只有 40%,可以說(shuō)這一天時(shí)間對(duì)于 40% 的答非所問(wèn)有了比較充分的特征積累以支撐對(duì)其的準(zhǔn)確判斷。而隨時(shí)間的增加,基本上 Precision 和 Recall 都有提升。但并不是時(shí)間越長(zhǎng),提升越多。
最終我們結(jié)合產(chǎn)品應(yīng)用層面和算法閾值,分別選出兩個(gè)時(shí)間點(diǎn),一方面犧牲 Recall 快速識(shí)別處理一部分答非所問(wèn)的回答,另一方面允許一定的處理延時(shí),保證了大量的 Recall,大大凈化了回答區(qū)域的無(wú)關(guān)內(nèi)容。
統(tǒng)計(jì)特征累積周期(天)對(duì) Precision 和 Recall 的影響
傳統(tǒng)機(jī)器學(xué)習(xí)的一個(gè)核心內(nèi)容就是特征工程,包括特征提取、特征選擇等。
- 特征提?。?/strong>從原始數(shù)據(jù)出發(fā)構(gòu)造出特征,通常包括業(yè)務(wù)和對(duì)語(yǔ)料的統(tǒng)計(jì)分析。
- 特征選擇:從提取出的候選特征中挑選出有用的特征。
但特征工程總是會(huì)耗費(fèi)比較多的時(shí)間,而且在答非所問(wèn)的識(shí)別中一些時(shí)間相關(guān)的特征,還延長(zhǎng)了處理周期,不利于快速處理。而廣為流傳的深度學(xué)習(xí),能自動(dòng)對(duì)輸入的低階特征進(jìn)行組合、變換,映射到高階的特征,這也促使我們轉(zhuǎn)向深度學(xué)習(xí)進(jìn)行答非所問(wèn)的識(shí)別。
深度學(xué)習(xí)興起于圖像識(shí)別,其過(guò)程可以引用圖三[1] 大致描繪,輸入特征,經(jīng)隱藏層逐層抽象、組合,最后經(jīng)輸出層得出識(shí)別結(jié)果。
深度學(xué)習(xí)示意
相較于圖片天然的像素表征,可以直接輸入到深度神經(jīng)網(wǎng)絡(luò)里,文本需要進(jìn)行向量化后方可作為網(wǎng)絡(luò)的輸入。關(guān)于「詞向量化」的精彩描述可以參考[2]。此處我們抽取了知乎社區(qū) 1000 多萬(wàn)真實(shí)的文本信息,包括問(wèn)題、回答、文章、評(píng)論等數(shù)據(jù),利用 Facebook 開(kāi)源的 FastText 訓(xùn)練了 256 維的詞向量和字向量。對(duì)于 FastText 的原理和用法此處不作詳細(xì)闡述,感興趣的朋友可以參考[3]。
CNN 網(wǎng)絡(luò) (Convolutional Neural Network)
我們模型的網(wǎng)絡(luò)結(jié)構(gòu)基本上采用了 Severyn[4] 提出的網(wǎng)絡(luò)結(jié)構(gòu),但在一些細(xì)節(jié)上做了些改動(dòng),比如圖四中的 CNN-answer/question, 我們結(jié)合了 Wide & Deep[5] 的思想,以提取更為豐富的語(yǔ)義信息。
模型結(jié)構(gòu)
Embedding Layer——該層利用預(yù)訓(xùn)練好的 FastText 詞向量將原始詞序列表達(dá)成詞向量序列
Convolutional Layer——此層主要通過(guò)卷積操作,同時(shí)捕獲類似于 N-Gram 特征(但同 N-Gram 還是有差異的)。我們的模型選取了 [2, 3, 4, 5, 6] 5 個(gè)卷積核寬度,為每個(gè)卷積核配置了 64 個(gè) filter
Pooling Layer——池化層,對(duì)經(jīng)過(guò)卷積操作提取的特征進(jìn)行 Sampling。此處我們采用了 K-Max-Average pooling,對(duì)卷積層提取的特征,選擇出激活程度 top-K 的特征值的平均值作為 pooling 的結(jié)果
Feature Join & Fully connected Layer——將前述幾層獲得的特征,以及額外信息進(jìn)行融合,作為最終的特征輸出,以便于最后的決策判斷。實(shí)際上,我們?cè)?Fully Connection 后面加了 3 層 Dense Layer,以提高網(wǎng)絡(luò)的表達(dá)能力。
Softmax——將最后的特征轉(zhuǎn)換成二分類決策概率。
最終訓(xùn)練好該模型,在驗(yàn)證集上達(dá)到了 Precision 78%, Recall 80% 的效果。Recall 雖有比較大的提升,但 Precision 并沒(méi)有前文描述的 Random Forest 的方法好。
效果
目前,答非所問(wèn)幾個(gè)模型都上線到了知乎產(chǎn)品的諸多場(chǎng)景下,如反對(duì)、舉報(bào)、專項(xiàng)清理等。每天清理約 5000 條新產(chǎn)生的「答非所問(wèn)」內(nèi)容,以及此前現(xiàn)存的 115 萬(wàn)條「答非所問(wèn)」內(nèi)容。
參考文獻(xiàn):
- [1] Breaking it down: A Q&A on machine learning
- [2] 詞向量和語(yǔ)言模型
- [3] FastText
- [4] Learning to rank short text pairs with convolutional deep neural networks
- [5] Wide & Deep Learning for Recommender Systems
#專欄作家#
吳懟懟,微信公眾號(hào):吳懟懟(esnql520),人人都是產(chǎn)品經(jīng)理專欄作家。資深媒體人,專注互聯(lián)網(wǎng)內(nèi)容、品牌與公關(guān)領(lǐng)域個(gè)性解讀。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
一定要評(píng)論?不評(píng)論看不了???