UNPKG

custom-edit-distance

Version:
83 lines (70 loc) 2.43 kB
# Custom Edit Distance<sup id="a1">[1](#f1) ### *The usual algorithm<sup id="a2">[2](#f2)</sup> with customizable costs.* [![npm version](https://badge.fury.io/js/custom-edit-distance.svg)](https://www.npmjs.com/package/custom-edit-distance) [![Build Status](https://travis-ci.org/kstafford3/custom-edit-distance.svg?branch=mater)](https://travis-ci.org/kstafford3/custom-edit-distance) # Install ```sh npm install custom-edit-distance ``` # Calculate ```js const defaultCalculator = new CustomEditDistance(); defaultCalculator.editDistance('sitting', 'kitten').should.equal(3); ``` # Customize Costs ```js const LEVENSHTEIN = { getKeepCost(unchangedValue) { return 0; }, getInsertCost(insertedValue) { return 1; }, getRemoveCost(removedValue) { return 1; }, getSubstituteCost(fromValue, toValue) { return 1; }, }; const defaultCalculator = new CustomEditDistance(LEVENSHTEIN); ``` For convenience, we default to the Levenshtein<sup id="a3">[3](#f3)</sup> distance costs. We also export it as LEVENSHTEIN. # Customize Equivalence ```js const equivalence = function(a, b) { a == b; // Only check for abstract equivalence }; const defaultCalculator = new CustomEditDistance(null, equivalence); ``` For convenience we default to strict equality (===). # Sequences don't have to be Strings ```js const defaultCalculator = new CustomEditDistance(); defaultCalculator.editDistance([1, 2, 3], [1, 4, 3]).should.equal(1); ``` This is where defining cost can shine: ```js const valueDistanceCalculator = new CustomEditDistance({ getInsertCost(insertedValue) { return insertedValue; }, getRemoveCost(removedValue) { return removedValue; }, getSubstituteCost(fromValue, toValue) { return Math.abs(toValue - fromValue); }, }); valueDistanceCalculator.editDistance([2, 3, 4], [1, 2, 3]).should.equal(3); ``` # Get the cost matrix ```js const defaultCalculator = new CustomEditDistance(); const costMatrix = defaultCalculator.editCosts('sitting', 'kitten').should.equal(3); ``` From this you could determine the edit path, or inspect the cost of other edit paths. # Reference <a id="f1"/>[Edit Distance](https://en.wikipedia.org/wiki/Edit_distance) [↩](#a1) <a id="f2"/>[The Wagner-Fischer Algorithm](https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm) [↩](#a2) <a id="f3"/>[Levenshtein Distance](https://en.wikipedia.org/wiki/Levenshtein_distance) [↩](#a3)