欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python各種相似度計算方法詳解

 更新時間:2023年07月28日 10:27:38   作者:小基基o_O  
這篇文章主要介紹了Python各種相似度計算方法詳解,在日常開發(fā)中有需要計算相似度的需求,那么今天我們就來看一下各種計算相似度的方法,對日常開發(fā)非常有幫助,需要的朋友可以參考下

Python相似度計算

1、標(biāo)簽匹配、加權(quán)求和

示例1:每一位的算法及權(quán)重都相同

import numpy as np
a = np.array([1, 1, 1, 0, 0])
b = np.array([0, 1, 1, 1, 0])
weights = np.array(range(1, 6))
# 與運算
c = a & b
print(c, np.average(c), np.average(c, weights=weights))
# 異同
c = a == b
print(c, np.average(c), np.average(c, weights=weights))

示例2:每一位的有各自的算法及權(quán)重

a = ['a', 'b', 125, 400, 0, 1, 'e', 'f']
b = ['c', 'b', 150, 100, 1, 1, {'d', 'e'}, {'g', 'h'}]
weights = [.2, .2, .1, .1, .1, .1, .1, .1]
scores = []
for i in range(8):
    if i in (0, 1):
        equality = 1 if a[i] == b[i] else -1  # 比較異同
        scores.append(weights[i] * equality)
    elif i in (2, 3):
        difference = 1-abs(a[i]-b[i])/(a[i]+b[i])  # 差異百分比
        scores.append(weights[i] * difference)
    elif i in (4, 5):
        and_operation = (a[i] * b[i])  # 與運算
        scores.append(weights[i] * and_operation)
    elif i in (6, 7):
        include = 1 if a[i] in b[i] else 0  # 包含關(guān)系
        scores.append(weights[i] * include)
print(scores, sum(scores))  # [-0.2, 0.2, 0.09, 0.04, 0.0, 0.1, 0.1, 0.0] 0.33

2、集合運算

def similarity(a, b):
    try:
        return len(a & b) / len(a | b)
    except ZeroDivisionError:
        return -1e-4
m = set('abcd')
n = set('bcde')
print(similarity(m, n))  # 0.6

3、編輯距離

動態(tài)規(guī)劃矩陣

import numpy as np, pandas as pd
def edit_distance(w1, w2):
    l1, l2 = len(w1) + 1, len(w2) + 1
    matrix = np.zeros(shape=(l1, l2), dtype=np.int8)
    for i in range(l1):
        matrix[i][0] = i
    for j in range(l2):
        matrix[0][j] = j
    for i in range(1, l1):
        for j in range(1, l2):
            delta = 0 if w1[i - 1] == w2[j - 1] else 1
            matrix[i][j] = min(matrix[i - 1][j - 1] + delta,
                               matrix[i - 1][j] + 1,
                               matrix[i][j - 1] + 1)
    print(pd.DataFrame(
        matrix, index=[''] + list(w1), columns=[''] + list(w2)))
    return matrix[-1][-1]
ed = edit_distance('abc', 'abbcc')
print('edit_distance:', ed)

編輯距離百分比

def edit_distance(w1, w2):
    l1, l2 = len(w1) + 1, len(w2) + 1
    matrix = [[0 for j in range(l2)] for i in range(l1)]
    for i in range(l1):
        matrix[i][0] = i
    for j in range(l2):
        matrix[0][j] = j
    for i in range(1, l1):
        for j in range(1, l2):
            delta = 0 if w1[i - 1] == w2[j - 1] else 1
            matrix[i][j] = min(matrix[i - 1][j - 1] + delta,
                               matrix[i - 1][j] + 1,
                               matrix[i][j - 1] + 1)
    return matrix[-1][-1] / (l1 / 2 + l2 / 2 - 1)
poem1 = '''《將進(jìn)酒》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見高堂明鏡悲白發(fā),朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進(jìn)酒,杯莫停。與君歌一曲,請君為我傾耳聽。
鐘鼓饌玉不足貴,但愿長醉不復(fù)醒。古來圣賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
poem2 = '''《惜樽空》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見床頭明鏡悲白發(fā),朝如青云暮成雪。
人生得意須盡歡,莫使金樽空對月。天生吾徒有俊才,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,與君哥一曲,請君為我傾。
鐘鼓玉帛豈足貴,但用長醉不復(fù)醒。古來賢圣皆死盡,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
print(edit_distance(poem1, poem2))  # 0.15158924205378974

允許字符轉(zhuǎn)置

from nltk import edit_distance
a, b = 'abcd', 'abdc'
print(edit_distance(a, b), edit_distance(a, b, transpositions=True))  # 2 1

4、歐式距離和余弦距離

from sklearn.metrics.pairwise import euclidean_distances, cosine_distances
vectors = [[0, 1], [1, 1], [1, 0]]  # 3個項鏈
print(euclidean_distances(vectors))  # 歐氏距離
print(cosine_distances(vectors))  # 余弦距離

如圖輸出2個矩陣,分別計算3個向量的每兩個向量之間的距離

5、余弦相似度

點擊此處查看TF-IDF文本相似度計算詳細(xì)解析

from sklearn.metrics.pairwise import cosine_similarity

6、TF-IDF文本相似度

"""
《長恨歌》——白居易
漢皇重色思傾國,御宇多年求不得。
楊家有女初長成,養(yǎng)在深閨人未識。
天生麗質(zhì)難自棄,一朝選在君王側(cè)。
回眸一笑百媚生,六宮粉黛無顏色。
春寒賜浴華清池,溫泉水滑洗凝脂。
侍兒扶起嬌無力,始是新承恩澤時。
云鬢花顏金步搖,芙蓉帳暖度春宵。
春宵苦短日高起,從此君王不早朝。
承歡侍宴無閑暇,春從春游夜專夜。
后宮佳麗三千人,三千寵愛在一身。
金屋妝成嬌侍夜,玉樓宴罷醉和春。
姊妹弟兄皆列土,可憐光彩生門戶。
遂令天下父母心,不重生男重生女。
驪宮高處入青云,仙樂風(fēng)飄處處聞。
緩歌慢舞凝絲竹,盡日君王看不足。
漁陽鼙鼓動地來,驚破霓裳羽衣曲。
九重城闕煙塵生,千乘萬騎西南行。
翠華搖搖行復(fù)止,西出都門百余里。
六軍不發(fā)無奈何,宛轉(zhuǎn)蛾眉馬前死。
花鈿委地?zé)o人收,翠翹金雀玉搔頭。
君王掩面救不得,回看血淚相和流。
黃埃散漫風(fēng)蕭索,云??M紆登劍閣。
峨嵋山下少人行,旌旗無光日色薄。
蜀江水碧蜀山青,圣主朝朝暮暮情。
行宮見月傷心色,夜雨聞鈴腸斷聲。
天旋地轉(zhuǎn)回龍馭,到此躊躇不能去。
馬嵬坡下泥土中,不見玉顏空死處。
君臣相顧盡沾衣,東望都門信馬歸。
歸來池苑皆依舊,太液芙蓉未央柳。
芙蓉如面柳如眉,對此如何不淚垂。
春風(fēng)桃李花開日,秋雨梧桐葉落時。
西宮南內(nèi)多秋草,落葉滿階紅不掃。
梨園弟子白發(fā)新,椒房阿監(jiān)青娥老。
夕殿螢飛思悄然,孤燈挑盡未成眠。
遲遲鐘鼓初長夜,耿耿星河欲曙天。
鴛鴦瓦冷霜華重,翡翠衾寒誰與共。
悠悠生死別經(jīng)年,魂魄不曾來入夢。
臨邛道士鴻都客,能以精誠致魂魄。
為感君王輾轉(zhuǎn)思,遂教方士殷勤覓。
排空馭氣奔如電,升天入地求之遍。
上窮碧落下黃泉,兩處茫茫皆不見。
忽聞海上有仙山,山在虛無縹渺間。
樓閣玲瓏五云起,其中綽約多仙子。
中有一人字太真,雪膚花貌參差是。
金闕西廂叩玉扃,轉(zhuǎn)教小玉報雙成。
聞道漢家天子使,九華帳里夢魂驚。
攬衣推枕起徘徊,珠箔銀屏迤邐開。
云鬢半偏新睡覺,花冠不整下堂來。
風(fēng)吹仙袂飄飖舉,猶似霓裳羽衣舞。
玉容寂寞淚闌干,梨花一枝春帶雨。
含情凝睇謝君王,一別音容兩渺茫。
昭陽殿里恩愛絕,蓬萊宮中日月長。
回頭下望人寰處,不見長安見塵霧。
惟將舊物表深情,鈿合金釵寄將去。
釵留一股合一扇,釵擘黃金合分鈿。
但教心似金鈿堅,天上人間會相見。
臨別殷勤重寄詞,詞中有誓兩心知。
七月七日長生殿,夜半無人私語時。
在天愿作比翼鳥,在地愿為連理枝。
天長地久有時盡,此恨綿綿無絕期。
"""
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from numpy import argsort
"""讀數(shù)據(jù)"""
seqs = __doc__.replace('《長恨歌》——白居易', '').replace('。', '').strip().split()
q_ls = [i.split(',')[0] for i in seqs]
a_ls = [i.split(',')[1] for i in seqs]
"""訓(xùn)練tfidf向量轉(zhuǎn)換器"""
vectorizer = TfidfVectorizer(token_pattern='[\u4e00-\u9fa5]')
X = vectorizer.fit_transform(q_ls)
def ask(q, n=3):
    q = vectorizer.transform([q])  # tfidf向量化
    indexs = cosine_similarity(X, q).reshape(-1)  # 余弦相似度
    indexs = argsort(-indexs)  # 按索引倒排
    return [a_ls[i] for i in indexs[:n]]
"""測試"""
for q, a in zip(q_ls, a_ls):
    print(q, a)
    for e, i in enumerate(ask(q)):
        print(e, i)
    print('-' * 50)
while True:
    q = input('輸入:').strip()
    for e, i in enumerate(ask(q)):
        print(e, i)

示例圖的邏輯是:輸入前一句,然后計算最接近的那幾句,最終輸出下一句

7、基于詞向量的余弦相似度

from gensim.models import Word2Vec
model = Word2Vec(ls_of_words)  # ls_of_words是存放分詞列表的列表
w2i = {w: i for i, w in enumerate(model.wv.index2word, 1)}
vectors = np.concatenate((np.zeros((1, 100)), model.wv.vectors), axis=0)
w2v = lambda w: vectors[w2i.get(w, 0)]
vec1 = np.mean([w2v(w) for w in poem1], axis=0)
vec2 = np.mean([w2v(w) for w in poem2], axis=0
print(vec1 @ vec2 / (np.linalg.norm(vec1) * np.linalg.norm(vec2)))

8、最長公共子串

Longest Common Substring

import numpy as np
def lcs(s1, s2):
    l1, l2 = len(s1), len(s2)
    matrix = np.zeros((l1 + 1, l2 + 1), dtype=int)
    max_len = 0  # 最長匹配的長度
    p = 0  # 最長匹配對應(yīng)在s1中的最后一位
    for i in range(len(s1)):
        for j in range(len(s2)):
            if s1[i] == s2[j]:
                matrix[i + 1, j+1] = matrix[i, j] + 1
                max_len, p = max([(max_len, p), (matrix[i + 1, j + 1], i + 1)])
    return s1[p - max_len: p]  # 返回最長子串及其長度
poem1 = '''《將進(jìn)酒》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見高堂明鏡悲白發(fā),朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進(jìn)酒,杯莫停。與君歌一曲,請君為我傾耳聽。
鐘鼓饌玉不足貴,但愿長醉不復(fù)醒。古來圣賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
poem2 = '''《惜樽空》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見床頭明鏡悲白發(fā),朝如青云暮成雪。
人生得意須盡歡,莫使金樽空對月。天生吾徒有俊才,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,與君哥一曲,請君為我傾。
鐘鼓玉帛豈足貴,但用長醉不復(fù)醒。古來賢圣皆死盡,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
print(lcs(poem1, poem2))

惟有飲者留其名。陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。

9、最長公共子序列

The longest common subsequence

import numpy as np
def lcs(s1, s2):
    l1, l2 = len(s1), len(s2)
    # 生成字符串長度+1的零矩陣,保存對應(yīng)位置匹配的結(jié)果
    m = np.zeros((l1 + 1, l2 + 1))
    # 記錄轉(zhuǎn)移方向
    d = np.empty_like(m, dtype=str)
    for i in range(l1):
        for j in range(l2):
            # 字符匹配成功,則該位置的值為左上方的值加1
            if s1[i] == s2[j]:
                m[i + 1, j + 1] = m[i, j] + 1
                d[i + 1, j + 1] = 'O'
            # 左值大于上值,則該位置的值為左值,并標(biāo)記回溯時的方向
            elif m[i + 1, j] > m[i, j + 1]:
                m[i + 1, j + 1] = m[i + 1, j]
                d[i + 1, j + 1] = '←'
            # 上值大于左值,則該位置的值為上值,并標(biāo)記方向↑
            else:
                m[i + 1, j + 1] = m[i, j + 1]
                d[i + 1, j + 1] = '↑'
    s = []
    while m[l1, l2]:  # 不為空時
        c = d[l1, l2]
        if c == 'O':  # 匹配成功,插入該字符,并向左上角找下一個
            s.append(s1[l1 - 1])
            l1 -= 1
            l2 -= 1
        if c == '←':  # 根據(jù)標(biāo)記,向左找下一個
            l2 -= 1
        if c == '↑':  # 根據(jù)標(biāo)記,向上找下一個
            l1 -= 1
    s.reverse()
    return ''.join(s)
poem1 = '''《將進(jìn)酒》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見高堂明鏡悲白發(fā),朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進(jìn)酒,杯莫停。與君歌一曲,請君為我傾耳聽。
鐘鼓饌玉不足貴,但愿長醉不復(fù)醒。古來圣賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
poem2 = '''《惜樽空》——李白
君不見黃河之水天上來,奔流到海不復(fù)回。君不見床頭明鏡悲白發(fā),朝如青云暮成雪。
人生得意須盡歡,莫使金樽空對月。天生吾徒有俊才,千金散盡還復(fù)來。
烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,與君哥一曲,請君為我傾。
鐘鼓玉帛豈足貴,但用長醉不復(fù)醒。古來賢圣皆死盡,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
print(lcs(poem1, poem2))

10、從屬關(guān)系

e.g.

南海區(qū) 屬于 佛山市 屬于 廣東省
南海區(qū) match 南海區(qū) = 100%
佛山市 match 南海區(qū) = 50%
廣東省 match 南海區(qū) = 25%
禪城區(qū) match 南海區(qū) = 0%

district = {
    '廣東省': '44',
    '廣州市': '4401',
    '韶關(guān)市': '4402',
    '深圳市': '4403',
    '珠海市': '4404',
    '汕頭市': '4405',
    '佛山市': '4406',
    '禪城區(qū)': '440604',
    '南海區(qū)': '440605',
}
def similarity(a, b):
    a, b = district[a], district[b]
    if a == b:
        return 1
    elif b == a[:len(b)]:  # b屬于a
        return 1 / (len(a) - len(b))
    elif a == b[:len(a)]:  # a屬于b
        return 1 / (len(b) - len(a))
    else:
        return 0
print(similarity('南海區(qū)', '南海區(qū)'))
print(similarity('佛山市', '南海區(qū)'))
print(similarity('廣東省', '南海區(qū)'))
print(similarity('禪城區(qū)', '南海區(qū)'))

11、相關(guān)系數(shù)

import pandas as pd
df = pd.DataFrame({
    'a': [11, 22, 33, 44, 55, 66, 77, 88, 99],
    'b': [10, 24, 30, 48, 50, 72, 70, 96, 90],
    'c': [91, 79, 72, 58, 53, 47, 34, 16, 10],
    'd': [99, 10, 98, 10, 17, 10, 77, 89, 10]})
df_corr = df.corr()
# 可視化
import matplotlib.pyplot as mp, seaborn
seaborn.heatmap(df_corr, center=0, annot=True, cmap='YlGnBu')
mp.show()

相關(guān)系數(shù)矩陣

如圖所示:a和b相關(guān)度較高,a和d相關(guān)度較低 可以通過一些規(guī)則 把相關(guān)度折算為相似度

12、協(xié)同過濾

補(bǔ)充

相似度矩陣

def similar_matrix(ls, f):
    import seaborn, matplotlib.pyplot as mp
    le = len(ls)
    matrix = [[f(ls[i], ls[j]) for j in range(le)] for i in range(le)]
    seaborn.heatmap(matrix, center=1, annot=True)
    mp.show()
# 相似度 = 交集 / 并集
similarity = lambda a, b: len(a & b) / len(a | b)
a = set('abcd')
b = set('bcde')
c = set('abcde')
similar_matrix([a, b, c], similarity)

13、并行計算

import numpy as np
from multiprocessing import Pool, Manager
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def similarity_set(s1, s2, similarity):
    s1, s2 = set(list(s1)), set(list(s2))
    sim = len(s1 & s2) / len(s1 | s2)
    print('set', sim)
    similarity[0] = sim
def similarity_edit_distance(s1, s2, similarity):
    l1, l2 = len(s1) + 1, len(s2) + 1
    matrix = np.zeros((l1, l2), dtype=int)
    for i in range(l1):
        matrix[i, 0] = i
    for j in range(l2):
        matrix[0, j] = j
    for i in range(1, l1):
        for j in range(1, l2):
            delta = 0 if s1[i - 1] == s2[j - 1] else 1
            matrix[i, j] = min(matrix[i - 1, j - 1] + delta,
                               matrix[i - 1, j] + 1,
                               matrix[i, j - 1] + 1)
    sim = 1 - matrix[-1][-1] / (l1 + l2 - 2) * 2
    print('edit_distance', sim)
    similarity[1] = sim
def similarity_cosine(s1, s2, similarity):
    vec1, vec2 = CountVectorizer(token_pattern='.').fit_transform([s1, s2])
    sim = cosine_similarity(vec1, vec2)[0][0]
    print('cosine', sim)
    similarity[2] = sim
def mult(s1, s2):
    similarity = Manager().Array('f', [0, 0, 0])  # 共享數(shù)組
    functions = [similarity_set, similarity_edit_distance, similarity_cosine]
    pool = Pool(processes=len(functions))
    for func in functions:
        pool.apply_async(func, (s1, s2, similarity))
    pool.close()
    pool.join()
    print('average', np.average(similarity, weights=[.3, .2, .5]))
if __name__ == '__main__':
    poem1 = '''《將進(jìn)酒》——李白
    君不見黃河之水天上來,奔流到海不復(fù)回。君不見高堂明鏡悲白發(fā),朝如青絲暮成雪。
    人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復(fù)來。
    烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進(jìn)酒,杯莫停。與君歌一曲,請君為我傾耳聽。
    鐘鼓饌玉不足貴,但愿長醉不復(fù)醒。古來圣賢皆寂寞,惟有飲者留其名。
    陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
    五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
    poem2 = '''《惜樽空》——李白
    君不見黃河之水天上來,奔流到海不復(fù)回。君不見床頭明鏡悲白發(fā),朝如青云暮成雪。
    人生得意須盡歡,莫使金樽空對月。天生吾徒有俊才,千金散盡還復(fù)來。
    烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,與君哥一曲,請君為我傾。
    鐘鼓玉帛豈足貴,但用長醉不復(fù)醒。古來賢圣皆死盡,惟有飲者留其名。
    陳王昔時宴平樂,斗酒十千恣歡謔。主人何為言少錢,徑須沽取對君酌。
    五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。'''.replace('\n', '')
    mult(poem1, poem2)
    # 自定義
    s1 = input('s1:').strip()
    s2 = input('s2:').strip()
    mult(s1, s2)

到此這篇關(guān)于Python各種相似度計算方法詳解的文章就介紹到這了,更多相關(guān)Python相似度計算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論