UNPKG

fuzzy-rater

Version:

Tooling for fuzzily rating text according to some query

162 lines 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getID = exports.getTransitions = exports.createFuzzyNFATemplate = void 0; /** * Creates a new dfa template based on the query and max distance * @param query The query to create a template for * @param maxDistance The maximal allowed distance * @param exitOnMatch Whether the NFA should exit out of the node after match * @returns A dfa template */ function createFuzzyNFATemplate(query, maxDistance, exitOnMatch = false) { const nodes = []; // Add the initial node nodes.push({ ID: getID(query, 0, -1), initial: true, transitions: [...getTransitions(query, maxDistance, 0, -1)], metadata: { matched: false, distance: 0, }, }); // Compute the grid of nodes for (let dist = 0; dist <= maxDistance; dist++) { for (let i = 0; i < query.length; i++) { nodes.push({ ID: getID(query, dist, i), initial: false, transitions: [ ...getTransitions(query, maxDistance, dist, i, exitOnMatch), ], metadata: { matched: i + 1 == query.length, distance: dist, }, }); } } return nodes; } exports.createFuzzyNFATemplate = createFuzzyNFATemplate; /** * Retrieves all the transitions for a given node * @param query The query the transitions are for * @param maxDist The maximal allowed distance * @param dist The current distance * @param index The index of character matched so far * @param exitOnMatch Whether the NFA should exit out of the node after match * @returns The set of transitions from this node */ function getTransitions(query, maxDist, dist, index, exitOnMatch = false) { const nextIndex = index + 1; const nextChar = query[nextIndex]; const transitions = []; if (nextChar) { // Literal character match transitions.push({ to: getID(query, dist, nextIndex), type: "character", character: nextChar, metadata: { type: "match", index: nextIndex, character: nextChar, }, }); if (dist < maxDist) { // Skip query character transitions.push({ to: getID(query, dist + 1, nextIndex), type: "empty", metadata: { type: "skip", index: nextIndex, character: nextChar, }, }); // Replace query character transitions.push({ to: getID(query, dist + 1, nextIndex), type: "remaining", metadata: { type: "replace", index: nextIndex, character: nextChar, }, }); } } if (dist < maxDist && -1 < index && index < query.length - 1) { // Insert random character in the query transitions.push({ to: getID(query, dist + 1, index), type: "remaining", metadata: { index: nextIndex, type: "insert", }, }); } if (index == -1) { // Match any number of characters before query (including the first character itself) transitions.push({ to: getID(query, dist, index), type: "remaining", metadata: { index: nextIndex, type: "ignore", }, }); transitions.push({ to: getID(query, dist, index), type: "character", character: nextChar, metadata: { index: nextIndex, type: "ignore", }, }); } if (nextIndex == query.length) { if (!exitOnMatch) { // Match any number of characters after query transitions.push({ to: getID(query, dist, index), type: "remaining", metadata: { index: nextIndex, type: "ignore", }, }); } else { // Match any number of characters after query transitions.push({ to: getID(query, 0, -1), type: "empty", metadata: { index: nextIndex, type: "restart", }, }); } } return transitions; } exports.getTransitions = getTransitions; /** * Retrieves the ID for a node with the given data * @param query The query the node is for * @param dist The correctness distance the node is for * @param index The character index matched by the node * @returns THe ID for the node */ function getID(query, dist, index) { return index == -1 ? `start:${dist}` : `${index}:${query.substring(0, index + 1)}-${dist}`; // return `${index}:${dist}`; } exports.getID = getID; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRnV6enlORkFUZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mdXp6eVJhdGUvY3JlYXRlRnV6enlORkFUZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQTs7Ozs7O0dBTUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FDbEMsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLGNBQXVCLEtBQUs7SUFFNUIsTUFBTSxLQUFLLEdBQUcsRUFBZ0UsQ0FBQztJQUUvRSx1QkFBdUI7SUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNQLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsUUFBUSxFQUFFO1lBQ04sT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsQ0FBQztTQUNkO0tBQ0osQ0FBQyxDQUFDO0lBRUgsNEJBQTRCO0lBQzVCLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDUCxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QixPQUFPLEVBQUUsS0FBSztnQkFDZCxXQUFXLEVBQUU7b0JBQ1QsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQztpQkFDOUQ7Z0JB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