知識庫(主要是標准的QA信息)匹配需求是對已經梳理出的大量標准QA對信息進行匹配,找出最符合用戶問題的QA對進行回復,拆分主要的處理流程主要為如下兩點:
- 標准QA信息入庫索引;
- 通過對用戶提出的問題進行處理,與索引庫中的所有Q進行相似度計算,根據需要返回得分最高的top k個;
- 基於返回的top k問題有平台根據業務需要選擇其中的某個問題的答案回復客服。
在引擎端處理的主要是前兩點,即根據需要對索引入庫的Q進行預處理,對用戶問題進行同樣的預處理,而后計算兩者之間的相似度,返回得分最高的前幾條。處理流程如下圖示:
檢索原理解析
索引檢索這塊使用了ES的morelikethis算法,morelikethis相似搜索,是通過tf-idf構建查詢語句進而查找與給定語句的相似文檔。生成morelikethis的相似查詢語句的流程如下圖示:
通俗講,morelikethis相似檢索不是傳統的通過傳入的文本檢索索引獲取信息,而是先通過類似傳統的檢索獲取指定相似檢索字段的所有數據,而后通過對這些數據進行篩選獲取排粉較高的一些特征詞,而后基於這些特征詞生成一個新的查詢語句,通過新的查詢語句獲取相關查詢數據。
更進一步可以理解為通過結果找結果。整個的查詢流程如下圖示:
上述流程得到morelikethis的檢索語句后,通過檢索既可以獲取結果,獲取結果后,我們在對這些結果進行下一步的相似計算。
相似計算原理
通過檢索我們獲取了跟用戶提交問題的相似的N個結果,相似計算流程是根據預處理階段得到的Q指紋編碼,通過與用戶問題的指紋編碼進行編輯距離計算,根據得分進行排序,最終返回最相似的top k。此階段可以看做是推薦系統中的CTR階段。
指紋編碼選擇使用simhash算法,simhash是一種局部敏感哈希算法,相對於傳統hash算法對文本的hash是讓整個分布更均勻,文本的微小變化就會引起hash值很大的變化;simhash的局部敏感對文本的微小變化感知不強,可以對相似的文本進行判斷。
Q1:出了保險如何理賠
Q2:出了保險如何理賠?
simhash計算結果=====
1010111111010100011001100001111101011110111111010100011001101111
1010111111010100011001100001111101011110111111010100011001101111
傳統hash計算結果=====
1092027993
-506870522
simhash 的計算流程如下:
- 文本預處理,一般包括分詞、去除停用詞等操作,獲得預處理后的term集合;
- 基於獲取的文本term集合,統計詞頻,去除超高詞頻(預設的閾值)詞,基於分詞的此行設置權重weight;
- 對每一個term進行hash轉換,得到64位的hash碼(0/1碼),而后對每一位上基於1/0值進行正負權重轉換,1位設置加weight、0位設置減weight;
- 針對文本的所有term的hash值,按照對應位置累加,得到一個64位的權重數組,然后將大於0的位置為1、小於等於0的位置為0,得到64位的0、1數組,作為該文本的新的hash值。
示例圖(備注:圖來自網絡)如下所示:
對入索引的所有QA對的Q經過上述指紋處理后都會獲得自己的指紋信息存儲到索引字段中,用戶新的問題經過預處理后可以得到自己的指紋,經過morelikethis的檢索獲取N條相似的信息,而后經過用戶問題的simhash值域檢索返回的N條信息進行漢明距離計算得到差值,選擇差值排序小的 k個結果作為返回,而后經過sigmoid函數將差值轉換為(0, 1)間的分值,將結果返回給業務方。
sigmoid歸一化處理流程說明
通過編輯距離計算出來的距離為int變量,大於等於0,無法與NLU計算的結果在同一個維度上進行比對,為了將兩者的結果都轉換為(0,1)值之間,我們引入了sigmoid函數將編輯距離歸一化處理。
Sigmoid函數可以將負無窮到正無窮的數值限制在0與1之間,為了進行計算,我們采用如下的形式:
函數繪圖顯示如下所示:
備注:圖采用Octae繪制,示例使用代碼
>> x=[-10:1:10];
>> F=1./(1+exp(-2.5*x));
>> plot(x,F)
>>
注意,在x=10時已經無限接近於1,結合前面介紹的漢明距離,我們對得出的漢明距離經轉換后帶入sigmoid函數中進行計算,轉換: d = 10/d d不等於0(此處的10選擇有待基於訓練語料確定)。而后計算此次計算的相似度得分。