UNPKG

@technobuddha/library

Version:
60 lines (59 loc) 2.38 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.levenshteinDistance = void 0; var create2DArray_1 = __importDefault(require("../create2DArray")); /** * Compute the levenshtein distance between two strings (similarity) * * @param input The string * @param comparedTo The string to compare to * @param __namedParameters see {@link Options} * @default caseInsensitive true * @returns the levenshteinDistance between the two strings (0 for no similarity through 1 for equal) */ function levenshteinDistance(input, comparedTo, _a) { var _b = _a === void 0 ? {} : _a, _c = _b.caseInsensitive, caseInsensitive = _c === void 0 ? true : _c; if (input.length === 0 || comparedTo.length === 0) return Math.max(input.length, comparedTo.length); if (caseInsensitive) { input = input.toLowerCase(); comparedTo = comparedTo.toLowerCase(); } var inputLen = input.length; var comparedToLen = comparedTo.length; var matrix = create2DArray_1.default(inputLen, comparedToLen, 0); //initialize for (var i = 0; i < inputLen; ++i) matrix[i][0] = i; for (var i = 0; i < comparedToLen; ++i) matrix[0][i] = i; //analyze for (var i = 1; i < inputLen; ++i) { var si = input.charAt(i - 1); for (var j = 1; j < comparedToLen; ++j) { var tj = comparedTo.charAt(j - 1); var cost = (si === tj) ? 0 : 1; var above = matrix[i - 1][j]; var left = matrix[i][j - 1]; var diag = matrix[i - 1][j - 1]; var cell = Math.min(Math.min(above + 1, left + 1), diag + cost); //transposition if (i > 1 && j > 1) { var trans = matrix[i - 2][j - 2] + 1; if (input.charAt(i - 2) !== comparedTo.charAt(j - 1)) trans++; if (input.charAt(i - 1) !== comparedTo.charAt(j - 2)) trans++; if (cell > trans) cell = trans; } matrix[i][j] = cell; } } return matrix[inputLen - 1][comparedToLen - 1]; } exports.levenshteinDistance = levenshteinDistance; exports.default = levenshteinDistance;