您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Python中的字符串相似度實(shí)例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python中的字符串相似度實(shí)例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
利用difflib模塊—實(shí)現(xiàn)兩個字符串或文本相似度比較
首先導(dǎo)入difflib模塊
import difflib
示例:
Str = '上海中心大廈' s1 = '大廈' s2 = '上海中心' s3 = '上海中心大樓'
print(difflib.SequenceMatcher(None, Str, s1).quick_ratio()) print(difflib.SequenceMatcher(None, Str, s2).quick_ratio()) print(difflib.SequenceMatcher(None, Str, s3).quick_ratio()) 0.5 0.8 0.8333333333333334
在評估相似度的時候,經(jīng)常會用到“距離”:
有沒有搞錯,又不是學(xué)幾何,怎么扯到夾角余弦了?各位看官稍安勿躁。幾何中夾角余弦可用來衡量兩個向量方向的差異,機(jī)器學(xué)習(xí)中借用這一概念來衡量樣本向量之間的差異。
(1)在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角余弦公式:
(2)兩個n維樣本點(diǎn)a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角余弦
類似的,對于兩個n維樣本點(diǎn)a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用類似于夾角余弦的概念來衡量它們間的相似程度。
即:
夾角余弦取值范圍為[-1,1]。夾角余弦越大表示兩個向量的夾角越小,夾角余弦越小表示兩向量的夾角越大。當(dāng)兩個向量的方向重合時夾角余弦取最大值1,當(dāng)兩個向量的方向完全相反夾角余弦取最小值-1。
import numpy as np # 余弦相似度(法1): def cosin_distance2(vector1, vector2): user_item_matric = np.vstack((vector1, vector2)) sim = user_item_matric.dot(user_item_matric.T) norms = np.array([np.sqrt(np.diagonal(sim))]) user_similarity = (sim / norms / norms.T)[0][1] return user_similarity data = np.load("data/all_features.npy") #sim = cosin_distance(data[22], data[828]) sim = cosin_distance2(data[22], data[828]) print(sim) # 余弦相似度(法2) from sklearn.metrics.pairwise import cosine_similarity a = np.array([1, 2, 8, 4, 6]) a1 = np.argsort(a) user_tag_matric = np.vstack((a, a1)) user_similarity = cosine_similarity(user_tag_matric) print(user_similarity[0][1]) # 余弦相似度(法3) from sklearn.metrics.pairwise import pairwise_distances a = np.array([1, 2, 8, 4, 6]) a1 = np.argsort(a) user_tag_matric = np.vstack((a, a1)) user_similarity = pairwise_distances(user_tag_matric, metric='cosine') print(1-user_similarity[0][1])
需要注意的一點(diǎn)是,用pairwise_distances計算的Cosine distance是1-(cosine similarity)結(jié)果
歐氏距離是最易于理解的一種距離計算方法,源自歐氏空間中兩點(diǎn)間的距離公式
# 1) given two data points, calculate the euclidean distance between them def get_distance(data1, data2): points = zip(data1, data2) diffs_squared_distance = [pow(a - b, 2) for (a, b) in points] return math.sqrt(sum(diffs_squared_distance))
從名字就可以猜出這種距離的計算方法了。想象你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點(diǎn)間的直線距離嗎?顯然不是,除非你能穿越大樓。實(shí)際駕駛距離就是這個“曼哈頓距離”。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為城市街區(qū)距離(CityBlock distance)。
def Manhattan(vec1, vec2): npvec1, npvec2 = np.array(vec1), np.array(vec2) return np.abs(npvec1-npvec2).sum() # Manhattan_Distance,
國際象棋玩過么?國王走一步能夠移動到相鄰的8個方格中的任意一個。那么國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走試試。你會發(fā)現(xiàn)最少步數(shù)總是max(| x2-x1 | , | y2-y1 | ) 步。有一種類似的一種距離度量方法叫切比雪夫距離。
def Chebyshev(vec1, vec2): npvec1, npvec2 = np.array(vec1), np.array(vec2) return max(np.abs(npvec1-npvec2)) # Chebyshev_Distance
閔氏距離不是一種距離,而是一組距離的定義
#!/usr/bin/env python from math import* from decimal import Decimal def nth_root(value,n_root): root_value=1/float(n_root) return round(Decimal(value)**Decimal(root_value),3) def minkowski_distance(x,y,p_value): return nth_root(sum(pow(abs(a-b),p_value) for a,b in zip(x,y)),p_value) print(minkowski_distance([0,3,4,5],[7,6,3,-1],3))
標(biāo)準(zhǔn)化歐氏距離是針對簡單歐氏距離的缺點(diǎn)而作的一種改進(jìn)方案。標(biāo)準(zhǔn)歐氏距離的思路:既然數(shù)據(jù)各維分量的分布不一樣,好吧!那我先將各個分量都“標(biāo)準(zhǔn)化”到均值、方差相等吧
def Standardized_Euclidean(vec1,vec2,v): from scipy import spatial npvec = np.array([np.array(vec1), np.array(vec2)]) return spatial.distance.pdist(npvec, 'seuclidean', V=None) # Standardized Euclidean distance # http://blog.csdn.net/jinzhichaoshuiping/article/details/51019473
def Mahalanobis(vec1, vec2): npvec1, npvec2 = np.array(vec1), np.array(vec2) npvec = np.array([npvec1, npvec2]) sub = npvec.T[0]-npvec.T[1] inv_sub = np.linalg.inv(np.cov(npvec1, npvec2)) return math.sqrt(np.dot(inv_sub, sub).dot(sub.T)) # MahalanobisDistance
def Edit_distance_str(str1, str2): import Levenshtein edit_distance_distance = Levenshtein.distance(str1, str2) similarity = 1-(edit_distance_distance/max(len(str1), len(str2))) return {'Distance': edit_distance_distance, 'Similarity': similarity} # Levenshtein distance
其中,輸入數(shù)據(jù)是兩個同維度的數(shù)組
讀到這里,這篇“Python中的字符串相似度實(shí)例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。