UNPKG

fuzzy-rater

Version:

Tooling for fuzzily rating text according to some query

122 lines 12.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const FuzzyWordMatcher_1 = require("../FuzzyWordMatcher"); /** * Retrieves the distances for each of the inputs under the given matcher, or false if the text didn't match * @param matcher The matcher to use * @param inputs The inputs to match * @returns The distances or false for not matched inputs */ function getDistances(matcher, inputs) { return inputs.map(text => { const match = matcher.getMatch(text); if (match.matched) return match.distance; return false; }); } /** * Maps a constant value over an input array * @param list The list of inputs to map the constants over * @param value The value to map to * @returns The list of values */ function map(list, value) { return list.map(() => value); } /** * Converts a string of alteration codes into the proper alteration types array * @param alterations The alterations string * @returns The alterations array */ function createAlterations(alterations) { const t = { i: "ignore", m: "match", r: "replace", a: "insert", s: "skip", }; return Array.from(alterations).map(s => { var _a; return (_a = t[s]) !== null && _a !== void 0 ? _a : ""; }); } describe("FuzzyWordMatcher", () => { describe("new FuzzyWordMatcher", () => { it("Doesn't error", () => { new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 2); }); }); describe("FuzzyWordMatcher.getMatch", () => { it("Should find whether text contains exact matches", () => { const matcher = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 2); const match = matcher.getMatch("I like oranges"); const noMatch = matcher.getMatch("Potatoes are amazing"); expect(match.matched).toBeTruthy(); expect(noMatch.matched).toBeFalsy(); }); it("Should find matches at most n characters away", () => { const matcher0 = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 0); const matcher1 = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 1); const matcher2 = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 2); const matcher3 = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 3); const matches = ["I like oranges", "oranges are nice"]; const with1mistake = [ "I like orange", "I like ornges", "orangles are nice", "oronges are cool", ]; const with2mistakes = [ "I like ornge", "I like orngaes", "orlangles are nice", "orongkes are cool", ]; const with3mistakes = [ "I like orne", "I like orngaees", "orflangles are nice", "orlongkes are cool", ]; const noMatches = [ "I like potaters", "hockey is cool sport", "That will be 4 bux baby", ]; expect(getDistances(matcher0, matches)).toEqual(map(matches, 0)); expect(getDistances(matcher0, with1mistake)).toEqual(map(with1mistake, false)); expect(getDistances(matcher0, with2mistakes)).toEqual(map(with2mistakes, false)); expect(getDistances(matcher0, with3mistakes)).toEqual(map(with3mistakes, false)); expect(getDistances(matcher0, noMatches)).toEqual(map(noMatches, false)); expect(getDistances(matcher1, matches)).toEqual(map(matches, 0)); expect(getDistances(matcher1, with1mistake)).toEqual(map(with1mistake, 1)); expect(getDistances(matcher1, with2mistakes)).toEqual(map(with2mistakes, false)); expect(getDistances(matcher1, with3mistakes)).toEqual(map(with3mistakes, false)); expect(getDistances(matcher1, noMatches)).toEqual(map(noMatches, false)); expect(getDistances(matcher2, matches)).toEqual(map(matches, 0)); expect(getDistances(matcher2, with1mistake)).toEqual(map(with1mistake, 1)); expect(getDistances(matcher2, with2mistakes)).toEqual(map(with2mistakes, 2)); expect(getDistances(matcher2, with3mistakes)).toEqual(map(with3mistakes, false)); expect(getDistances(matcher2, noMatches)).toEqual(map(noMatches, false)); expect(getDistances(matcher3, matches)).toEqual(map(matches, 0)); expect(getDistances(matcher3, with1mistake)).toEqual(map(with1mistake, 1)); expect(getDistances(matcher3, with2mistakes)).toEqual(map(with2mistakes, 2)); expect(getDistances(matcher3, with3mistakes)).toEqual(map(with3mistakes, 3)); expect(getDistances(matcher3, noMatches)).toEqual(map(noMatches, false)); }); it("Should find the best match", () => { const matcher = new FuzzyWordMatcher_1.FuzzyWordMatcher("oranges", 2); const match = matcher.getMatch("I like orangs with oranges and some orans"); expect(match).toEqual({ matched: true, distance: 0 }); }); }); describe("FuzzyWordMatcher.getMatchData", () => { it("Should retrieve the change data", () => { const matcher = new FuzzyWordMatcher_1.FuzzyWordMatcher("potatlers", 2); const match = matcher.getMatchData("I like potatoes in germany"); expect(match.alterations.map(({ type }) => type)).toEqual(createAlterations("iiiiiiimmmmmrmsmiiiiiiiiiii")); const match2 = matcher.getMatchData("I like potaltles in germany"); expect(match2.alterations.map(({ type }) => type)).toEqual(createAlterations("iiiiiiimmmmammmsmiiiiiiiiiii")); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnV6enlXb3JkTWF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9mdXp6eVJhdGUvd29yZE1hdGNoZXIvX3Rlc3RzL0Z1enp5V29yZE1hdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwREFBcUQ7QUFFckQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUF5QixFQUFFLE1BQWdCO0lBQzdELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDekMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLEdBQUcsQ0FBSSxJQUFXLEVBQUUsS0FBUTtJQUNqQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFdBQW1CO0lBQzFDLE1BQU0sQ0FBQyxHQUFHO1FBQ04sQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsT0FBTztRQUNWLENBQUMsRUFBRSxTQUFTO1FBQ1osQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsTUFBTTtLQUNaLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUFDLENBQUMsQ0FBQyxDQUFtQixDQUFDLG1DQUFJLEVBQUUsR0FBQSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVB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