UNPKG

talisman

Version:

Straightforward fuzzy matching, information retrieval and NLP building blocks for JavaScript.

89 lines (70 loc) 3.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (word) { // Preparing the word var preparedWord = normalizeLetters(word.toLowerCase().replace(/[^a-z]/g, '')); // Dropping the -que suffix var stem = preparedWord.replace(/que$/, ''); // Checking whether the word ends in -que & is a protected stem if (preparedWord !== stem && QUE_SET.has(preparedWord)) return { noun: preparedWord, verb: preparedWord }; var nounStem = stem, verbStem = stem; // Computing the noun stem for (var i = 0, l = SIMPLE_SUFFIXES.length; i < l; i++) { var newStem = nounStem.replace(SIMPLE_SUFFIXES[i], ''); if (newStem !== stem) { nounStem = newStem; break; } } // Computing the verb stem for (var _i = 0, _l = VERB_SUFFIXES.length; _i < _l; _i++) { var _VERB_SUFFIXES$_i = VERB_SUFFIXES[_i], match = _VERB_SUFFIXES$_i[0], replacement = _VERB_SUFFIXES$_i[1]; if (match.test(verbStem)) { var pattern = new RegExp((replacement ? '(.{2,})' : '') + match.source); verbStem = verbStem.replace(pattern, replacement || ''); break; } } // Returning the stem only if longer than one character return { noun: nounStem.length > 1 ? nounStem : stem, verb: verbStem.length > 1 ? verbStem : stem }; }; /** * Talisman stemmers/latin/schinke * ================================ * * The Schinke stemming algorithm (latin). * * [Reference]: * http://snowball.tartarus.org/otherapps/schinke/intro.html */ /** * Rules. */ var QUE_SET = new Set(['atque', 'quoque', 'neque', 'itaque', 'absque', 'apsque', 'abusque', 'adaeque', 'adusque', 'denique', 'deque', 'susque', 'oblique', 'peraeque', 'plenisque', 'quandoque', 'quisque', 'quaeque', 'cuiusque', 'cuique', 'quemque', 'quamque', 'quaque', 'quique', 'quorumque', 'quarumque', 'quibusque', 'quosque', 'quasque', 'quotusquisque', 'quousque', 'ubique', 'undique', 'usque', 'uterque', 'utique', 'utroque', 'utribique', 'torque', 'coque', 'concoque', 'contorque', 'detorque', 'decoque', 'excoque', 'extorque', 'obtorque', 'optorque', 'retorque', 'recoque', 'attorque', 'incoque', 'intorque', 'praetorque']); var SIMPLE_SUFFIXES = [/ibus$/, /ius$/, /ae$/, /am$/, /as$/, /em$/, /es$/, /ia$/, /is$/, /nt$/, /os$/, /ud$/, /um$/, /us$/, /a$/, /e$/, /i$/, /o$/, /u$/]; var VERB_SUFFIXES = [[/iuntur$/, '$1i'], [/erunt$/, '$1i'], [/untur$/, '$1i'], [/iunt$/, '$1i'], [/unt$/, '$1i'], [/beris$/, '$1bi'], [/bor$/, '$1bi'], [/bo$/, '$1bi'], [/ero$/, '$1eri'], [/mini$/], [/ntur$/], [/stis$/], [/mur$/], [/mus$/], [/ris$/], [/sti$/], [/tis$/], [/tur$/], [/ns$/], [/nt$/], [/ri$/], [/m$/], [/r$/], [/s$/], [/t$/]]; /** * Helpers. */ function normalizeLetters(stem) { return stem.replace(/j/g, 'i').replace(/v/g, 'u'); } /** * Function stemming the given latin word using the Schinke algorithm and * returning a noun stem and a verb stem. * * @param {string} word - The word to stem. * @return {objet} - The resulting stems (noun & verb). */ module.exports = exports['default'];