in src/Lucene.Net.Analysis.Common/Analysis/No/NorwegianLightStemmer.cs [98:160]
public virtual 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 && ((StemmerUtil.EndsWith(s, len, "heter") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "heten") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "heita") && useNynorsk))) // general ending (hemmeleg-heita -> hemmeleg) - general ending (hemmelig-heten -> hemmelig) - general ending (hemmelig-heter -> hemmelig)
{
return len - 5;
}
// Remove Nynorsk common endings, single-pass
if (len > 8 && useNynorsk && (StemmerUtil.EndsWith(s, len, "heiter") || StemmerUtil.EndsWith(s, len, "leiken") || StemmerUtil.EndsWith(s, len, "leikar"))) // general ending (trygg-leikar -> trygg) - general ending (trygg-leiken -> trygg) - general ending (hemmeleg-heiter -> hemmeleg)
{
return len - 6;
}
if (len > 5 && (StemmerUtil.EndsWith(s, len, "dom") || (StemmerUtil.EndsWith(s, len, "het") && useBokmaal))) // general ending (hemmelig-het -> hemmelig) - general ending (kristen-dom -> kristen)
{
return len - 3;
}
if (len > 6 && useNynorsk && (StemmerUtil.EndsWith(s, len, "heit") || StemmerUtil.EndsWith(s, len, "semd") || StemmerUtil.EndsWith(s, len, "leik"))) // general ending (trygg-leik -> trygg) - general ending (verk-semd -> verk) - general ending (hemmeleg-heit -> hemmeleg)
{
return len - 4;
}
if (len > 7 && (StemmerUtil.EndsWith(s, len, "elser") || StemmerUtil.EndsWith(s, len, "elsen"))) // general ending (føl-elsen -> føl) - general ending (føl-elser -> føl)
{
return len - 5;
}
if (len > 6 && ((StemmerUtil.EndsWith(s, len, "ende") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "ande") && useNynorsk) || StemmerUtil.EndsWith(s, len, "else") || (StemmerUtil.EndsWith(s, len, "este") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "aste") && useNynorsk) || (StemmerUtil.EndsWith(s, len, "eren") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "aren") && useNynorsk))) // masc - masc - adj (fin-aste -> fin) - adj (fin-este -> fin) - general ending (føl-else -> føl) - (sov-ande -> sov) - (sov-ende -> sov)
{
return len - 4;
}
if (len > 5 && ((StemmerUtil.EndsWith(s, len, "ere") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "are") && useNynorsk) || (StemmerUtil.EndsWith(s, len, "est") && useBokmaal) || (StemmerUtil.EndsWith(s, len, "ast") && useNynorsk) || StemmerUtil.EndsWith(s, len, "ene") || (StemmerUtil.EndsWith(s, len, "ane") && useNynorsk))) // masc pl definite (gut-ane) - masc/fem/neutr pl definite (hus-ene) - adj (fin-ast -> fin) - adj (fin-est -> fin) - adj (fin-are -> fin) - adj (fin-ere -> fin)
{
return len - 3;
}
if (len > 4 && (StemmerUtil.EndsWith(s, len, "er") || StemmerUtil.EndsWith(s, len, "en") || StemmerUtil.EndsWith(s, len, "et") || (StemmerUtil.EndsWith(s, len, "ar") && useNynorsk) || (StemmerUtil.EndsWith(s, len, "st") && useBokmaal) || StemmerUtil.EndsWith(s, len, "te"))) // adj (billig-st -> billig) - masc pl indefinite - neutr definite - masc/fem definite - masc/fem indefinite
{
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;
}