yoastseo
Version:
Yoast client-side content analysis
152 lines (143 loc) • 6.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateCorrectStemWithTAndDEnding = generateCorrectStemWithTAndDEnding;
var _yoastseo = require("yoastseo");
var _stemModificationHelpers = require("./stemModificationHelpers");
const {
regexHelpers: {
searchAndReplaceWithRegex,
doesWordMatchRegex
},
exceptionListHelpers: {
checkIfWordEndingIsOnExceptionList,
checkIfWordIsOnListThatCanHavePrefix
}
} = _yoastseo.languageProcessing;
/**
* Checks whether the word ends in suffixes -e or -en which are preceded by -t or -d, and the -t/-d is part of the stem.
* If it does, stem the -e/-en. Also checks if after suffix deletion the stemmed word needs modification, and applies it if
* needed. e.g. doden -> dod -> dood
*
* @param {Object} morphologyDataNL The Dutch morphology data file.
* @param {string[]} regexAndReplacement The regex to check and the string replacement that should be made.
* @param {string} word The word to be checked.
*
* @returns {?string} The stem created or null.
*/
const stemWordsWithEOrEnSuffix = function (morphologyDataNL, regexAndReplacement, word) {
if (doesWordMatchRegex(word, regexAndReplacement[0])) {
const stemmedWord = word.replace(new RegExp(regexAndReplacement[0]), regexAndReplacement[1]);
if ((0, _stemModificationHelpers.isVowelDoublingAllowed)(stemmedWord, morphologyDataNL.regularStemmer.stemModifications.exceptionsStemModifications, morphologyDataNL.pastParticipleStemmer.compoundVerbsPrefixes)) {
const replacement = searchAndReplaceWithRegex(stemmedWord, morphologyDataNL.regularStemmer.stemModifications.doubleVowel);
return replacement ? replacement : stemmedWord;
}
return stemmedWord;
}
return null;
};
/**
* Stems words for which we know that -t/-d is the ending of the stem (so the -t/-d is not stemmed). This is done through
* checking lists of words and matching the word with regexes.
*
* @param {string} word The word to check.
* @param {Object} morphologyDataNL The Dutch morphology data.
*
* @returns {?string} The stemmed word, if matched in one of the checks, or null if not matched.
*/
const checkWhetherTOrDIsPartOfStem = function (word, morphologyDataNL) {
const tAndDPartOfStemData = morphologyDataNL.ambiguousTAndDEndings.tOrDArePartOfStem;
/*
* Step 1:
* - If the stem ends in -tte, -tten, -dde or -dden leave the first -t/-d and stem the remaining ending.
* - Example: "katten" (-ten should be stemmed, leaving "kat").
*/
let stemmedWord = searchAndReplaceWithRegex(word, tAndDPartOfStemData.firstTOrDPartOfStem);
if (stemmedWord) {
return stemmedWord;
}
/*
* Step 2:
* 2a)
* - Checks whether the word is in the exception list of verbal forms ending in long vowel + -fden/sden. If so, stems -den off.
* - Example: "hoefden" (-den should be stemmed, leaving "hoef").
* 2b)
* - Check whether the word has the suffix -en preceded by -d, where the -d is part of the stem. If it is, stem only -en.
* - Example: "eenden" (-en should be stemmed, leaving "eend").
*/
if (tAndDPartOfStemData.verbsDenShouldBeStemmed.includes(word)) {
return word.slice(0, -3);
}
if (checkIfWordEndingIsOnExceptionList(word, tAndDPartOfStemData.wordsStemOnlyEnEnding.endingMatch) || checkIfWordIsOnListThatCanHavePrefix(word, tAndDPartOfStemData.wordsStemOnlyEnEnding.verbs, morphologyDataNL.pastParticipleStemmer.compoundVerbsPrefixes) || doesWordMatchRegex(word, tAndDPartOfStemData.denEnding)) {
stemmedWord = word.slice(0, -2);
// Check if the vowel needs to be doubled after deleting suffix -en.
if ((0, _stemModificationHelpers.isVowelDoublingAllowed)(stemmedWord, morphologyDataNL.regularStemmer.stemModifications.exceptionsStemModifications, morphologyDataNL.pastParticipleStemmer.compoundVerbsPrefixes)) {
const replacement = searchAndReplaceWithRegex(stemmedWord, morphologyDataNL.regularStemmer.stemModifications.doubleVowel);
return replacement ? replacement : stemmedWord;
}
return stemmedWord;
}
/*
* Step 3:
* - Checks whether the word matches the regex for words ending in -de with -d being part of the stem. If it is matched,
* only stem the -e.
* - Example: "beenharde" (-e should be stemmed, leaving "beenhard")
*/
const dIsPartOfStemRegex = tAndDPartOfStemData.deEnding;
stemmedWord = stemWordsWithEOrEnSuffix(morphologyDataNL, dIsPartOfStemRegex, word);
if (stemmedWord) {
return stemmedWord;
}
/*
* Step 4:
* - Checks whether the word matches the regex for words ending in -te or -ten with -t being part of the stem. If it is
* matched, only stem the -e/-en.
* - Example: "castraten" (-en should be stemmed, leaving "castraat")
*/
const tIsPartOfStemRegex = tAndDPartOfStemData.teAndTenEndings;
stemmedWord = stemWordsWithEOrEnSuffix(morphologyDataNL, tIsPartOfStemRegex, word);
if (stemmedWord) {
return stemmedWord;
}
return null;
};
/**
* Creates the correct stem for words which end in ambiguous endings -t, -te, -ten, -de, or -den.
*
* @param {Object} morphologyDataNL The Dutch morphology data.
* @param {string} word The word to be checked.
*
* @returns {?string} The stemmed word or null.
*/
function generateCorrectStemWithTAndDEnding(morphologyDataNL, word) {
/*
* Step 1:
* - Check whether the word is in the exception list of words in which -t ending needs to be stemmed. If it is, stem -t.
* - Example: "squasht".
* - This is an exception to one of the rule in step 2.
*/
if (checkIfWordEndingIsOnExceptionList(word, morphologyDataNL.ambiguousTAndDEndings.wordsTShouldBeStemmed)) {
return word.slice(0, -1);
}
/*
* Step 2:
* - Check if word is matched by a regex for a t that shouldn't be stemmed.
* - Example: "boot".
*/
if (doesWordMatchRegex(word, morphologyDataNL.ambiguousTAndDEndings.tOrDArePartOfStem.tEnding)) {
return word;
}
/*
* Step 3:
* - Check whether the word has another suffix that should be stemmed (e.g. -en) preceded by -t or -d which is part of the stem.
* If yes, stem the suffix that should be stemmed and return the stem which ends in -t/-d.
* - Example: "tijden" (only -en should be removed, not -den).
*/
const stemmedWord = checkWhetherTOrDIsPartOfStem(word, morphologyDataNL);
if (stemmedWord) {
return stemmedWord;
}
return null;
}
//# sourceMappingURL=getStemWordsWithTAndDEnding.js.map