int stem()

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;
  }