系統學習NLP(十七)--文字相似度
轉自:https://blog.csdn.net/qq_28031525/article/details/79596376 看原文吧,這裡公式改不過來,爛
在自然語言處理(Natural Language Processing, NLP)中,經常會涉及到如何度量兩個文字的相似度問題。在諸如對話系統(Dialog system)和資訊檢索(Information retrieval)等的問題中,如何度量句子或者短語之間的相似度尤為重要。為方便對知識的梳理,寫下這篇部落格對部分傳統方法、詞向量、深度學習方法進行總結,遺漏之處還請大家補充。
度量文字相似度包括如下三種方法:一是基於關鍵詞匹配的傳統方法,如N-gram相似度;二是將文字對映到向量空間,再利用餘弦相似度等方法;三是深度學習的方法,如基於使用者點選資料的深度學習語義匹配模型DSSM,基於卷積神經網路的ConvNet,以及目前state-of-art的Siamese LSTM等方法。
隨著深度學習的發展,文字相似度的各種方法已經逐漸不再是基於關鍵詞匹配的傳統方法,而轉向深度學習,目前結合向量表示的深度學習使用較多。
1 基於關鍵詞匹配
1.1 N-gram 相似度
基於N-Gram模型定義的句子(字串)相似度是一種模糊匹配方式,通過兩個長得很像的句子間的“差異”來衡量相似度。
N-Gram相似度的計算是指按長度N切分原句得到詞段,也就是原句中所有長度為N的子字串。對於兩個句子S和T,則可以從共有子串的數量上去定義兩個句子的相似度。
1.2 Jaccard 相似度
Jaccard相似度的計算相對簡單,原理也容易理解。就是計算兩個句子之間詞集合的交集和並集的比值。該值越大,表示兩個句子越相似,在涉及大規模並行運算的時候,該方法在效率上有一定的優勢,公式如下:
2 基於向量空間
關於如何表達詞意目前有三種方法,第一種的代表就是WordNet,它提供了一種詞的分類資源但是缺少了詞之間的細微區別,同時它也很難計算詞之間的相似度;第二種就是Discrete representation,如One-hot representation,它的向量維度和詞典的長度相同,因此向量維度可能十分高,同時由於向量之間本身正交,無法計算詞之間的相似度;第三種就是Distributed representation,基本想法就是將每個詞對映為一個固定長度的短向量(相對於one-hot representation而言),所有這些詞構成一個詞向量空間,每一個向量視為空間中的一個點,在這個空間引入“距離”,就可以根據詞之間的距離來判斷它們之間的相似性,代表方法如word2vec, LDA等。
2.1 Word2vec
早在2003年Bengio等人在《A neural probabilistic language model》中提出的神經網路語言模型(NNLM)就用到了重要的工具-詞向量,只是在這個模型中,目標是生成語言模型,詞向量只是一個副產品。
Mikolov et al. (2013)提出的word2vec核心思想是認為詞的意思可以從它頻繁出現的上下文資訊中體現(A word’s meaning is given by the words that frequently appear close-by)。
Word2Vec又可分為兩種結構,一種是CBOW,利用視窗內的上下文預測中心詞;另一種是Skip-gram,利用中心詞預測視窗內的上下文。
以Skip-gram為例,其結構如下:
目標函式(Object function)
下面是Skip-gram的整體框架圖,其中W為V*N維矩陣,W’為N*V維矩陣,這兩個矩陣都有V個向量,表示詞表中的每個詞都有2個向量,一個是作為中心詞的向量,一個是作為上下文時的向量,這兩個向量都是模型中的引數,最終的詞向量可以將這兩個向量拼接或者直接相加。
當然這裡對Word2Vec的介紹十分粗略,限於篇幅有限,很多細節和trick等無法展現,以後單獨寫一篇介紹word2vec的部落格。
2.2 TF-IDF
TF-IDF的核心思想是:在一篇文章中,某個詞語的重要性與該詞語在這篇文章中出現的次數成正相關,同時與整個語料庫中出現該詞語的文章數成負相關.
TF(term frequency):詞頻,某一個給定的詞語在該檔案中出現的頻率,表示一個詞語與該文章的相關性。這個數字是對詞數(term count)的歸一化,以防止它偏向長的檔案。
IDF(inverse document frequency):逆向檔案詞頻,表示一個詞語出現的普遍程度。某一特定詞語的idf,可以由總檔案數目除以包含該詞語之檔案的數目,再將得到的商取以10為底的對數得到。
一篇文章中某個詞語的重要程度,可以標記為詞頻和逆向檔案詞頻的乘積,
通過計算出文件中每個詞的TF-IDF值,然後結合相似度計算方法(一般採用餘弦相似度)就可以計算兩個文件的相似度。採用TF-IDF的前提是“文章的詞語重要性與詞語在文章中出現的位置不相關”。
2.3 LSA
//TODO
2.4 相似度計算
相似度就是比較兩個事物的相似性。一般通過計算事物的特徵之間的距離,如果距離小,那麼相似度大;如果距離大,那麼相似度小。
問題定義:有兩個物件X、Y,都包括N維特徵,X=(x1,x2,x3,..,xn),Y=(y1,y2,y3,..,yn)X=(x1,x2,x3,..,xn),Y=(y1,y2,y3,..,yn),計算X和Y的相似性。常用的方法如下:
2.4.1 歐式距離
歐氏距離是最常用的距離計算公式,衡量的是多維空間中各個點之間的絕對距離,當資料很稠密並且連續時,這是一種很好的計算方式。
因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,如在KNN中需要對特徵進行歸一化。
2.4.2 曼哈頓距離
曼哈頓距離也稱為城市街區距離(City Block distance)。
2.4.3 餘弦相似度
餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加註重兩個向量在方向上的差異,而非距離或長度上。
2.4.4 其他
其他的相似度計算方法包括皮爾森相關係數、一般化的閔可夫斯基距離(當p=1時為曼哈頓距離,當p=2時為歐式距離)、漢明距離等。
3 基於深度學習
3.1 深度學習
隨著深度學習在影象和語音識別中取得不錯的進展,近些年深度學習也開始應用於自然語言處理的不同應用中。
語義相似性匹配問題已經逐漸從人工設計特徵轉向分散式表達和神經網路結構相結合的方式。(Recent work has moved away from hand crafted features and towards modeling with distributed representations and neural network architectures)
3.2 DSSM
DSSM是一種深度學習語義匹配模型,在檢索場景下,利用使用者的點選資料來訓練語義層次的匹配(The proposed deep structured semantic models are discriminatively trained by maximizing the conditional likelihood of the clicked documents given a query using the clickthrough data)。
DSSM利用點選率來代替相關性,點選資料中包含大量的使用者問句和對應的點選文件,這些點選資料將使用者的問題和匹配的文件連線起來。
下圖就是利用DNN的DSSM結構。DNN的輸入是使用者問句和對應文件的高維未歸一化向量(如圖中的500K維),DNN的輸出是一個低維的語義特徵空間向量(如圖中的128維)。
上圖中的Multilayer non-linear projection採用了非線性的多層神經網路,利用tanhtanh表示DNN輸出層問句和文件的低維語義向量,然後通過softmax得到條件概率分佈。
Word hashing
原始的問句或者文件是一個高維的向量,如向量的維度可能是詞表的大小,當輸入這些高維度的向量時神經網路可能無法訓練。為了使得神經網路更好的訓練,論文提出了減少DNN輸入層向量維度的Word hashing方法,也即上圖中的word hashing層。
word hashing是一種基於字元的n-gram方法。如對good一詞,首先新增開始和結尾的標記得到#good#,然後將該詞分解為字元n-grams(如採用trigram: #go,goo,oog,od#),最後這個詞就會被這些n-grams向量表示。
一種可能存在的問題是認為不同詞的詞向量衝突(collision)。但是經過作者的統計,如在500k維的one-hot編碼基礎上,採用字元級trigram時,向量維度可以降到30k維,且衝突率僅為0.0044%。
DSSM的訓練中,神經網路層的引數ww是softmax函式的平滑因子,是訓練中的一個經驗值。在實際訓練中,對於每一個問句共有5個文件對應,其中一個是點選文件,其餘4個是隨機選擇的非點選文件。
文件的相關性採用人工標註,共分為5個分數(0-4),其中4分表示最相關,0分表示最不相關。
DSSM的優點在於1.直接利用了使用者的點選資料;2. 得到的結果可以直接排序;但是缺點在於沒有利用上下文資訊。
DSSM的擴充套件還包括CDSSM、DSSM-LSTM等,其中CDSSM在一定程度上彌補了上下文缺失的問題,結構上將DNN替換成CNN。
DSSM-LSTM中使用LSTM記錄上下文。
3.3 ConvNet
ConvNet通過精心設計卷積神經網路,結合不同規格的卷積神經網路的差異性度量句子的相似度。(Proposing an elaborate convolutional network variant which infers sentences similarity by integrating various difference across many convolutions at various scale)
在論文《Multi-Perspective Sentence Similarity Modeling with Convolutional Neural Networks》中,採用“Siamese”(孿生)CNN結構,分別對兩個句子建模,然後利用一個句子相似度測量層計算句子相似度,最後通過一個全連線層輸出softmax相似度得分。整體的網路結構如下所示:
可以看到,一個句子首先被轉化為嵌入矩陣(embedding matrix),然後輸入卷積-池化層(論文提出使用2種卷積方式和3種池化操作,也即論文題目“多視角”的由來)得到處理後的句子向量,為更好計算句子之間的相似度,分別對向量不同的輸出結果計算其相似性,最終將相似度向量輸入全連線層得到相似性分數,與標籤值相比較。
1.卷積層
論文提出兩種卷積方式,一種是holistic filter,如上圖左上角BlackABlackA比較。
5.全連線層
基於句子的相似度計算之後,得到相應的相似度向量;然後這組向量之後連線一個全連線層,最後softmax對應輸出,如果是計算相似度度量值,可以用softmax輸出類別概率。
模型引數:
1. ws∈[1,3]ws∈[1,3]為何只採用max-pooling和min-pooling,而不採用mean-pooling等問題。
3.4 Skip-thoughts Vectors
Skip-thoughts的核心思想:將Word2vec中的skip-gram方法從詞的層面擴充套件到句子的層面,利用seq2seq模型預測輸入語句的上下句。(Extending the skip-gram approach of word2vec from the word to sentence.This model feeds each sentences into an RNN encoder-decoder(with GRU activations)which attempts to reconstructs the immediately preceding the following sentences)
論文提到,在之前的各類監督方法中,模型通過確定的標籤作為優化目標更新引數雖然能取得不錯的效果,但是隻能適用於不同的任務。
模型的結構如下:
模型在一個連續的文字語料(小說)上進行訓練,通過Encoder端將詞轉化為句子向量,然後在Decoder端結合Encoder端的句子向量生成上下文語句。
Decoder端和Encoder端都採用了GRU,因為GRU不僅在序列模型任務上和LSTM表現一樣好,而且在概念理解和計算上都要比LSTM簡單。
Decoder端是一個基於Encoder端輸出hihi,優化的目標函式是上下句的對數似然之和,整個訓練集上的目標函式就是對所有的句子組加和。
對於這樣一個模型,最大的問題在於如何把有限的詞擴充套件到任意的詞或句。論文中採用的方法是學習一種對映,將一個模型中的詞表示對映到另外一個模型中。具體的操作是把CBOW中預訓練得到的詞向量對映到Encoder端的詞空間。最終將詞彙量擴充套件到1百萬詞。
訓練好的Skip-thoughs模型,會把Encoder端作為特徵提取器,對所有的句子提取Skip-thoughs向量,得到的這些向量表示可以用在不同的任務中,如語義相似度計算。
3.5 Tree-LSTM
Tree -LSTM的核心思想:將對語序敏感的標準LSTM序列推廣為樹狀結構的網路拓撲圖。(Generalizing the order-sensitive chain-structure of standard LSTMs to tree-structure network topologies)
標準的LSTM僅僅考慮了句子的序列資訊,但是在自然語言中句法結構能夠自然的將詞結合成短語或句子,因此作者在論文中提出了兩種利用句法結構資訊的LSTM擴充套件結構:The Child-Sum Tree-LSTM和N-arr Tree-LSTM。
和標準的LSTM結構一樣,每個Tree-LSTM(記為jj都有獨立的引數矩陣,這使得N-ary Tree LSTM比Child-Sum Tree-LSTM能更好的從其子節點學習到一些細節。
Constituency Tree-LSTM可以看做是N-ary Tree-LSTM在N為2的特例。
論文中提到基於Tree-LSTM結構的兩種模型,一種是Tree-LSTM Classification,另一種是Semantic Relatedness of Sentence Pairs。
(1)Tree-LSTM Classification
對樹中結點jj表示第k個句子對。
對於Dependency Tree-LSTM模型,最大的問題在於訓練資料的收集十分困難並且句法分析結果也不是在所有語言中都有。
3.6 Siamese LSTM/Manhattan LSTM/MaLSTM
Siamese LSTM之前簡要介紹一下Siamese Network。Siamese Network用來度量資料之間的相似性,兩組資料(文字,影象等)同時輸入到一個神經網路中,並經由這個神經網路轉化為N*1維的向量,此後會通過一個數值函式(如餘弦相似度)計算這兩個向量的距離,通過得到的距離來度量原始輸入資料的相似性。
在標準的Siamese Network中,兩側的神經網路需要使用相同的網路結構和引數;同時在進行梯度更新前,需要先對兩側的梯度平均;兩個輸出向量需要滿足相似或者不相似的關係。
Siamese LSTM
The model is applied to access for semantic similarity between sentences,a siamese adaptation of the LSTM network for labeled data comparised of pairs of variable-length sequences.
Siamese LSTM結構大體與Siamese Network相似,其網路結構如下所示:
模型的輸入:首先對句子分詞,然後將詞轉化為預先訓練好的Word2vec向量,並按序列輸入網路。(按論文的意思,模型的Word2vec是利用外部資料語料訓練的,並且詞向量維度為300維)
模型的輸出:輸入句子對的相似度分數。由於模型採用e−xe−x分別是兩個LSTM模型的最後隱藏層狀態,得到的向量作為特徵空間中句子的embedding,隨後在特徵空間中計算向量相似度,以此來推斷句子對的語義相似度。根據作者的意思,這兩個LSTM可以是共享引數的,也可以是不共享引數的。
模型的損失函式採用MSE(均方損失函式),優化演算法採用Adelta,為防止訓練中梯度爆炸,採用gradient clipping。
關於該模型有兩點值得注意:
1.LSTM,在Siamese Network中採用孿生LSTM,是因為LSTM能夠解決RNN的長期依賴問題,通過使用記憶單元(memory cell),LSTM能夠儲存更長輸入序列的資訊。當然對於特別長的句子而言,標準的LSTM能力也是有限的,對於長度超過30的長句子,通過模型得到的最終隱藏層狀態,佔據比重較大的還是後面的詞,前面的詞基本消失,因此需要Attention。
2. Manhattan Similarity。在度量相似性的時候,採用了曼哈頓距離而不是歐式距離,根據論文和部落格 的觀點,一方面用Word2vec訓練出來的詞,存在大量歐式距離相等的情況,如果用L2範數去衡量,存在語義丟失的情況,而cosine similarity適合度量向量維度特別大的情況,因此採用Manhattan距離最合適;另一方面,採用L2範數會存在梯度消失的問題,在訓練的早期,L2範數會錯誤的認為兩個語義不相關的句子相似因為採用歐式距離時的梯度消失問題(This is because during early stages of training,a L2-based model is unable to correct errors where it erroneously believes semantically different sentence to be nearly identical due to vanishing gradients of the Euclidean distance)。
3.7 Others
//TODO
4 參考文獻
- NLP點滴——文字相似度
- 常用的相似度計算方法原理及實現
- 基於Simase_LSTM的計算中文句子相似度經驗總結與分享
- 原創:Siamese LSTM解決句子相似度以及擴充套件(理論篇)
- 論文《Leaning Deep Structured Semantic Models for Web Search using Clickthrough Data》
- 論文《Siamese Recurrent Architecture for learning Sentence Similarity》
- CNN在句子相似性建模的應用–模型介紹篇
- 論文《Multi-Perspective Sentence Similarity Modeling with Convolutional Neural Networks》
- 卷積神經網路(CNN)在句子建模上的應用
- 《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》閱讀筆記
- 論文《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》
- 基於TreeLSTM的情感分析
- 論文《Skip-Thought Vectors》
- cips2016+學習筆記︱簡述常見的語言表示模型(詞嵌入、句表示、篇章表示)
相關文章
- 系統學習NLP(二十)--文字聚類聚類
- 系統學習NLP(十九)--文字分類之FastText文字分類AST
- 系統學習NLP(十二)--文字表示綜述
- NLP segment-05-文字相似度計算 similarity java 開源實現MILAJava
- 系統學習NLP(十六)--DSSMSSM
- 系統學習NLP(二十一)--SWEM
- 大規模文字相似度計算
- 系統學習NLP(十五)--seq2seq
- 推薦系統01–餘弦相似度
- python酒店相似度推薦系統Python
- 文字相似度計算之餘弦定理
- 中文文字相似度計算工具集
- 文字相似度 HanPL漢語言處理
- 系統學習NLP(十四)--句子向量與篇章向量
- 【NLP學習筆記】(三)gensim使用之相似性查詢(SimilarityQueries)筆記MILA
- 基於HBase構建千億級文字資料相似度計算與快速去重系統
- NLP 中文形近字相似度演算法開源實現演算法
- java實現兩個文字相似度 simHash 實現Java
- 基於tfidf 以及 lsi 的文字相似度分析
- NLP學習1
- 推薦系統技術之文字相似性計算(二)
- 推薦系統技術之文字相似性計算(三)
- 推薦系統技術之文字相似性計算(一)
- 百度NLP:強化學習之原理與應用強化學習
- 系統學習NLP(十)--詞性標註演算法綜述詞性標註演算法
- 海量資料相似度計算之simhash短文字查詢
- 學習Linux系統的態度及技巧Linux
- NLP與深度學習(一)NLP任務流程深度學習
- Python學習之旅(十七)Python
- java中利用hanlp比較兩個文字相似度的步驟JavaHanLP
- 【NLP】文字情感分析
- 文章相似度檢測,相似度檢測工具,原創度檢測工具
- elasticsearch演算法之推薦系統的相似度演算法(一)Elasticsearch演算法
- NLP系列學習:資料平滑
- NLP入門-學習路徑
- 文章相似度檢測工具哪個好?怎麼讓文章相似度變低?
- NLP教程(7) - 問答系統
- 基於文字相似度演算法,分析 Vue 是抄出來的框架嗎?演算法Vue框架