vue3+ts实现精确计算两个字符串的相似度

在TypeScript中,可以使用Levenshtein莱文斯坦距离算法来精确匹配两个字符串的相似度百分比。

一、莱文斯坦距离算法介绍

        莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为A和B。莱文斯坦距离被定义为''将字符串A变换为字符串B所需的删除、插入、替换操作的次数''。

定义:

在数学上,两个字符串a,b的莱文斯坦距离记作

数学的公式如下:

表示内容: 

        

代码表示:

dp[i][j] = min(
    dp[i-1][j] + 1,       // 插入操作
    dp[i][j-1] + 1,       // 删除操作
    dp[i-1][j-1] + cost   // 替换操作
)
/**
 * Levenshtein距离算法来精确匹配两个字符串的相似度
 * Levenshtein距离是指两个字符串之间,由一个转换成另一个所需的最少编辑操作次数,这里的编辑操作包括插入、删除、替换
 */
function levenshteinDistance(str1: string, str2: string): number {
  let m = str1.length;
  let n = str2.length;
  let dp: number[][] = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));

  for (let i = 0; i <= m; i++) {
    dp[i][0] = i;
  }

  for (let j = 0; j <= n; j++) {
    dp[0][j] = j;
  }

  for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
      if (str1[i - 1] === str2[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1];
      } else {
        dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
      }
    }
  }

  return dp[m][n];
}
//根据两字符串的最大长度和计算得到的Levenshtein距离来计算相似度百分比
function calculateSimilarityPercentage(str1: string, str2: string): number {
  const maxLength = Math.max(str1.length, str2.length);
  const distance = levenshteinDistance(str1, str2);
  return 1 - distance / maxLength;
}

调用:

const queryAndSort = (word: string, targetWord: string) => {
  return calculateSimilarityPercentage(word, targetWord);
};
console.log(queryAndSort1("byte_id", "id"), "------------"); // 0.2857142857142857 
console.log(queryAndSort1("byte_id", "byte_id"), "------------");// 1

通过这种方式实现的字符串相似度是比较准确的。无论是匹配中文、英文、还是中英结合的、或者正序倒序的都可以正确匹配出来~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suoh's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值