jaccard相似度_Jaccard与cosine文本相似度的异同
工作過程中,常常其他業務的同學問到:某兩個詞的相似度是多少?某兩個句子的相似度是多少?某兩個文檔之間的相似度是多少?在本文中,我們討論一下jaccard與cosine在文本相似度上的差異,以及他們適用的場景。在介紹二者的異同之前呢,我們首先介紹一下,jaccard相似度和cosine相似度的定義。
(想直接看結論的,請關注文末的加粗部分)
Jaccard相似度
Jaccard相似度的定義很簡單,兩個句子詞匯的交集size除以兩個句子詞匯的并集size。舉個例子來說:
- 句子1: AI is our friend and it has been friendly.
- 句子2: AI and humans have always been friendly.
為了計算Jaccard相似度,我們首先使用英文nlp中常用的技術Lemmatization,用詞根替換那些具有相同詞根的詞匯。在上面的例子中,friend和friendly具有相同的詞根,have和has具有相同的詞根。我們可以畫出兩個句子詞匯的交集與并集情況,如圖所示:
對于上面兩個句子,其Jaccard相似度為5/(5+3+2)=0.5,即兩個句子詞匯的交集5個詞匯,并集10個詞匯。
def get_jaccard_sim(str1, str2): a = set(str1.split()) b = set(str2.split())c = a.intersection(b)return float(len(c)) / (len(a) + len(b) - len(c))值得注意的是,句子1中包含了兩個friend,但這并不影響我們計算相似度,但這會影響cosine相似度。先讓我們回憶一下cosine相似度的定義,公式如下。
cosine相似度是通過計算兩個向量之間的夾角,來評價兩個向量的相似度。
既然cosine相似度是使用向量計算的,我們就要先將句子文本轉換為相應的向量。將句子轉換為向量的方式有很多,最簡單的一種就是使用bag of words計算的TF(term frequency)和TF-IDF(term frenquency-inverse document frequency)。哪一鐘轉換方法更好呢?實際上,兩個方法各有各的應用場景。當我們要大概估計文本相似度時,使用TF就可以了。當我們使用文本相似度進行檢索的類似場景時(如搜索引擎中的query relevence的計算),此時TF-IDF更好一些。
當然,我們也可以使用word2vec或者使用自定義的詞向量來講句子轉換成向量。這里簡單介紹一下tf-idf和word embedding的異同: - 1. tf/tf-idf為每一個詞匯計算得到一個數字,而word embedding將詞匯表示成向量 - 2. tf/tf-idf在文本分類的任務中表現更好一些,而word embedding的方法更適用于來判斷上下文的語義信息(這可能是由word embedding的計算方法決定的)。
對于如何計算cosine similarity,我們還是試用上面的例子:
- 句子1: AI is our friend and it has been friendly.
- 句子2: AI and humans have always been friendly.
計算cosine similarity的過程,分位以下幾個步驟:
第一步
使用bag of words的方式計算term frequency,下圖展示了word frequency的統計結果。
第二步
term frequency的問題在于,較長的句子里的詞匯term frequency會更高一些。為了解決這個問題,我們可以使用歸一化的方法(Normlization,如L2-norm)來去掉句子長度的影響。操作如下:首先對各個詞匯的frequency平方求和,然后再開方。如果使用L2-norm,那么句子1的值為3.3166,而句子2的值為2.6458。用每一個詞的term frquency除以這些norm的值,就可以得到如下結果:
第三步
上一步中,我們將句子向量的模歸一化為1,就可以受用點乘的方法計算得到cosine相似度: Cosine Similarity = (0.3020.378) + (0.6030.378) + (0.3020.378) + (0.3020.378) + (0.302*0.378) = 0.684
所以兩個句子的cosine相似度為0.684,而Jaccard相似度的結果是0.5。計算cosine相似度的python代碼如下:
from總結一下,Jaccard和cosine相似度的區別是什么呢?應該有以下幾點:
- Jaccard使用的是集合操作,句子的向量長度由兩個句子中unique的詞匯數目決定,而cosine相似度使用的向量大小由詞向量的維度決定。
- 上面的結論意味著什么呢?假設friend這個詞匯在句子1中重復了非常多次,cosine相似度會發生變化,而Jaccard相似度的值不會變。讓我們做個簡單的計算,若句子1中的friend一詞重復50次,cosine相似度會降為0.4,而Jaccard相似度保持0.5不變。
- 基于上述的結論,Jaccard相似度適用于什么場景呢?假設某個業務場景的文本包含了很多重復性的詞匯,而這些重復是否與我們想做的任務關系不大,那么在分析文本相似度時,使用Jaccard計算相似度即可,因為對于Jaccard相似度來說,重復不會產生影響;假設這種重復對我們想做的任務影響很大,那么就要使用cosine相似度。
最后,這里列舉了兩個具體的應用場景,供大家思考。僅僅對Jaccard和cosine相似度來說:
1. 在京東、天貓的商品搜索欄,使用什么相似度最好呢?
2. 對語音轉寫文本的相似度,哪個更好呢?
本文譯自: Overview of Text Similarity Metrics in Python,略有改動。
如果覺得文章對您有幫助,可以關注本人的微信公眾號:機器學習小知識
總結
以上是生活随笔為你收集整理的jaccard相似度_Jaccard与cosine文本相似度的异同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 反射获取属性名和值_阿里P8架
- 下一篇: python 类方法 静态方法_pyth