fuzzy-rater
Version:
Tooling for fuzzily rating text according to some query
122 lines • 12.9 kB
JavaScript
;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnV6enlXb3JkTWF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mdXp6eVJhdGUvd29yZE1hdGNoZXIvX3Rlc3RzL0Z1enp5V29yZE1hdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwREFBcUQ7QUFFckQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUF5QixFQUFFLE1BQWdCO0lBQzdELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDekMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLEdBQUcsQ0FBSSxJQUFXLEVBQUUsS0FBUTtJQUNqQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFdBQW1CO0lBQzFDLE1BQU0sQ0FBQyxHQUFHO1FBQ04sQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsT0FBTztRQUNWLENBQUMsRUFBRSxTQUFTO1FBQ1osQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsTUFBTTtLQUNaLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUFDLENBQUMsQ0FBQyxDQUFtQixDQUFDLG1DQUFJLEVBQUUsR0FBQSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7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