余弦相似度計算公式:python代碼找出相似文章

時間:18-07-10 0:37 分類:SEO技術 作者:鄭州SEO 評論:1人參與 瀏覽: 4,204 次

余弦相似度計算公式:python代碼找出相似文章

[隱藏]

TF-IDF算法可以自動提取關鍵詞。除了找到關鍵詞,怎么找到與原文章相似的其他文章。比如,"

為了找出相似的文章,需要用到"余弦相似度"(cosine similiarity)。什么是"余弦相似度" ?

余弦相似度百度百科:余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。余弦相似度將向量根據坐標值,繪制到向量空間中,如最常見的二維空間。百科TA說:解讀詞條背后的知識

為了簡單起見,我們先從句子著手。

句子A:我喜歡看電視,不喜歡看電影。
句子B:我不喜歡看電視,也不喜歡看電影。

請問怎樣才能計算上面兩句話的相似程度?

基本思路是:如果這兩句話的用詞越相似,它們的內容就應該越相似。因此,可以從詞頻入手,計算它們的相似程度。

1.第一步,分詞

句子A:我/喜歡/看/電視,不/喜歡/看/電影。
句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。

2.第二步,列出所有詞的并集

我,喜歡,看,電視,電影,不,也。

3.第三步,計算詞頻向量

計算詞頻:
句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。
句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1。
寫出詞頻向量:
句子A:[1, 2, 2, 1, 1, 1, 0]
句子B:[1, 2, 2, 1, 1, 2, 1]

4.第四步,計算余弦值

計算這兩個向量的相似程度。余弦值越大,證明夾角越小,兩個向量越相似。

我們可以把它們想象成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成一個夾角,如果夾角為0度,意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

夾角θ

以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。余弦定理告訴我們,可以用下面的公式求得:

余弦定理cosθ計算公式

向量cosθ

假定a向量是[x1, y1],b向量是[x2, y2],那么可以將余弦定理改寫成下面的形式:

余弦定理cosθ計算公式

余弦定理cosθ示意圖

數學家已經證明,余弦的這種計算方法對n維向量也成立。假定A和B是兩個n維向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,則A與B的夾角θ的余弦等于:

n維向量計算cosθ

使用這個公式,我們就可以得到,句子A與句子B的夾角的余弦。

句子A與句子B的夾角的余弦
余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"余弦相似性"。所以,上面的句子A和句子B是很相似的,事實上它們的夾角大約為20.3度。
由此,我們就得到了"找出相似文章"的一種算法:

(1)使用TF-IDF算法,找出兩篇文章的關鍵詞;
(2)每篇文章各取出若干個關鍵詞(比如20個),合并成一個集合,計算每篇文章對于這個集合中的詞的詞頻(為了避免文章長度的差異,可以使用相對詞頻);
(3)生成兩篇文章各自的詞頻向量;
(4)計算兩個向量的余弦相似度,值越大就表示越相似。

"余弦相似度"是一種非常有用的算法,只要是計算兩個向量的相似程度,都可以采用它。

5.第五步,python余弦相似度計算

import jieba
import jieba.analyse
 
def words2vec(words1=None, words2=None):
    v1 = []
    v2 = []
    tag1 = jieba.analyse.extract_tags(words1, withWeight=True)
    tag2 = jieba.analyse.extract_tags(words2, withWeight=True)
    tag_dict1 = {i[0]: i[1] for i in tag1}
    tag_dict2 = {i[0]: i[1] for i in tag2}
    merged_tag = set(tag_dict1.keys()) | set(tag_dict2.keys())
    for i in merged_tag:
        if i in tag_dict1:
            v1.append(tag_dict1[i])
        else:
            v1.append(0)
        if i in tag_dict2:
            v2.append(tag_dict2[i])
        else:
            v2.append(0)
    return v1, v2
 
 
def cosine_similarity(vector1, vector2):
    dot_product = 0.0
    normA = 0.0
    normB = 0.0
    for a, b in zip(vector1, vector2):
        dot_product += a * b
        normA += a ** 2
        normB += b ** 2
    if normA == 0.0 or normB == 0.0:
        return 0
    else:
        return round(dot_product / ((normA**0.5)*(normB**0.5)) * 100, 2)
     
def cosine(str1, str2):
    vec1, vec2 = words2vec(str1, str2)
    return cosine_similarity(vec1, vec2)
 
print(cosine('宋建sem', '宋建sem'))

6.第六步,文章相似度檢測工具

seo應用:文章原創度檢測工具

文章相似度在線檢測工具

下一次,我想談談如何在詞頻統計的基礎上,自動生成一篇文章的摘要。

ad

本文地址:http://www.portail-web.net/seo/cosine.html

本文標題:余弦相似度計算公式:python代碼找出相似文章

余弦相似度計算公式:python代碼找出相似文章:目前有 1 條留言

發表評論

必填

選填

選填

  1. 汽車違章查詢系統

    2019-12-21 上午 11:57 [回復]
SEO導權
鄭州seo優化網站排名
Totop 亚洲无码性爱