0 小系列初衷
自己接觸的項目大都是初創,沒開始多久的項目,從0到1的不少,2020年快結束,感覺這個具有一定個人特色的技術經驗可以在和大家分享一下。
計劃篇章:
(已完成)文本分類篇。針對NLP文本分類任務。
(已完成)序列標注(NER)篇。針對命名實體識別、序列標注任務。
文本匹配篇。針對語義相似度計算、向量匹配等問題。
人工特征學習篇。針對多特征的機器、深度學習方案。
開始我把這個標題叫做語義匹配,后來感覺還是不能叫這個名字,應該把問題放大為句子相似度和匹配問題。
1 語義匹配的場景
語義匹配的核心其實是評價兩個query之間的相似度,可以看看現在常用的場景:
搜索領域,語義向量召回是一個比較新潮的召回方式,靈活性更高,下游的精排部分也可以通過語義相似度來進行排序。
智能客服,之前的阿里小蜜的文章也提過,對于長尾的結果,可以通過向量召回的方式來進行處理。
對話領域,可以說是智能客服的眼神,閑聊類的,可以通過語義匹配完成閑聊的回復,當然多輪也有多輪的玩法。
可以看到,各種領域,其實語義匹配的舞臺非常大,了解這方面的方案對NLP技術棧的了解非常有用。
2 方法選型
2.1 文本層面的相似
最簡單的方法往往就是最淺層的方案,所以還是文本層面的相似,方法逐步升級是這樣的:
編輯距離,這應該是最嚴格的一種相似了。
cqr,分子是句子1和句子2詞匯的交集詞匯量,分母是句子1和句子2的并集詞匯量。
加權的cqr,可以做一個簡單的詞權重,然后做加權的cqr。
BM25。傳統搜索的常用方法。
文本層面的方法,在搜索領域已經非常成熟,BM25已經具有很高的準度,結合上游常用的一些改寫,其實已經能夠達到很好的效果,這也是經典搜索最常用的一套范式。
2.2 向量表征作召回
向量召回是當前比較流行的一種新的搜索技術,這里以來兩個關鍵技術點,向量索引和句子表征技術。
向量索引的是指就是一種向量最近鄰的搜索方案,最常用的場景就是KNN,而在我們的場景中,就是把句子表征成一個向量,構建索引,新來一個句子,用同樣的放哪個還是構建一個向量,就可以完成相似度召回,常用的構建索引方式推薦兩種,這兩種都已經有開源工具支持。
annoy,一種基于樹的構造方法。
hnsw,一種基于圖的構造方法,這應該是目前我已知速度最快的方法了。
說完了向量索引,就要說向量表征了,只有足夠好的向量表征,上面說的向量召回,召回的東西才會足夠好,為什么我說好呢,就是因為這里涉及的好的維度多:
準確率足夠高,召回的內容真的是和句子足夠接近。
有比較強的泛化能力,這也是語義向量召回相比傳統搜索的相似召回最突出的優勢,只要語義足夠接近,“查詢”和“查看”就可能匹配到,“冪冪”和“楊冪”也能打中,這樣能降低我們挖掘數據帶來的成本。
好的相似度匹配能識別關鍵詞,只需要模型端到端處理,不需要單獨抽關鍵詞。
那么,這個語義表征,一般都是什么方法呢,這里也是提幾個:
word2vector預訓練。如果語料不足甚至沒有語料,我們其實可以用開源的預訓練好的w2v詞向量作為基線,取均值就能拿到句向量。
如果有一些平行樣本,可以開始考慮用一些平行預料(sentence1,setence2,label)進行finetuning,說白了就是兩個向量分別去詞向量后均值,最終用余弦或者歐氏距離計算相似度就行。
數據量足夠后,就可以開始在上面搭積木了,CNN、LSTM之類的都可以嘗試,當然經驗之談,self-attention可以嘗試。
數據量再多點,我們就可以上bert之類的大家伙了。
現在的語義相似度,更多是通過優化交互特征來提升相似度計算的效果,但是在向量召回這里,由于目前只能支持簡單的相似度召回,兩個query只有在計算相似度的最后一步才能夠見面,因此query之間的交互特征是無法提取的,所以很多現在流行的方法是用不了的。
2.3 語義相似度
如果語義相似度要被用在后續的精排,無論是搜索、對話甚至是推薦,在經歷初篩之后,我們往往有更多時間和經歷來比對剩余的結果和用戶query之間的相似程度,此時我們就可以使用交互特征逐一匹配,完成最后的精排,這些方案往往在大量比賽中就有提到,以DSSM為基,升級很多方案,包括很多人知道的EISM等,當然比賽的經驗也告訴我們,模型本身還可以加入更多的文本特征來協助衡量語義相似度,因此在用語義相似度模型的同時,可以加入一些人工特征來協助優化,這也是推薦系統的wide&deep中所提到的深淺層特征均用的思想。
這里給一篇螞蟻金服比賽的文章吧,大家可以根據這個思路去參考優化:https://blog.csdn.net/u014732537/article/details/81038260
3 優化手段
當然,上面的方式是讓大家用最快的速度去完成一個demo或者說baseline,然后我們需要一系列的手段進行優化,在這里也給大家介紹一些有用的方案。
如果你的場景里需要一些英文,可以加入一些英文文本去finetuning,開放域的。
針對問答場景,由于用戶的問題都有明顯意圖,因此做一些詞權重、attention的操作有利于效果提升,包括提槽,當然在淺層模型的情況下,詞的歸一化也有好處。
通過傳統的搜索,用ES召回之類而方式,可以召回很多文本接近但是語義遙遠的case,通過人工標注的樣本對效果的提升很有好處。
同樣是hard case挖掘,用自己的語義模型做召回,召回在閾值附近的case,做一下人工的復核,這樣做樣本也對效果提升有好處,這其實用的是主動學習的思想。
4 小結
做完搜索,后來又開始做向量表征和召回,感覺就很奇妙,能夠理解傳統搜索和相對新潮的向量表征召回之間的關系,這兩者之間的關系還是挺微妙地,互相借鑒的過程中能夠產生一些火花,例如向量檢索之前可以召回一些相似的、標準的query然后來檢索,這樣能大幅提升準確率,也一定程度降低了對模型深度的要求。(隱約感覺是時候寫一篇有關模型和規則特征之間關系的文章了?)
責任編輯:xj
原文標題:任務方案思考:句子相似度和匹配
文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
-
語義
+關注
關注
0文章
21瀏覽量
8658 -
自然語言處理
+關注
關注
1文章
612瀏覽量
13504
原文標題:任務方案思考:句子相似度和匹配
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論