当前位置:首页 > JavaScript

js实现fuzzywuzzy

2026-02-01 02:25:06JavaScript

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

FuzzyWuzzy 是一个流行的字符串模糊匹配库,最初用 Python 编写。在 JavaScript 中,可以通过以下方式实现类似功能:

使用 fuzzball.js

fuzzball.js 是 FuzzyWuzzy 的 JavaScript 移植版本,提供类似功能:

const fuzz = require('fuzzball');

// 简单比例匹配
const ratio = fuzz.ratio("hello world", "hello worl");
console.log(ratio); // 输出相似度分数

// 部分比例匹配
const partialRatio = fuzz.partial_ratio("hello world", "worl");
console.log(partialRatio);

// 令牌排序比例
const tokenSortRatio = fuzz.token_sort_ratio("hello world", "world hello");
console.log(tokenSortRatio);

// 令牌集合比例
const tokenSetRatio = fuzz.token_set_ratio("hello world", "hello small world");
console.log(tokenSetRatio);

自定义实现 Levenshtein 距离

基础相似度算法可以通过实现 Levenshtein 距离来计算:

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 similarityScore(str1, str2) {
  const distance = levenshteinDistance(str1, str2);
  const maxLength = Math.max(str1.length, str2.length);
  return (1 - distance / maxLength) * 100;
}

使用字符串相似度库

string-similarity 是另一个流行的 JavaScript 库:

const stringSimilarity = require('string-similarity');

const similarity = stringSimilarity.compareTwoStrings("hello", "helloo");
console.log(similarity); // 输出 0.933...

const matches = stringSimilarity.findBestMatch("hello", [
  "hell", "world", "hello", "helloo"
]);
console.log(matches.bestMatch); // 输出最佳匹配

实现部分匹配功能

对于部分字符串匹配,可以扩展基础算法:

function partialMatchScore(mainStr, subStr) {
  const len = subStr.length;
  let bestScore = 0;

  for (let i = 0; i <= mainStr.length - len; i++) {
    const segment = mainStr.substr(i, len);
    const score = similarityScore(segment, subStr);
    if (score > bestScore) {
      bestScore = score;
    }
  }

  return bestScore;
}

实现令牌排序匹配

处理单词顺序不同的情况:

function tokenSortRatio(str1, str2) {
  const tokens1 = str1.split(/\s+/).sort().join(' ');
  const tokens2 = str2.split(/\s+/).sort().join(' ');
  return similarityScore(tokens1, tokens2);
}

实现令牌集合匹配

更高级的匹配方式,考虑重复单词:

function tokenSetRatio(str1, str2) {
  const set1 = new Set(str1.split(/\s+/));
  const set2 = new Set(str2.split(/\s+/));

  const intersection = new Set([...set1].filter(x => set2.has(x)));
  const union = new Set([...set1, ...set2]);

  const sortedIntersection = [...intersection].sort().join(' ');
  const sortedUnion = [...union].sort().join(' ');

  return similarityScore(sortedIntersection, sortedUnion);
}

这些方法提供了从基础到高级的字符串模糊匹配功能,可以根据具体需求选择使用现成库或自定义实现。对于大多数应用场景,fuzzball.jsstring-similarity 库已经足够,且性能更好。

js实现fuzzywuzzy

标签: jsfuzzywuzzy
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js实现类

js实现类

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

js防抖和节流实现

js防抖和节流实现

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…