python实现字符串相似度比较排序

需求背景:

        数据中台建设完成时,在录入大量词根/字典后,搜索长用词根/字典时很不方便。比如"is",这个词根在很多单次中都会存在,如果不做返回结果的排序,那么查询使用时很不方便。

思路:

        我们可以将搜索关键词和搜索返回结果进行长度比较。然后按照从大到小排序(完全相同则为100%),实现相似度排序的效果。

python实现:

定义变量:

    ## 搜索关键词
    word = "aa"
    
    ## 词根/字典
    list1 = ["aaa", "aaaaaaaa",  "aaaaa", "aaaaaa", "aaaa","bbb", "ccc"]


    ## 过滤掉非匹配词根/字典结果数据存储
    list2 = []

    ##相似度计算结果
    dict1 = {}

过滤不匹配词根/字典,相似度计算:

    for i in list1:
        if word in i :
            list2.append(i)
            dict1[i] = len(word)/len(i)

    print(list2)
    print(dict1)
    ## ['aaa', 'aaaaaaaa', 'aaaaa', 'aaaaaa', 'aaaa']
    ## {'aaa': 0.6666666666666666, 'aaaaaaaa': 0.25, 'aaaaa': 0.4, 'aaaaaa': 0.3333333333333333, 'aaaa': 0.5}

根据相似度对结果进行排序:

    import operator
    sorted_dict = dict(sorted(dict1.items(),key=operator.itemgetter(1),reverse=True))
    print(sorted_dict)

    ##{'aaa': 0.6666666666666666, 'aaaa': 0.5, 'aaaaa': 0.4, 'aaaaaa': 0.3333333333333333, 'aaaaaaaa': 0.25}
    
    
    ##对列表排序
    sorted_list = sorted(list2, key=lambda x: dict1.get(x),reverse=True)
    print(sorted_list)

    ## ['aaa', 'aaaa', 'aaaaa', 'aaaaaa', 'aaaaaaaa']

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现模糊搜索一般可以使用字符串相似度算法,比如 Levenshtein Distance、Jaro Distance、Jaro-Winkler Distance 等等。这里给出使用 Levenshtein Distance 实现模糊搜索的示例代码: ```python import numpy as np def levenshtein_distance(s1, s2): """ 计算两个字符串的 Levenshtein Distance """ m, n = len(s1), len(s2) dp = np.zeros((m+1, n+1)) # 初始化第一行和第一列 for i in range(m+1): dp[i][0] = i for j in range(n+1): dp[0][j] = j # 计算 dp 数组 for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) return dp[m][n] def fuzzy_search(query, texts, threshold): """ 在 texts 中进行模糊搜索,返回与 query 相似度大于等于 threshold 的结果 """ results = [] for text in texts: distance = levenshtein_distance(query, text) similarity = 1 - distance / max(len(query), len(text)) if similarity >= threshold: results.append((text, similarity)) # 按相似度从大到小排序 results = sorted(results, key=lambda x: x[1], reverse=True) return results ``` 使用示例: ```python texts = ['apple', 'banana', 'orange', 'peach'] query = 'appl' threshold = 0.7 results = fuzzy_search(query, texts, threshold) print(results) ``` 输出: ``` [('apple', 0.8), ('peach', 0.4)] ``` 这里使用 Levenshtein Distance 计算字符串相似度,并且设定了一个阈值,只有相似度大于等于阈值的结果才会被返回。可以根据实际需求调整阈值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值