当前位置:首页 > JavaScript

js实现fuzzywuzzy

2026-04-05 18:48:00JavaScript

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

使用 fuzzball.js

fuzzball.js 是 Python fuzzywuzzy 的 JavaScript 移植版本,支持多种模糊匹配算法。

安装:

npm install fuzzball

使用示例:

const fuzzball = require('fuzzball');

const string1 = "hello world";
const string2 = "hello there";

// 简单比率比较
const ratio = fuzzball.ratio(string1, string2);
console.log(`Ratio: ${ratio}`);

// 部分比率比较(子字符串匹配)
const partialRatio = fuzzball.partial_ratio(string1, string2);
console.log(`Partial Ratio: ${partialRatio}`);

// 令牌排序比率(忽略单词顺序)
const tokenSortRatio = fuzzball.token_sort_ratio(string1, string2);
console.log(`Token Sort Ratio: ${tokenSortRatio}`);

// 令牌集比率(匹配重复单词)
const tokenSetRatio = fuzzball.token_set_ratio(string1, string2);
console.log(`Token Set Ratio: ${tokenSetRatio}`);

使用 fast-fuzzy

fast-fuzzy 是另一个高性能的模糊搜索库,支持 Unicode 和多种匹配选项。

安装:

npm install fast-fuzzy

使用示例:

const { fuzzy } = require('fast-fuzzy');

const options = {
  threshold: 0.6,          // 匹配阈值
  ignoreCase: true,        // 忽略大小写
  normalizeWhitespace: true // 标准化空格
};

const result = fuzzy("hello", "hlelo", options);
console.log(`Match score: ${result}`);

自定义实现(Levenshtein 距离)

如果需要轻量级实现,可以使用 Levenshtein 距离算法:

js实现fuzzywuzzy

function levenshteinDistance(a, b) {
  const matrix = [];
  for (let i = 0; i <= b.length; i++) {
    matrix[i] = [i];
  }
  for (let j = 0; j <= a.length; j++) {
    matrix[0][j] = j;
  }
  for (let i = 1; i <= b.length; i++) {
    for (let j = 1; j <= a.length; j++) {
      if (b.charAt(i - 1) === a.charAt(j - 1)) {
        matrix[i][j] = matrix[i - 1][j - 1];
      } else {
        matrix[i][j] = Math.min(
          matrix[i - 1][j - 1] + 1,
          matrix[i][j - 1] + 1,
          matrix[i - 1][j] + 1
        );
      }
    }
  }
  return matrix[b.length][a.length];
}

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

console.log(similarity("kitten", "sitting")); // ~0.57

应用场景选择

  • 简单字符串比较:使用 fuzzball.ratio 或 Levenshtein 距离
  • 包含子字符串的匹配:使用 fuzzball.partial_ratio
  • 单词顺序不同的文本:使用 fuzzball.token_sort_ratio
  • 大数据集搜索:使用 fast-fuzzy 的性能优化版本

所有方案都支持处理 Unicode 字符,但需要注意不同库对特殊字符(如标点符号)的处理方式可能不同。

标签: jsfuzzywuzzy
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…