当前位置:首页 > JavaScript

js实现fuzzywuzzy

2026-03-14 00:37:06JavaScript

实现模糊字符串匹配(FuzzyWuzzy)的JavaScript方法

使用fuzzball.js

fuzzball.js是Python库FuzzyWuzzy的JavaScript移植版本,支持Levenshtein距离、部分字符串匹配等算法。

安装方法:

npm install fuzzball

基础用法示例:

const fuzz = require('fuzzball');
const options = { scorer: fuzz.token_set_ratio };
console.log(fuzz.extract("hello", ["hey", "hell", "hola"], options));

纯JavaScript实现Levenshtein距离

以下是一个计算字符串相似度的基础实现:

function levenshteinDistance(a, b) {
  const matrix = Array(b.length + 1).fill(null)
    .map(() => Array(a.length + 1).fill(null));

  for (let i = 0; i <= a.length; i++) matrix[0][i] = i;
  for (let j = 0; j <= b.length; j++) matrix[j][0] = j;

  for (let j = 1; j <= b.length; j++) {
    for (let i = 1; i <= a.length; i++) {
      const cost = a[i - 1] === b[j - 1] ? 0 : 1;
      matrix[j][i] = Math.min(
        matrix[j][i - 1] + 1,
        matrix[j - 1][i] + 1,
        matrix[j - 1][i - 1] + cost
      );
    }
  }
  return matrix[b.length][a.length];
}

function similarity(a, b) {
  const distance = levenshteinDistance(a, b);
  return 1 - distance / Math.max(a.length, b.length);
}

字符串预处理优化

进行匹配前对字符串进行标准化处理能提高准确率:

function normalizeString(str) {
  return str.toLowerCase()
    .replace(/[^\w\s]/g, '')
    .replace(/\s+/g, ' ')
    .trim();
}

const str1 = normalizeString("Hello-World!");
const str2 = normalizeString("hello world");
console.log(similarity(str1, str2)); // 将得到更高匹配度

基于n-gram的相似度计算

该方法通过比较字符串的子序列来评估相似度:

function getNGrams(str, n) {
  const grams = [];
  for (let i = 0; i <= str.length - n; i++) {
    grams.push(str.substring(i, i + n));
  }
  return grams;
}

function nGramSimilarity(a, b, n = 2) {
  const aGrams = getNGrams(a, n);
  const bGrams = getNGrams(b, n);
  const intersection = aGrams.filter(x => bGrams.includes(x));
  return intersection.length / Math.max(aGrams.length, bGrams.length);
}

实际应用建议

对于生产环境,推荐使用经过优化的库如fuzzball.js。若需要轻量级解决方案,可组合使用Levenshtein距离和n-gram方法,配合字符串预处理。

js实现fuzzywuzzy

性能敏感场景应考虑添加缓存机制,或限制最大比较字符串长度。对于大规模数据集,可先使用简单筛选(如首字母匹配)减少需要详细比较的条目数量。

标签: jsfuzzywuzzy
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…