当前位置:首页 > JavaScript

js实现fuzzywuzzy

2026-03-14 00:37:06JavaScript

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

使用fuzzball.js

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

安装方法:

npm install fuzzball

基础用法示例:

js实现fuzzywuzzy

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);
}

字符串预处理优化

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

js实现fuzzywuzzy

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方法,配合字符串预处理。

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

标签: jsfuzzywuzzy
分享给朋友:

相关文章

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…