DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
在NLP領域,語義相似度的計算一直是個難題:搜索場景下query和Doc的語義相似度、feeds場景下Doc和Doc的語義相似度、機器翻譯場景下A句子和B句子的語義相似度等等。本文通過介紹DSSM、CNN-DSSM、LSTM-DSSM等深度學習模型在計算語義相似度上的應用,希望給讀者帶來幫助。
1. 背景
以搜索引擎和搜索廣告為例,最重要的也最難解決的問題是語義相似度,這里主要體現在兩個方面:召回和排序。
在召回時,傳統的文本相似性如 BM25,無法有效發現語義類 query-Doc 結果對,如"從北京到上海的機票"與"攜程網"的相似性、"快遞軟件"與"菜鳥裹裹"的相似性。
在排序時,一些細微的語言變化往往帶來巨大的語義變化,如"小寶寶生病怎么辦"和"狗寶寶生病怎么辦"、"深度學習"和"學習深度"。
DSSM(Deep Structured Semantic Models)為計算語義相似度提供了一種思路。
本文的最后,筆者結合自身業務,對 DSSM 的使用場景做了一些總結,不是所有的業務都適合用 DSSM。
?
2. DSSM
DSSM [1](Deep Structured Semantic Models)的原理很簡單,通過搜索引擎里 Query 和 Title 的海量的點擊曝光日志,用 DNN 把 Query 和 Title 表達為低緯語義向量,并通過 cosine 距離來計算兩個語義向量的距離,最終訓練出語義相似度模型。該模型既可以用來預測兩個句子的語義相似度,又可以獲得某句子的低緯語義向量表達。
DSSM 從下往上可以分為三層結構:輸入層、表示層、匹配層
?
2.1 輸入層
輸入層做的事情是把句子映射到一個向量空間里并輸入到 DNN 中,這里英文和中文的處理方式有很大的不同。
(1)英文
英文的輸入層處理方式是通過word hashing。舉個例子,假設用 letter-trigams 來切分單詞(3 個字母為一組,#表示開始和結束符),boy 這個單詞會被切為 #-b-o, b-o-y, o-y-#
這樣做的好處有兩個:首先是壓縮空間,50 萬個詞的 one-hot 向量空間可以通過 letter-trigram 壓縮為一個 3 萬維的向量空間。其次是增強范化能力,三個字母的表達往往能代表英文中的前綴和后綴,而前綴后綴往往具有通用的語義。
這里之所以用 3 個字母的切分粒度,是綜合考慮了向量空間和單詞沖突:
以 50 萬個單詞的詞庫為例,2 個字母的切分粒度的單詞沖突為 1192(沖突的定義:至少有兩個單詞的 letter-bigram 向量完全相同),而 3 個字母的單詞沖突降為 22 效果很好,且轉化后的向量空間 3 萬維不是很大,綜合考慮選擇 3 個字母的切分粒度。
(2)中文
中文的輸入層處理方式與英文有很大不同,首先中文分詞是個讓所有 NLP 從業者頭疼的事情,即便業界號稱能做到 95%左右的分詞準確性,但分詞結果極為不可控,往往會在分詞階段引入誤差。所以這里我們不分詞,而是仿照英文的處理方式,對應到中文的最小粒度就是單字了。(曾經有人用偏旁部首切的,感興趣的朋友可以試試)
由于常用的單字為 1.5 萬左右,而常用的雙字大約到百萬級別了,所以這里出于向量空間的考慮,采用字向量(one-hot)作為輸入,向量空間約為 1.5 萬維。
?
2.2 表示層
DSSM 的表示層采用 BOW(Bag of words)的方式,相當于把字向量的位置信息拋棄了,整個句子里的詞都放在一個袋子里了,不分先后順序。當然這樣做會有問題,我們先為 CNN-DSSM 和 LSTM-DSSM 埋下一個伏筆。
緊接著是一個含有多個隱層的 DNN,如下圖所示:
用 Wi?表示第 i 層的權值矩陣,bi?表示第 i 層的 bias 項。則第一隱層向量 l1(300 維),第 i 個隱層向量 li(300 維),輸出向量 y(128 維)可以分別表示為:
用 tanh 作為隱層和輸出層的激活函數:
最終輸出一個 128 維的低緯語義向量。
?
2.3 匹配層
Query 和 Doc 的語義相似性可以用這兩個語義向量(128 維) 的 cosine 距離來表示:
通過softmax 函數可以把Query 與正樣本 Doc 的語義相似性轉化為一個后驗概率:
其中 r 為 softmax 的平滑因子,D 為 Query 下的正樣本,D-為 Query 下的負樣本(采取隨機負采樣),D 為 Query 下的整個樣本空間。
在訓練階段,通過極大似然估計,我們最小化損失函數:
殘差會在表示層的 DNN 中反向傳播,最終通過隨機梯度下降(SGD)使模型收斂,得到各網絡層的參數{Wi,bi}。
2.4 優缺點
優點:DSSM 用字向量作為輸入既可以減少切詞的依賴,又可以提高模型的范化能力,因為每個漢字所能表達的語義是可以復用的。另一方面,傳統的輸入層是用 Embedding 的方式(如 Word2Vec 的詞向量)或者主題模型的方式(如 LDA 的主題向量)來直接做詞的映射,再把各個詞的向量累加或者拼接起來,由于 Word2Vec 和 LDA 都是無監督的訓練,這樣會給整個模型引入誤差,DSSM 采用統一的有監督訓練,不需要在中間過程做無監督模型的映射,因此精準度會比較高。
缺點:上文提到 DSSM 采用詞袋模型(BOW),因此喪失了語序信息和上下文信息。另一方面,DSSM 采用弱監督、端到端的模型,預測結果不可控。
3. CNN-DSSM
針對 DSSM 詞袋模型丟失上下文信息的缺點,CLSM[2](convolutional latent semantic model)應運而生,又叫 CNN-DSSM。CNN-DSSM 與 DSSM 的區別主要在于輸入層和表示層。
3.1 輸入層
(1)英文
英文的處理方式,除了上文提到的 letter-trigram,CNN-DSSM 還在輸入層增加了word-trigram
如上圖所示,word-trigram其實就是一個包含了上下文信息的滑動窗口。舉個例子:把<s> online auto body ... <s>這句話提取出前三個詞<s> online auto,之后再分別對這三個詞進行letter-trigram映射到一個 3 萬維的向量空間里,然后把三個向量 concat 起來,最終映射到一個 9 萬維的向量空間里。
(2)中文
英文的處理方式(word-trigram letter-trigram)在中文中并不可取,因為英文中雖然用了 word-ngram 把樣本空間拉成了百萬級,但是經過 letter-trigram 又把向量空間降到可控級別,只有 3*30K(9 萬)。而中文如果用 word-trigram,那向量空間就是百萬級的了,顯然還是字向量(1.5 萬維)比較可控。
3.2 表示層
CNN-DSSM 的表示層由一個卷積神經網絡組成,如下圖所示:
(1)卷積層——Convolutional layer
卷積層的作用是提取滑動窗口下的上下文特征。以下圖為例,假設輸入層是一個 302*90000(302 行,9 萬列)的矩陣,代表 302 個字向量(query 的和 Doc 的長度一般小于 300,這里少了就補全,多了就截斷),每個字向量有 9 萬維。而卷積核是一個 3*90000 的權值矩陣,卷積核以步長為 1 向下移動,得到的 feature map 是一個 300*1 的矩陣,feature map 的計算公式是(輸入層維數 302-卷積核大小 3 步長 1)/步長 1=300。而這樣的卷積核有 300 個,所以形成了 300 個 300*1 的 feature map 矩陣。
(2)池化層——Max pooling layer
池化層的作用是為句子找到全局的上下文特征。池化層以 Max-over-time pooling 的方式,每個 feature map 都取最大值,得到一個 300 維的向量。Max-over-pooling 可以解決可變長度的句子輸入問題(因為不管 Feature Map 中有多少個值,只需要提取其中的最大值)。不過我們在上一步已經做了句子的定長處理(固定句子長度為 302),所以就沒有可變長度句子的問題。最終池化層的輸出為各個 Feature Map 的最大值,即一個 300*1 的向量。這里多提一句,之所以 Max pooling 層要保持固定的輸出維度,是因為下一層全鏈接層要求有固定的輸入層數,才能進行訓練。
(3)全連接層——Semantic layer
最后通過全連接層把一個 300 維的向量轉化為一個 128 維的低維語義向量。全連接層采用 tanh 函數:
3.3 匹配層
CNN-DSSM 的匹配層和 DSSM 的一樣,這里省略。
3.4 優缺點
優點:CNN-DSSM 通過卷積層提取了滑動窗口下的上下文信息,又通過池化層提取了全局的上下文信息,上下文信息得到較為有效的保留。
缺點:對于間隔較遠的上下文信息,難以有效保留。舉個例子,I grew up in France... I speak fluent French,顯然 France 和 French 是具有上下文依賴關系的,但是由于 CNN-DSSM 滑動窗口(卷積核)大小的限制,導致無法捕獲該上下文信息。
4. LSTM-DSSM
針對 CNN-DSSM 無法捕獲較遠距離上下文特征的缺點,有人提出了用LSTM-DSSM[3](Long-Short-Term Memory)來解決該問題。不過說 LSTM 之前,要先介紹它的"爸爸""RNN。
4.1 RNN
RNN(Recurrent Neural Networks)可以被看做是同一神經網絡的多次復制,每個神經網絡模塊會把消息傳遞給下一個。如果我們將這個循環展開:
假設輸入 xi 為一個 query 中幾個連續的詞,hi 為輸出。那么上一個神經元的輸出 h(t-1) 與當前細胞的輸入 Xt 拼接后經過 tanh 函數會輸出 ht,同時把 ht 傳遞給下一個細胞。
不幸的是,在這個間隔不斷增大時,RNN 會逐漸喪失學習到遠距離信息的能力。因為 RNN 隨著距離的加長,會導致梯度消失。簡單來說,由于求導的鏈式法則,直接導致梯度被表示為連乘的形式,以至梯度消失(幾個小于 1 的數相乘會逐漸趨向于 0)。
4.2 LSTM
LSTM[4]((Long-Short-Term Memory)是一種 RNN 特殊的類型,可以學習長期依賴信息。我們分別來介紹它最重要的幾個模塊:
(0)細胞狀態
細胞狀態這條線可以理解成是一條信息的傳送帶,只有一些少量的線性交互。在上面流動可以保持信息的不變性。
(1)遺忘門
遺忘門 [5]由 Gers 提出,它用來控制細胞狀態 cell 有哪些信息可以通過,繼續往下傳遞。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(遺忘門)產生一個從 0 到 1 的數值 ft,然后與細胞狀態 C(t-1) 相乘,最終決定有多少細胞狀態可以繼續往后傳遞。
(2)輸入門
輸入門決定要新增什么信息到細胞狀態,這里包含兩部分:一個 sigmoid 輸入門和一個 tanh 函數。sigmoid 決定輸入的信號控制,tanh 決定輸入什么內容。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(輸入門)產生一個從 0 到 1 的數值 it,同樣的信息經過 tanh 網絡做非線性變換得到結果 Ct,sigmoid 的結果和 tanh 的結果相乘,最終決定有哪些信息可以輸入到細胞狀態里。
(3)輸出門
輸出門決定從細胞狀態要輸出什么信息,這里也包含兩部分:一個 sigmoid 輸出門和一個 tanh 函數。sigmoid 決定輸出的信號控制,tanh 決定輸出什么內容。如下圖所示,上一層的輸出 h(t-1) concat 上本層的輸入 xt,經過一個 sigmoid 網絡(輸出門)產生一個從 0 到 1 的數值 Ot,細胞狀態 Ct 經過 tanh 網絡做非線性變換,得到結果再與 sigmoid 的結果 Ot 相乘,最終決定有哪些信息可以輸出,輸出的結果 ht 會作為這個細胞的輸出,也會作為傳遞個下一個細胞。
4.2 LSTM-DSSM
LSTM-DSSM 其實用的是 LSTM 的一個變種——加入了peephole[6]的 LSTM。如下圖所示:
看起來有點復雜,我們換一個圖,讀者可以看的更清晰:
這里三條黑線就是所謂的 peephole,傳統的 LSTM 中遺忘門、輸入門和輸出門只用了 h(t-1) 和 xt 來控制門縫的大小,peephole 的意思是說不但要考慮 h(t-1) 和 xt,也要考慮 Ct-1 和 Ct,其中遺忘門和輸入門考慮了 Ct-1,而輸出門考慮了 Ct。總體來說需要考慮的信息更豐富了。
好了,來看一個 LSTM-DSSM 整體的網絡結構:
紅色的部分可以清晰的看到殘差傳遞的方向。
5. 后記
介紹完了 DSSM 及其幾個變種,還要給讀者潑點冷水,DSSM 就一定適合所有的業務嗎?
這里列出 DSSM 的 2 個缺點以供參考:
1. DSSM 是端到端的模型,雖然省去了人工特征轉化、特征工程和特征組合,但端到端的模型有個問題就是效果不可控。對于一些要保證較高的準確率的場景,用有監督人工標注的 query 分類作為打底,再結合無監督的 word2vec、LDA 等進行語義特征的向量化,顯然比較可控(至少 query 分類的準確率可以達到 95%以上)。
2. DSSM 是弱監督模型,因為引擎的點擊曝光日志里 Query 和 Title 的語義信息比較弱。舉個例子,搜索引擎第一頁的信息往往都是 Query 的包含匹配,筆者統計過,完全的語義匹配只有不到 2%。這就意味著幾乎所有的標題里都包含用戶 Query 里的關鍵詞,而僅用點擊和曝光就能作為正負樣例的判斷?顯然不太靠譜,因為大部分的用戶進行點擊時越靠前的點擊的概率越大,而引擎的排序又是由 pCTR、CVR、CPC 等多種因素決定的。從這種非常弱的信號里提取出語義的相似性或者差別,那就需要有海量的訓練樣本。DSSM 論文中提到,實驗的訓練樣本超過 1 億。筆者和同事也親測過,用傳統 CTR 預估模型千萬級的樣本量來訓練,模型無法收斂。可是這樣海量的訓練樣本,恐怕只有搜索引擎才有吧?普通的搜索業務 query 有上千萬,可資源頂多只有幾百萬,像論文中說需要挑出點擊和曝光置信度比較高且資源熱度也比較高的作為訓練樣本,這樣就過濾了 80%的長尾 query 和 Title 結果對,所以也只有搜索引擎才有這樣的訓練語料了吧。另一方面,超過 1 億的訓練樣本作為輸入,用深度學習模型做訓練,需要大型的 GPU 集群,這個對于很多業務來說也是不具備的條件。
?
NLP 語義相似度計算 整理總結
更新中
更新時間:
2019-12-03?18:29:52
?
寫在前面:
本人是喜歡這個方向的學生一枚,寫文的目的意在記錄自己所學,梳理自己的思路,同時share給在這個方向上一起努力的同學。寫得不夠專業的地方望批評指正,歡迎感興趣的同學一起交流進步。
(參考文獻在第四部分,侵刪)
?
一、背景
二、基本概念
三、語義相似度計算方法
四、參考文獻
?
一、背景
在很多NLP任務中,都涉及到語義相似度的計算,例如:
在搜索場景下(對話系統、問答系統、推理等),query和Doc的語義相似度;
feeds場景下Doc和Doc的語義相似度;
在各種分類任務,翻譯場景下,都會涉及到語義相似度語義相似度的計算。
所以在學習的過程中,希望能夠更系統的梳理一下這方面的方法。
?
二、基本概念
1. TF
Term frequency即關鍵詞詞頻,是指一篇文章中關鍵詞出現的頻率,比如在一篇M個詞的文章中有N個該關鍵詞,則
為該關鍵詞在這篇文章中的詞頻。
2. IDF
Inverse document frequency指逆向文本頻率,是用于衡量關鍵詞權重的指數,由公式
計算而得,其中D為文章總數,Dw為關鍵詞出現過的文章數。
3. 向量空間模型
向量空間模型簡稱?VSM,是?VectorSpace Model?的縮寫。在此模型中,文本被看作是由一系列相互獨立的詞語組成的,若文檔?D?中包含詞語?t1,t2,…,tN,則文檔表示為D(t1,t2,…,tN)。由于文檔中詞語對文檔的重要程度不同,并且詞語的重要程度對文本相似度的計算有很大的影響,因而可對文檔中的每個詞語賦以一個權值?w,以表示該詞的權重,其表示如下:D(t1,w1;t2,w2;…,tN,wN),可簡記為?D(w1,w2,…,wN),此時的?wk?即為詞語?tk的權重,1≤k≤N。關于權重的設置,我們可以考慮的方面:詞語在文本中的出現頻率(tf),詞語的文檔頻率(df,即含有該詞的文檔數量,log N/n。很多相似性計算方法都是基于向量空間模型的。
?
三、語義相似度計算方法
1. 余弦相似度(Cosine)
余弦相似性通過測量兩個向量的夾角的余弦值來度量它們之間的相似性。
兩個向量間的余弦值可以通過使用歐幾里得點積公式求出:
?
余弦相似性θ由點積和向量長度給出,如下所示(例如,向量A和向量B):
這里的分別代表向量A和B的各分量。
問題:表示方向上的差異,但對距離不敏感。
關心距離上的差異時,會對計算出的每個(相似度)值都減去一個它們的均值,稱為調整余弦相似度。
代碼:
?
2. 歐式距離
考慮的是點的空間距離,各對應元素做差取平方求和后開方。能體現數值的絕對差異。
?
代碼:
?
?
3. 曼哈頓距離(Manhattan Distance)
d(i,j)=|X1-X2|+|Y1-Y2|.
向量各坐標的絕對值做查后求和。
代碼:
?
4. 明可夫斯基距離(Minkowski distance)
明氏距離是歐氏距離的推廣,是對多個距離度量公式的概括性的表述。
- 當p==1,“明可夫斯基距離”變成“曼哈頓距離”
- 當p==2,“明可夫斯基距離”變成“歐幾里得距離”
- 當p==∞,“明可夫斯基距離”變成“切比雪夫距離”
代碼:
?
5. Jaccard 相似系數(Jaccard Coefficient)
? ?
Jaccard系數主要用于計算符號度量或布爾值度量的向量的相似性。即,無需比較差異大小,只關注是否相同。Jaccard系數只關心特征是否一致(共有特征的比例)。
然后利用公式進行計算:
代碼:
?
?
6.?皮爾森相關系數(Pearson Correlation Coefficient)
又稱為相關相似性。
或表示為:
這就是1中所提到的調整余弦相似度,向量內各對應元素減去均值求積后求和,記為結果1;各對應元素減去均值平方求和再求積,記為結果2;結果1比結果2。
針對線性相關情況,可用于比較因變量和自變量間相關性如何。
?
7. SimHash + 漢明距離(Hamming Distance)
Simhash:谷歌發明,根據文本轉為64位的字節,計算漢明距離判斷相似性。
漢明距離:在信息論中,兩個等長字符串的漢明距離是兩者間對應位置的不同字符的個數。換句話說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數。例如:
?“10110110”和“10011111”的漢明距離為3;? ??????? ? “abcde”和“adcaf”的漢明距離為3.
?
8.? ?斯皮爾曼(等級)相關系數(SRC :Spearman Rank Correlation)
和6上述類似,不同的是將對于樣本中的原始數據Xi,Yi轉換成等級數據xi,yi,即xi等級和yi等級。并非考慮原始數據值,而是按照一定方式(通常按照大小)對數據進行排名,取數據的不同排名結果代入公式。
實際上,可通過簡單的方式進行計算,n表示樣本容量,di表示兩向量X和Y內對應元素的等級的差值,等級di = xi - yi,則:
例如( 維基百科):
n = 10,di2的和為194,則可代入公式計算出結果為:-0.17575757...,Xi和Yi幾乎不相關。
9. BM25算法?
原理
BM25算法,通常用來作搜索相關性平分:對Query進行語素解析,生成語素qi;然后,對于每個搜索結果D,計算每個語素qi與D的相關性得分,最后,將qi相對于D的相關性得分進行加權求和,從而得到Query與D的相關性得分。
BM25算法的一般性公式如下:
定義Wi:
判斷一個詞與一個文檔的相關性的權重,方法有多種,較常用的是IDF。這里以IDF為例,公式如下:
其中,N為索引中的全部文檔數,n(qi)為包含了qi的文檔數。
根據IDF的定義可以看出,對于給定的文檔集合,包含了qi的文檔數越多,qi的權重則越低。也就是說,當很多文檔都包含了qi時,qi的區分度就不高,因此使用qi來判斷相關性時的重要度就較低。
我們再來看語素qi與文檔d的相關性得分R(qi,d)。
?
BM25中相關性得分的一般形式:
其中,k1,k2,b為調節因子,通常根據經驗設置,一般k1=2,b=0.75;fi為qi在d中的出現頻率,qfi為qi在Query中的出現頻率。dl為文檔d的長度,avgdl為所有文檔的平均長度。由于絕大部分情況下,qi在Query中只會出現一次,即qfi=1,因此公式可以簡化為:
從K的定義中可以看到,參數b的作用是調整文檔長度對相關性影響的大小。b越大,文檔長度的對相關性得分的影響越大,反之越小。而文檔的相對長度越長,K值將越大,則相關性得分會越小。這可以理解為,當文檔較長時,包含qi的機會越大,因此,同等fi的情況下,長文檔與qi的相關性應該比短文檔與qi的相關性弱。
綜上,BM25算法的相關性得分公式可總結為:
從BM25的公式可以看到,通過使用不同的語素分析方法、語素權重判定方法,以及語素與文檔的相關性判定方法,我們可以衍生出不同的搜索相關性得分計算方法,這就為我們設計算法提供了較大的靈活性。
?
代碼實現:
1 import math2 import jieba3 from utils import utils4 5 # 測試文本6 text = '''7 自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。8 它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。9 自然語言處理是一門融語言學、計算機科學、數學于一體的科學。 10 因此,這一領域的研究將涉及自然語言,即人們日常使用的語言, 11 所以它與語言學的研究有著密切的聯系,但又有重要的區別。 12 自然語言處理并不是一般地研究自然語言, 13 而在于研制能有效地實現自然語言通信的計算機系統, 14 特別是其中的軟件系統。因而它是計算機科學的一部分。 15 ''' 16 17 class BM25(object): 18 19 def __init__(self, docs): 20 self.D = len(docs) 21 self.avgdl = sum([len(doc)+0.0 for doc in docs]) / self.D 22 self.docs = docs 23 self.f = [] # 列表的每一個元素是一個dict,dict存儲著一個文檔中每個詞的出現次數 24 self.df = {} # 存儲每個詞及出現了該詞的文檔數量 25 self.idf = {} # 存儲每個詞的idf值 26 self.k1 = 1.5 27 self.b = 0.75 28 self.init() 29 30 def init(self): 31 for doc in self.docs: 32 tmp = {} 33 for word in doc: 34 tmp[word] = tmp.get(word, 0) + 1 # 存儲每個文檔中每個詞的出現次數 35 self.f.append(tmp) 36 for k in tmp.keys(): 37 self.df[k] = self.df.get(k, 0) + 1 38 for k, v in self.df.items(): 39 self.idf[k] = math.log(self.D-v+0.5)-math.log(v+0.5) 40 41 def sim(self, doc, index): 42 score = 0 43 for word in doc: 44 if word not in self.f[index]: 45 continue 46 d = len(self.docs[index]) 47 score += (self.idf[word]*self.f[index][word]*(self.k1+1) 48 / (self.f[index][word]+self.k1*(1-self.b+self.b*d 49 / self.avgdl))) 50 return score 51 52 def simall(self, doc): 53 scores = [] 54 for index in range(self.D): 55 score = self.sim(doc, index) 56 scores.append(score) 57 return scores 58 59 if __name__ == '__main__': 60 sents = utils.get_sentences(text) 61 doc = [] 62 for sent in sents: 63 words = list(jieba.cut(sent)) 64 words = utils.filter_stop(words) 65 doc.append(words) 66 print(doc) 67 s = BM25(doc) 68 print(s.f) 69 print(s.idf) 70 print(s.simall(['自然語言', '計算機科學', '領域', '人工智能', '領域']))?
?
分段再分詞結果:
[['自然語言', '計算機科學', '領域', '人工智能', '領域', '中', '一個', '方向'], ['研究', '人', '計算機', '之間', '自然語言', '通信', '理論', '方法'], ['自然語言', '一門', '融', '語言學', '計算機科學', '數學', '一體', '科學'], [], ['這一', '領域', '研究', '涉及', '自然語言'], ['日常', '語言'], ['語言學', '研究'], ['區別'], ['自然語言', '研究', '自然語言'], ['在于', '研制', '自然語言', '通信', '計算機系統'], ['特別', '軟件系統'], ['計算機科學', '一部分']]s.f
列表的每一個元素是一個dict,dict存儲著一個文檔中每個詞的出現次數
s.df
存儲每個詞及出現了該詞的文檔數量
s.idf
存儲每個詞的idf值
s.simall(['自然語言', '計算機科學', '領域', '人工智能', '領域'])
['自然語言', '計算機科學', '領域', '人工智能', '領域']與每一句的相似度
詳細代碼
?
TODO:?
Dice 系數法(DiceCoefficient)
最新的:百度報告會中的分享:RBF MM GMM? ?GMM核函數的應用場景?
在目錄中添加每個方法
BM25算法的優缺點
?
?
四、參考文獻
深度學習解決NLP問題:語義相似度計算
自然語言語義相似度計算方法
余弦相似度
常用的相似度計算方法原理及實現
文本相似度算法
文本相似度-bm25算法原理及實現
?
?
分類: Deep Learning, NLP總結
以上是生活随笔為你收集整理的DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研讨会 | “人工智能与行业知识图谱技术
- 下一篇: 深度学习准备「爆破」著名的欧拉方程