UNPKG

yoastseo

Version:

Yoast client-side content analysis

120 lines (114 loc) 5.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = determineStem; var _lodash = require("lodash"); var _yoastseo = require("yoastseo"); var _stem = _interopRequireDefault(require("./stem")); var _stemTOrDFromEndOfWord = require("./stemTOrDFromEndOfWord"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const { flattenSortLength, exceptionListHelpers: { checkExceptionListWithTwoStems } } = _yoastseo.languageProcessing; /** * Checks if the word checked is in the list of strong verbs exceptions. If it is, only return the first stem from the stem set. * E.g. stems: help, hielp, geholp -> the stem returned would be "help". * * @param {Object} strongVerbsLists The exception lists of strong verbs. * @param {string} stemmedWord The word to check. * @returns {string} The unique stem. */ const checkStrongVerbExceptionList = function (strongVerbsLists, stemmedWord) { for (const key of Object.keys(strongVerbsLists)) { for (const stemsSet of strongVerbsLists[key]) { const stems = (0, _lodash.flatten)(Object.values(stemsSet)); if (stems.includes(stemmedWord)) { return stems[0]; } } } }; /** * Checks if the word checked is in the list of strong verbs exceptions. Before checking, see if the word has a prefix and delete it if it does. * If the stem after prefix deletion is in the verb exception list, only return the first stem from the stem set and attach back the prefix. * E.g. words to check: verhielp, stem set: help, hielp, geholp -> the stem returned would be "verhelp". * * @param {Object} morphologyDataNL The Dutch morphology data file. * @param {string} stemmedWord The word to check. * * @returns {string} The unique stem. */ const findStemOnVerbExceptionList = function (morphologyDataNL, stemmedWord) { const prefixes = flattenSortLength(morphologyDataNL.pastParticipleStemmer.compoundVerbsPrefixes); // Check whether the inputted stem is started with one of the separable compound prefixes let foundPrefix = prefixes.find(prefix => stemmedWord.startsWith(prefix)); const doNotStemPrefix = morphologyDataNL.stemExceptions.stemmingExceptionsWithMultipleStems.strongAndIrregularVerbs.doNotStemPrefix; const doNotStemPrefixException = doNotStemPrefix.find(exception => stemmedWord.endsWith(exception)); let stemmedWordWithoutPrefix = ""; // Check whether the stemmedWord is in the list of strong verbs starting with be-, ont- or ver- that do not need to be stemmed. if (doNotStemPrefixException) { // Reset foundPrefix so that it won't be attached when the stem is found in the verb exception list. foundPrefix = null; // If the inputted stem is started with one of the separable compound prefixes, the prefix needs to be deleted for now. } else if (foundPrefix) { // Delete the prefix for now. stemmedWordWithoutPrefix = stemmedWord.slice(foundPrefix.length, stemmedWord.length); // At least 3 characters left after prefix deletion so that e.g. "be" is not found in the stem "berg". if (stemmedWordWithoutPrefix.length > 2) { stemmedWord = stemmedWordWithoutPrefix; } else { // Reset foundPrefix so that it won't be attached when the stem is found in the verb exception list. foundPrefix = null; } } const strongVerbExceptions = morphologyDataNL.stemExceptions.stemmingExceptionsWithMultipleStems.strongAndIrregularVerbs.strongVerbStems; // Find stem strong verbs lists. const strongVerbsExceptionLists = [strongVerbExceptions.irregularStrongVerbs, strongVerbExceptions.regularStrongVerbs, strongVerbExceptions.bothRegularAndIrregularStrongVerbs]; for (let i = 0; i < strongVerbsExceptionLists.length; i++) { const checkIfWordIsException = checkStrongVerbExceptionList(strongVerbsExceptionLists[i], stemmedWord); if (checkIfWordIsException) { // If the word checked had a prefix previously, attach it back. if (foundPrefix) { return foundPrefix + checkStrongVerbExceptionList(strongVerbsExceptionLists[i], stemmedWord); } // If the word checked did not have a prefix previously, only return the first stem. return checkStrongVerbExceptionList(strongVerbsExceptionLists[i], stemmedWord); } } }; /** * Return the unique stem for a given Dutch input word. * * @param {string} word The word to be checked. * @param {Object} morphologyDataNL The Dutch data file. * * @returns {string} The unique stem. */ function determineStem(word, morphologyDataNL) { const stemmedWord = (0, _stem.default)(word, morphologyDataNL); // Check whether the stemmed word is on an exception list of words with multiple stems. If it is, return the canonical stem. let stemFromExceptionList = checkExceptionListWithTwoStems(morphologyDataNL.stemExceptions.stemmingExceptionsWithMultipleStems.stemmingExceptionsWithTwoStems, stemmedWord); if (stemFromExceptionList) { return stemFromExceptionList; } stemFromExceptionList = findStemOnVerbExceptionList(morphologyDataNL, stemmedWord); if (stemFromExceptionList) { return stemFromExceptionList; } // If the stemmed word ends in -t or -d, check whether it should be stemmed further, and return the stem with or without the -t/d. const ambiguousEndings = morphologyDataNL.ambiguousTAndDEndings.tAndDEndings; for (const ending of ambiguousEndings) { if (stemmedWord.endsWith(ending)) { const stemmedWordWithoutTOrD = (0, _stemTOrDFromEndOfWord.stemTOrDFromEndOfWord)(morphologyDataNL, stemmedWord, word); if (stemmedWordWithoutTOrD) { return stemmedWordWithoutTOrD; } } } return stemmedWord; } //# sourceMappingURL=determineStem.js.map