Python中的字符串相似度

目录
  • Python字符串相似度
  • Python相似度评估
    • 1. 在计算图片的相似度时,我自己用到过余弦距离
    • 2.欧式距离
    • 3. 曼哈顿距离
    • 4.切比雪夫距离
    • 5.闵可夫斯基距离
    • 6.标准化欧氏距离
    • 7.马氏距离
    • 8.编辑距离

Python字符串相似度

利用difflib模块—实现两个字符串或文本相似度比较

首先导入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

Python相似度评估

在评估相似度的时候,经常会用到“距离”:

1. 在计算图片的相似度时,我自己用到过余弦距离

有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

(2)两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

即:

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-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])

需要注意的一点是,用pairwise_distances计算的Cosine distance是1-(cosine similarity)结果

2.欧式距离

欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式

# 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))

3. 曼哈顿距离

从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(CityBlock distance)。

def Manhattan(vec1, vec2):
    npvec1, npvec2 = np.array(vec1), np.array(vec2)
    return np.abs(npvec1-npvec2).sum()
# Manhattan_Distance,

4.切比雪夫距离

国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是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

5.闵可夫斯基距离

闵氏距离不是一种距离,而是一组距离的定义

#!/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))

6.标准化欧氏距离

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧

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

7.马氏距离

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

8.编辑距离

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

其中,输入数据是两个同维度的数组

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现简单的文本相似度分析操作详解

    本文实例讲述了Python实现简单的文本相似度分析操作.分享给大家供大家参考,具体如下: 学习目标: 1.利用gensim包分析文档相似度 2.使用jieba进行中文分词 3.了解TF-IDF模型 环境: Python 3.6.0 |Anaconda 4.3.1 (64-bit) 工具: jupyter notebook 注:为了简化问题,本文没有剔除停用词"stop-word".实际应用中应该要剔除停用词. 首先引入分词API库jieba.文本相似度库gensim import ji

  • python文本数据相似度的度量

    编辑距离 编辑距离,又称为Levenshtein距离,是用于计算一个字符串转换为另一个字符串时,插入.删除和替换的次数.例如,将'dad'转换为'bad'需要一次替换操作,编辑距离为1. nltk.metrics.distance.edit_distance函数实现了编辑距离. from nltk.metrics.distance import edit_distance str1 = 'bad' str2 = 'dad' print(edit_distance(str1, str2)) N元语

  • 详解Python 字符串相似性的几种度量方法

    字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是:把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这种就是编辑距离(edit distance)度量方法,也称为Levenshtein距离.海明距离是编辑距离的一种特殊情况,只计算等长情况下替换操作的编辑次数,只能应用于两个等长字符串间的距离度量. 其他常用的度量方法还有 Jaccard distance.J-W距离(Jaro–Winkler dist

  • Python中的字符串相似度

    目录 Python字符串相似度 Python相似度评估 1. 在计算图片的相似度时,我自己用到过余弦距离 2.欧式距离 3. 曼哈顿距离 4.切比雪夫距离 5.闵可夫斯基距离 6.标准化欧氏距离 7.马氏距离 8.编辑距离 Python字符串相似度 利用difflib模块—实现两个字符串或文本相似度比较 首先导入difflib模块 import difflib 示例: Str = '上海中心大厦' s1  = '大厦' s2  = '上海中心' s3  = '上海中心大楼' print(diff

  • 复习Python中的字符串知识点

    字符串 在 Python 中创建字符串对象非常容易.只要将所需的文本放入一对引号中,就完成了一个新字符串的创建(参见清单 1).如果稍加思考的话,您可能会感到有些困惑.毕竟,有两类可以使用的引号:单引号 (') 和双引号 (").幸运的是,Python 再一次使这种问题迎刃而解.您可以使用任意一类引号来表示 Python 中的字符串,只要引号一致就行.如果字符串是以单引号开始,那么必须以单引号结束,反之亦然.如果不遵循这一规则,则会出现 SyntaxError 异常. 清单 1. 在 Pytho

  • python中根据字符串调用函数的实现方法

    在python中可以根据字符串来调用函数: 1.使用getattr从字符串来调用函数 在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的函数呢,主要就是使用到getattr函数的作用,这个函数就是在使用字符串得到这个字符串对应的函数的对象,然后就可以进行执行,如下所示: 在模块中,存在两个函数: [root@python 530]# cat attr.py #!/usr/bin/env python def kel(): print 'this is a kel functi

  • Python中关于字符串对象的一些基础知识

    Python的字符串被划分为不可变序列的类别,意味着这些字符串所包含的字符存在从左至右的位置顺序,并且它们不可以在本地进行修改. 基本操作 字符串可以通过+操作符进行合并,可以使用*运算符进行重复. >>>len("abc") 3 >>>'abc'+'def' 'abcdef' >>>'NI!'*4 'NI!NI!NI!NI!' 字符串内部的一个反斜杠"\"可允许把字符串放于多行. >>>str

  • Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符串均为str,单引号可以用双引号或者三引号来代替.无论用哪种方式进行制定,在Python内部存储时没有区别. bytes:二进制字符串.由于jpg等其他格式的文件不能用str进行显示,所以才用bytes来表示,bytes的每个字节为一个0-255的数字.如果打印的时候,Python会把能够用ASCI

  • Python中的字符串类型基本知识学习教程

    如果对自然语言分类,有很多中分法,比如英语.法语.汉语等,这种分法是最常见的.在语言学里面,也有对语言的分类方法,比如什么什么语系之类的.我这里提出一种分法,这种分法尚未得到广大人民群众和研究者的广泛认同,但是,我相信那句"真理是掌握在少数人的手里",至少在这里可以用来给自己壮壮胆. 我的分法:一种是语言中的两个元素(比如两个字)拼接在一起,出来一个新的元素(比如新的字):另外一种是两个元素拼接在一起,只是得到这两个元素的并列显示.比如"好"和"人&quo

  • 详解Golang 与python中的字符串反转

    详解Golang 与python中的字符串反转 在go中,需要用rune来处理,因为涉及到中文或者一些字符ASCII编码大于255的. func main() { fmt.Println(reverse("Golang python")) } func reverse(src string) string { dst := []rune(src) len := len(dst) var result []rune result = make([]rune, 0) for i := le

  • Python中的字符串切片(截取字符串)的详解

    字符串索引示意图 字符串切片也就是截取字符串,取子串 Python中字符串切片方法 字符串[开始索引:结束索引:步长] 切取字符串为开始索引到结束索引-1内的字符串 步长不指定时步长为1 字符串[开始索引:结束索引] 练习样例 # 1.截取2 - 5位置的字符 num_str_1 = num_str[2:6] print(num_str_1) # 2.截取2 - 末尾的字符 # 当开始索引和结束索引为开始和结束时可以省略不写 num_str_1 = num_str[2:] print(num_s

  • Python中拆分字符串的操作方法

    使用字符串时,常见的操作之一是使用给定的分隔符将字符串拆分为子字符串数组.在本文中,我们将讨论如何在Python中拆分字符串. .split()方法 在Python中,字符串表示为不可变的str对象. str类带有许多字符串方法,允许您操作字符串. .split()方法返回由分隔符分隔的子字符串列表. 它采用以下语法: str.split(delim=None, maxsplit=-1) 分隔符可以是字符或字符序列,而不是正则表达式. 在下面的示例中,字符串s将使用逗号分隔,作为分隔符. s =

  • 浅谈python中str字符串和unicode对象字符串的拼接问题

    str字符串 s = '中文' # s: <type 'str'> s是个str对象,中文字符串.存储方式是字节码.字节码是怎么存的: 如果这行代码在python解释器中输入&运行,那么s的格式就是解释器的编码格式: 如果这行代码是在源码文件中写入.保存然后执行,那么解释器载入代码时就将s初始化为文件指定编码(比如py文件开头那行的utf-8): unicode对象字符串 unicode是一种编码标准,具体的实现可能是utf-8,utf-16,gbk等等,这就是中文字符串和unicod

随机推荐