@technobuddha/library
Version:
A large library of useful functions
38 lines • 3.35 kB
JavaScript
import { diceCoefficient } from "./dice-coefficient.js";
import { levenshteinDistance } from "./levenshtein-distance.js";
import { longestCommonSubstring } from "./longest-common-substring.js";
/**
* Computes a fuzzy similarity score between two strings using a weighted combination
* of Levenshtein distance, Dice coefficient, and longest common substring metrics.
* @param input - The input string to compare.
* @param comparedTo - The string to compare against.
* @param options - Optional configuration for the comparison.
* @returns A similarity score between 0 and 1, where 1 indicates a perfect match.
* @group String
* @category Fuzzy Match
*/
export function fuzzyMatch(input, comparedTo, { caseInsensitive = true, weightLevenshteinDistance = 5, weightDiceCoefficient = 3, weightLongestCommonSubstring = 2, } = {}) {
const len = Math.max(input.length, comparedTo.length);
let wgt = 0;
let sum = 0;
if (len) {
if (weightLevenshteinDistance) {
sum +=
weightLevenshteinDistance *
(1.0 - levenshteinDistance(input, comparedTo, { caseInsensitive }) / len);
wgt += weightLevenshteinDistance;
}
if (weightDiceCoefficient) {
sum += weightDiceCoefficient * diceCoefficient(input, comparedTo, { caseInsensitive });
wgt += weightDiceCoefficient;
}
if (weightLongestCommonSubstring) {
sum +=
weightLongestCommonSubstring *
(longestCommonSubstring(input, comparedTo, { caseInsensitive }).length / len);
wgt += weightLongestCommonSubstring;
}
}
return wgt === 0 ? 0 : sum / wgt;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnV6enktbWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnV6enktbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBa0J2RTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixLQUFhLEVBQ2IsVUFBa0IsRUFDbEIsRUFDRSxlQUFlLEdBQUcsSUFBSSxFQUN0Qix5QkFBeUIsR0FBRyxDQUFDLEVBQzdCLHFCQUFxQixHQUFHLENBQUMsRUFDekIsNEJBQTRCLEdBQUcsQ0FBQyxNQUNYLEVBQUU7SUFFekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFFWixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1lBQzlCLEdBQUc7Z0JBQ0QseUJBQXlCO29CQUN6QixDQUFDLEdBQUcsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUM1RSxHQUFHLElBQUkseUJBQXlCLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUMxQixHQUFHLElBQUkscUJBQXFCLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1lBQ2pDLEdBQUc7Z0JBQ0QsNEJBQTRCO29CQUM1QixDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoRixHQUFHLElBQUksNEJBQTRCLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxDQUFDIn0=