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