📜  检查字符串相似度python(1)

📅  最后修改于: 2023-12-03 14:55:45.983000             🧑  作者: Mango

检查字符串相似度Python

在实际编程中,经常需要比较两个字符串的相似度,以便确定它们是否相同或者更接近于相同。在Python中,有多种方法可以对字符串相似度进行检查。

1. Levenshtein距离

Levenshtein距离是基于编辑距离的一种算法,它可以用来计算两个字符串之间的相似度。编辑距离表示将一个字符串转换成另一个字符串所需要的最少操作次数,操作包括插入、删除、替换。

因此,Levenshtein距离可以通过插入、删除、替换操作的次数来计算两个字符串之间的编辑距离。在Python中,可以使用第三方包python-Levenshtein来计算Levenshtein距离。

!pip install python-Levenshtein  # 安装python-Levenshtein

import Levenshtein

s1 = "字符串1"
s2 = "字符串2"

distance = Levenshtein.distance(s1, s2)  # 计算Levenshtein距离

print(distance)  # 输出距离

需要注意的是,Levenshtein距离越小,表示两个字符串越相似。

2. SequenceMatcher

SequenceMatcher是Python内置的模块,也可以用来计算两个字符串之间的相似度。它基于Ratcliff/Obershelp算法,计算方法与Levenshtein距离类似。

from difflib import SequenceMatcher

s1 = "字符串1"
s2 = "字符串2"

similarity = SequenceMatcher(None, s1, s2).ratio()  # 计算相似度

print(similarity)  # 输出相似度

需要注意的是,SequenceMatcher的ratio()方法默认区分大小写,如果需要忽略大小写,可以在第一个参数中传入str.lower函数。

similarity = SequenceMatcher(lambda x: x.lower(), s1, s2).ratio()
3. Jaccard相似系数

Jaccard相似系数是一种比较常用的相似度计算方法,它用于计算两个集合之间的相似度。在将其应用到字符串比较中时,可以将每个字符串看作一个集合,字符为集合中的元素。

def jaccard_similarity(s1, s2):
    set1 = set(s1.split())
    set2 = set(s2.split())
    intersection = set1.intersection(set2)
    union = set1.union(set2)
    similarity = len(intersection) / len(union)
    return similarity

s1 = "字符串1"
s2 = "字符串2"

similarity = jaccard_similarity(s1, s2)

print(similarity)  # 输出相似度

需要注意的是,Jaccard相似系数越大,表示两个字符串越相似。

4. Cosine相似度

Cosine相似度是一种基于向量空间模型的相似度计算方法,根据向量空间中两个向量的夹角余弦值来计算相似度。

在字符串比较中,可以将每个字符串看作一个向量,并根据词频统计得到其特征向量,然后计算其余弦相似度。

import math

def cosine_similarity(s1, s2):
    vec1 = {}
    vec2 = {}
    for word in s1.split():
        vec1[word] = vec1.get(word, 0) + 1
    for word in s2.split():
        vec2[word] = vec2.get(word, 0) + 1
    intersection = set(vec1.keys()).intersection(set(vec2.keys()))
    numerator = sum([vec1[x] * vec2[x] for x in intersection])
    denominator = math.sqrt(sum([vec1[x]**2 for x in vec1.keys()])) * math.sqrt(sum([vec2[x]**2 for x in vec2.keys()]))
    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

s1 = "字符串1"
s2 = "字符串2"

similarity = cosine_similarity(s1, s2)

print(similarity)  # 输出相似度

需要注意的是,Cosine相似度越大,表示两个字符串越相似。

总结

在Python中,有多种方法可以计算字符串之间的相似度,其中常用的包括Levenshtein距离、SequenceMatcher、Jaccard相似系数和Cosine相似度。根据实际需求选择合适的方法进行比较,可以提高程序的效率和准确性。