当前位置:首页 > 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);
}

实现令牌集合匹配

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

js实现fuzzywuzzy

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 库已经足够,且性能更好。

标签: jsfuzzywuzzy
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js防抖和节流实现

js防抖和节流实现

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…