in lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianLightStemmer.java [86:183]
int stem(char[] s, int len) {
// Remove posessive -s (bilens -> bilen) and continue checking
if (len > 4 && s[len - 1] == 's') len--;
// Remove common endings, single-pass
if (len > 7
&& ((endsWith(s, len, "heter") && useBokmaal)
|| // general ending (hemmelig-heter -> hemmelig)
(endsWith(s, len, "heten") && useBokmaal)
|| // general ending (hemmelig-heten -> hemmelig)
(endsWith(s, len, "heita")
&& useNynorsk))) // general ending (hemmeleg-heita -> hemmeleg)
return len - 5;
// Remove Nynorsk common endings, single-pass
if (len > 8
&& useNynorsk
&& (endsWith(s, len, "heiter")
|| // general ending (hemmeleg-heiter -> hemmeleg)
endsWith(s, len, "leiken")
|| // general ending (trygg-leiken -> trygg)
endsWith(s, len, "leikar"))) // general ending (trygg-leikar -> trygg)
return len - 6;
if (len > 5
&& (endsWith(s, len, "dom")
|| // general ending (kristen-dom -> kristen)
(endsWith(s, len, "het") && useBokmaal))) // general ending (hemmelig-het -> hemmelig)
return len - 3;
if (len > 6
&& useNynorsk
&& (endsWith(s, len, "heit")
|| // general ending (hemmeleg-heit -> hemmeleg)
endsWith(s, len, "semd")
|| // general ending (verk-semd -> verk)
endsWith(s, len, "leik"))) // general ending (trygg-leik -> trygg)
return len - 4;
if (len > 7
&& (endsWith(s, len, "elser")
|| // general ending (føl-elser -> føl)
endsWith(s, len, "elsen"))) // general ending (føl-elsen -> føl)
return len - 5;
if (len > 6
&& ((endsWith(s, len, "ende") && useBokmaal)
|| // (sov-ende -> sov)
(endsWith(s, len, "ande") && useNynorsk)
|| // (sov-ande -> sov)
endsWith(s, len, "else")
|| // general ending (føl-else -> føl)
(endsWith(s, len, "este") && useBokmaal)
|| // adj (fin-este -> fin)
(endsWith(s, len, "aste") && useNynorsk)
|| // adj (fin-aste -> fin)
(endsWith(s, len, "eren") && useBokmaal)
|| // masc
(endsWith(s, len, "aren") && useNynorsk))) // masc
return len - 4;
if (len > 5
&& ((endsWith(s, len, "ere") && useBokmaal)
|| // adj (fin-ere -> fin)
(endsWith(s, len, "are") && useNynorsk)
|| // adj (fin-are -> fin)
(endsWith(s, len, "est") && useBokmaal)
|| // adj (fin-est -> fin)
(endsWith(s, len, "ast") && useNynorsk)
|| // adj (fin-ast -> fin)
endsWith(s, len, "ene")
|| // masc/fem/neutr pl definite (hus-ene)
(endsWith(s, len, "ane") && useNynorsk))) // masc pl definite (gut-ane)
return len - 3;
if (len > 4
&& (endsWith(s, len, "er")
|| // masc/fem indefinite
endsWith(s, len, "en")
|| // masc/fem definite
endsWith(s, len, "et")
|| // neutr definite
(endsWith(s, len, "ar") && useNynorsk)
|| // masc pl indefinite
(endsWith(s, len, "st") && useBokmaal)
|| // adj (billig-st -> billig)
endsWith(s, len, "te"))) return len - 2;
if (len > 3)
switch (s[len - 1]) {
case 'a': // fem definite
case 'e': // to get correct stem for nouns ending in -e (kake -> kak, kaker -> kak)
case 'n':
return len - 1;
}
return len;
}