基於深度學習問答系統中的語義相似度計算

2021-08-19 15:18:30 字數 2648 閱讀 9890

問答系統,簡稱qa,是自然語言處理領域的一類經典問題。

問答系統的模式基本上分為兩類:

1. 由輸入的問題在n個候選答案中選取乙個最佳的答案。

2. 由輸入的問題在已有的問題中選取乙個語義最相似的問題,將該已有問題的答案作為最終的答案返回。

第一種問答系統類似與京東客服的自動回答系統,很多使用過京東客服或是**客服的同學會知道,當你問關商品或是關於售後以及物流的一些問題時,系統會自動回答你的問題,但是回答的這些資訊都是提前放在答案庫里的,所以會在答案庫里的候選答案中選乙個跟你的提問最匹配的答案作為回答。

語義相似度,如同字面意思一樣,就是形容兩句話的語義是否相似,是不是表達著同樣的意思。

在上面所介紹的兩類分類問題中,都需要用到語義相似度的計算。第一類需要計算問題與n個候選答案之間的語義相似度,第二類需要計算問題與n個候選問題之間的語義相似度。

目前有許多方法可以用來計算語義相似度,例如余弦相似度(cosine similarity)、歐幾里得距離(euclidean distance)、指數(exponential)、曼哈頓距離(manhattan distance)。今天我們要介紹的也是目前最常用的一種語義相似度計算方法:余弦相似度。

在使用余弦相似度計算兩條文字的語義距離時,我們還有一些前序工作需要進行,就是提取文字的語義特徵向量。可以使用lstm(long short-term memory)、gru(gate recurrent units)等迴圈神經網路來對文字語義特徵進行提取,也可以使用doc2vec等演算法來進行計算。

余弦相似度又稱為余弦相似性,是通過計算兩個向量夾角的余弦值來評估他們的相似度,在我們熟悉的二維空間中,余弦相似度的計算方法如下:

設a,b的座標分別為:

推廣到多維空間中有:

在之前所述的兩種問答系統中,n個候選答案(問題)之中包括乙個正樣本(the ground truth/correct answer/correct question)與多個負樣本(wrong answer/wrong question)。然後依次計算輸入問題的語義向量與候選答案(問題)之間的余弦相似度。

通過計算得到與正樣本的相似度為:

與負樣本的相似度為:

接下來需要設定乙個邊界值(margin),來對計算出的正負樣本的語義相似度進行評判。

當:說明正負樣本的相似度之差小於邊界值,或是系統錯誤的計算出問題與負樣本的相似度高於正樣本。

當:

則說明系統計算出問題與正樣本的相似度高於負樣本,從而正確的分辨出了正樣本,則不需要對網路引數進行優化和更新。

最後使用hings loss作為語義相似度模型的代價函式,公式如下:

最後我們貼出使用tensorflow深度學習框架實現的語義相似度計算的部分**:

def getcosinesimilarity(q, a):

q1 = tf.sqrt(tf.reduce_sum(tf.multiply(q, q), 1))

a1 = tf.sqrt(tf.reduce_sum(tf.multiply(a, a), 1))

mul = tf.reduce_sum(tf.multiply(q, a), 1)

cossim = tf.div(mul, tf.multiply(q1, a1))

return cossim

def getloss(truecossim, falsecossim, margin):

zero = tf.fill(tf.shape(truecossim), 0.0)

tfmargin = tf.fill(tf.shape(truecossim), margin)

with tf.name_scope("loss"):

losses = tf.maximum(zero, tf.subtract(tfmargin, tf.subtract(truecossim, falsecossim)))

loss = tf.reduce_sum(losses)

return loss

self.truecossim = self.getcosinesimilarity(question2, trueanswer2)

self.falsecossim = self.getcosinesimilarity(question2, falseanswer2)

self.loss = self.getloss(self.truecossim, self.falsecossim, self.margin)

語義分割 基於openCV和深度學習(一)

語義分割 基於opencv和深度學習 一 semantic segmentation with opencv and deep learning 傳統的分割方法是將影象分割為若干部分 標準化切割 圖形切割 抓取切割 超畫素等 然而,演算法並沒有真正理解這些部分所代表的內容。另一方面,語義分割演算法試...

python中文問答系統 基於語料庫的問答系統

將乙個問題及其答案 假設只有乙個 作為lucene中的乙個文件來考慮。lucene支援文件的字段檢視 因此在構建文件時,請將問題設為可搜尋字段。一旦檢索到給定查詢問題的排名靠前的問題,請使用document類的get方法返回答案。框架 自己填寫 index indexwriterconfig iwc...

基於深度學習的NER

命名實體識別 ner 是在自然語言處理中的乙個經典問題,其應用也極為廣泛。比如從一句話中識別出人名 地名,從電商的搜尋中識別出產品的名字,識別藥物名稱等等。傳統的公認比較好的處理演算法是條件隨機場 crf 它是一種判別式概率模型,是隨機場的一種,常用於標註或分析序列資料,如自然語言文字或是生物序列。...