日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jaccard相似度_Jaccard与cosine文本相似度的异同

發布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文本相似度的异同的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。