[Zope-Checkins] CVS: Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian - norwegianstem.c:1.1.2.1 output.txt:1.1.2.1 stem.h:1.1.2.1 stem.sbl:1.1.2.1 stemmer.html:1.1.2.1 voc.txt:1.1.2.1

Andreas Jung andreas@digicool.com
Wed, 13 Feb 2002 11:26:24 -0500


Update of /cvs-repository/Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian
In directory cvs.zope.org:/tmp/cvs-serv30556/PyStemmer/norwegian

Added Files:
      Tag: ajung-textindexng-branch
	norwegianstem.c output.txt stem.h stem.sbl stemmer.html 
	voc.txt 
Log Message:
added PyStemmer


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/norwegianstem.c ===

#include "header.h"

extern int norwegian_stem(struct SN_env * z);
static int r_other_suffix(struct SN_env * z);
static int r_consonant_pair(struct SN_env * z);
static int r_main_suffix(struct SN_env * z);
static int r_mark_regions(struct SN_env * z);

static struct among a_0[29] =
{
/*  0 */ { 1, (byte *)"a", -1, 1, 0},
/*  1 */ { 1, (byte *)"e", -1, 1, 0},
/*  2 */ { 3, (byte *)"ede", 1, 1, 0},
/*  3 */ { 4, (byte *)"ande", 1, 1, 0},
/*  4 */ { 4, (byte *)"ende", 1, 1, 0},
/*  5 */ { 3, (byte *)"ane", 1, 1, 0},
/*  6 */ { 3, (byte *)"ene", 1, 1, 0},
/*  7 */ { 6, (byte *)"hetene", 6, 1, 0},
/*  8 */ { 4, (byte *)"erte", 1, 3, 0},
/*  9 */ { 2, (byte *)"en", -1, 1, 0},
/* 10 */ { 5, (byte *)"heten", 9, 1, 0},
/* 11 */ { 2, (byte *)"ar", -1, 1, 0},
/* 12 */ { 2, (byte *)"er", -1, 1, 0},
/* 13 */ { 5, (byte *)"heter", 12, 1, 0},
/* 14 */ { 1, (byte *)"s", -1, 2, 0},
/* 15 */ { 2, (byte *)"as", 14, 1, 0},
/* 16 */ { 2, (byte *)"es", 14, 1, 0},
/* 17 */ { 4, (byte *)"edes", 16, 1, 0},
/* 18 */ { 5, (byte *)"endes", 16, 1, 0},
/* 19 */ { 4, (byte *)"enes", 16, 1, 0},
/* 20 */ { 7, (byte *)"hetenes", 19, 1, 0},
/* 21 */ { 3, (byte *)"ens", 14, 1, 0},
/* 22 */ { 6, (byte *)"hetens", 21, 1, 0},
/* 23 */ { 3, (byte *)"ers", 14, 1, 0},
/* 24 */ { 3, (byte *)"ets", 14, 1, 0},
/* 25 */ { 2, (byte *)"et", -1, 1, 0},
/* 26 */ { 3, (byte *)"het", 25, 1, 0},
/* 27 */ { 3, (byte *)"ert", -1, 3, 0},
/* 28 */ { 3, (byte *)"ast", -1, 1, 0}
};

static struct among a_1[2] =
{
/*  0 */ { 2, (byte *)"dt", -1, -1, 0},
/*  1 */ { 2, (byte *)"vt", -1, -1, 0}
};

static struct among a_2[11] =
{
/*  0 */ { 3, (byte *)"leg", -1, 1, 0},
/*  1 */ { 4, (byte *)"eleg", 0, 1, 0},
/*  2 */ { 2, (byte *)"ig", -1, 1, 0},
/*  3 */ { 3, (byte *)"eig", 2, 1, 0},
/*  4 */ { 3, (byte *)"lig", 2, 1, 0},
/*  5 */ { 4, (byte *)"elig", 4, 1, 0},
/*  6 */ { 3, (byte *)"els", -1, 1, 0},
/*  7 */ { 3, (byte *)"lov", -1, 1, 0},
/*  8 */ { 4, (byte *)"elov", 7, 1, 0},
/*  9 */ { 4, (byte *)"slov", 7, 1, 0},
/* 10 */ { 7, (byte *)"hetslov", 9, 1, 0}
};


static byte g_v[] = { 17, 65, 16, 1, 32, 0, 1, 4 };

static byte g_s_ending[] = { 119, 127, 149, 1 };

static int r_mark_regions(struct SN_env * z) {
    z->I[0] = z->l;
    while(1) { /* goto, line 30 */
        int c = z->c;
        if (!(in_grouping(z, g_v, 97, 155))) goto lab0;
        z->c = c;
        break;
    lab0:
        z->c = c;
        if (z->c >= z->l) return 0;
        z->c++;
    }
    while(1) { /* gopast, line 30 */
        if (!(out_grouping(z, g_v, 97, 155))) goto lab1;
        break;
    lab1:
        if (z->c >= z->l) return 0;
        z->c++;
    }
    z->I[0] = z->c; /* setmark p1, line 30 */
     /* try, line 31 */
    if (!(z->I[0] < 3)) goto lab2;
    z->I[0] = 3;
lab2:
    return 1;
}

static int r_main_suffix(struct SN_env * z) {
    int among_var;
    {   int m = z->l - z->c; /* setlimit, line 37 */
        int m3;
        if (z->c < z->I[0]) return 0;
        z->c = z->I[0]; /* tomark, line 37 */
        m3 = z->lb; z->lb = z->c;
        z->c = z->l - m;
        z->ket = z->c; /* [, line 37 */
        among_var = find_among_b(z, a_0, 29); /* substring, line 37 */
        if (!(among_var)) { z->lb = m3; return 0; }
        z->bra = z->c; /* ], line 37 */
        z->lb = m3;
    }
    switch(among_var) {
        case 0: return 0;
        case 1:
            slice_del(z); /* delete, line 43 */
            break;
        case 2:
            if (!(in_grouping_b(z, g_s_ending, 98, 122))) return 0;
            slice_del(z); /* delete, line 45 */
            break;
        case 3:
            slice_from_s(z, 2, "er"); /* <-, line 47 */
            break;
    }
    return 1;
}

static int r_consonant_pair(struct SN_env * z) {
    {   int m_test = z->l - z->c; /* test, line 52 */
        {   int m = z->l - z->c; /* setlimit, line 53 */
            int m3;
            if (z->c < z->I[0]) return 0;
            z->c = z->I[0]; /* tomark, line 53 */
            m3 = z->lb; z->lb = z->c;
            z->c = z->l - m;
            z->ket = z->c; /* [, line 53 */
            if (!(find_among_b(z, a_1, 2))) { z->lb = m3; return 0; } /* substring, line 53 */
            z->bra = z->c; /* ], line 53 */
            z->lb = m3;
        }
        z->c = z->l - m_test;
    }
    if (z->c <= z->lb) return 0;
    z->c--; /* next, line 58 */
    z->bra = z->c; /* ], line 58 */
    slice_del(z); /* delete, line 58 */
    return 1;
}

static int r_other_suffix(struct SN_env * z) {
    int among_var;
    {   int m = z->l - z->c; /* setlimit, line 62 */
        int m3;
        if (z->c < z->I[0]) return 0;
        z->c = z->I[0]; /* tomark, line 62 */
        m3 = z->lb; z->lb = z->c;
        z->c = z->l - m;
        z->ket = z->c; /* [, line 62 */
        among_var = find_among_b(z, a_2, 11); /* substring, line 62 */
        if (!(among_var)) { z->lb = m3; return 0; }
        z->bra = z->c; /* ], line 62 */
        z->lb = m3;
    }
    switch(among_var) {
        case 0: return 0;
        case 1:
            slice_del(z); /* delete, line 66 */
            break;
    }
    return 1;
}

extern int norwegian_stem(struct SN_env * z) {
    {   int c = z->c; /* do, line 73 */
        if (!r_mark_regions(z)) goto lab0; /* call mark_regions, line 73 */
    lab0:
        z->c = c;
    }
    z->lb = z->c; z->c = z->l; /* backwards, line 74 */

    {   int m = z->l - z->c; /* do, line 75 */
        if (!r_main_suffix(z)) goto lab1; /* call main_suffix, line 75 */
    lab1:
        z->c = z->l - m;
    }
    {   int m = z->l - z->c; /* do, line 76 */
        if (!r_consonant_pair(z)) goto lab2; /* call consonant_pair, line 76 */
    lab2:
        z->c = z->l - m;
    }
    {   int m = z->l - z->c; /* do, line 77 */
        if (!r_other_suffix(z)) goto lab3; /* call other_suffix, line 77 */
    lab3:
        z->c = z->l - m;
    }
    z->c = z->lb;    return 1;
}

extern struct SN_env * norwegian_create_env(void) { return SN_create_env(0, 1, 0); }

extern void norwegian_close_env(struct SN_env * z) { SN_close_env(z); }



=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/output.txt === (20528/20628 lines abridged)
a
aabakk
aabakk
aarbakk
aarum
aas
ab
abitanti
abitazion
ableg›y
absolutt
absorber
ad
adgang
adgang
adkomst
adkomstdokument
adkomstdokument
adkomst
adlyd
adlyd
adm
administrasjon
administrasjon
administrasjonsdepartement
administrasjonskostnad
administrativ
administrativ
administrativ
administrer
administrer
administrer
administrer
adopsjon
adopsjonspeng
adress
adress
adskill
adskilt
advar
advarsel
advart
advokat
advokat
advokatfirma
advokatfullmekt
agd
agent
agentur
aggreger

[-=- -=- -=- 20528 lines omitted -=- -=- -=-]

›sek
›ser
›st
›stfold
›stfoldhavn
›stfoldhavn
›stfr
›sthavn
›sthavn
›stland
›stland
›stlandsfylk
›stlandshavn
›stlandsomr†d
›stlandsomr†d
›stlandsregion
›stlandsregion
›stlandssamarbeid
›st
›st
›stmo
›stov
›str
›stsid
›stsid
›stvend
›ve
›ver
›verst
›vr
›vr
›vr
›vst
›y
›ya
›ydelagd
›ydelagt
›ydelegging
›ydelegging
›ye
›yeblikk
›yeblikk
›yeblikk
›yelokk
›yelokk
›yenvipp
›yet
›yn
›yn
›ystein


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/stem.h ===

extern struct SN_env * norwegian_create_env(void);
extern void norwegian_close_env(struct SN_env * z);

extern int norwegian_stem(struct SN_env * z);



=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/stem.sbl ===
routines (
           mark_regions
           main_suffix
           consonant_pair
           other_suffix
)

externals ( stem )

integers ( p1 )

groupings ( v s_ending )

stringescapes {}

/* special characters (in ISO Latin) */

stringdef ae   hex '91'
stringdef ao   hex '86'
stringdef o/   hex '9B'

define v 'aeiouy{ae}{ao}{o/}'

define s_ending  'bcdfghjklmnoprtvyz'

define mark_regions as (

    $p1 = limit

    goto v gopast non-v  setmark p1
    try ( $p1 < 3  $p1 = 3 )
)

backwardmode (

    define main_suffix as (
        setlimit tomark p1 for ([substring])
        among(

            'a' 'e' 'ede' 'ande' 'ende' 'ane' 'ene' 'hetene' 'en' 'heten' 'ar'
            'er' 'heter' 'as' 'es' 'edes' 'endes' 'enes' 'hetenes' 'ens'
            'hetens' 'ers' 'ets' 'et' 'het' 'ast'
                (delete)
            's'
                (s_ending delete)
            'erte' 'ert'
                (<-'er')
        )
    )

    define consonant_pair as (
        test (
            setlimit tomark p1 for ([substring])
            among(
                'dt' 'vt'
            )
        )
        next] delete
    )

    define other_suffix as (
        setlimit tomark p1 for ([substring])
        among(
            'leg' 'eleg' 'ig' 'eig' 'lig' 'elig' 'els' 'lov' 'elov' 'slov'
            'hetslov'
                (delete)
        )
    )
)

define stem as (

    do mark_regions
    backwards (
        do main_suffix
        do consonant_pair
        do other_suffix
    )
)


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/stemmer.html ===

<HTML>
<HEAD>
<TITLE>Norwegian stemming algorith</TITLE></HEAD>
<BODY BGCOLOR=WHITE>
<TABLE WIDTH=75% ALIGN=CENTER COLS=1>
<H1 ALIGN=CENTER>Norwegian stemming algorithm</H1>

<TR><TD>
<BR>&nbsp;<H2>Links to resources</H2>

<DL><DD><TABLE CELLPADDING=0>
<TR><TD><A HREF="stem.sbl">    The stemmer in Snowball</A>
<TR><TD><A HREF="stem.c">      The ANSI C stemmer</A>
<TR><TD><A HREF="stem.h">      - and its header</A>
<TR><TD><A HREF="voc.txt">     Sample Norwegian vocabulary (ISO Latin codings)</A>
<TR><TD><A HREF="output.txt">  Its stemmed equivalent</A>
<TR><TD><A HREF="diffs.txt">   Vocabulary + stemmed equivalent in pure ASCII</A>
<TR><TD><A HREF="tarball.tgz"> Tar-gzipped file of all of the above</A>
</TABLE></DL>

<DL><DD><TABLE CELLPADDING=0>
<TR><TD><A HREF="../texts/scandinavian.html">
                  Scandinavian language stemmers</A>
</TABLE></DL>

</TR>

<TR><TD BGCOLOR="lightpink">

<BR><BR>

Here is a sample of Norwegian vocabulary, with the stemmed forms that will
be generated with this algorithm.

<BR><BR>



<DL><DD><TABLE CELLPADDING=0>
<TR><TD>  <B>word</B> </TD>
 <TD></TD><TD> </TD>
 <TD></TD><TD> <B>stem</B> </TD>
 <TD></TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
 <TD></TD><TD> <B>word</B> </TD>
 <TD></TD><TD> </TD>
 <TD></TD><TD> <B>stem</B> </TD>
</TR>

<TR><TD>
havnedistrikt<BR>
havnedistriktene<BR>
havnedistrikter<BR>
havnedistriktet<BR>
havnedistriktets<BR>
havnedrift<BR>
havnedriften<BR>
havneeffektivitet<BR>
havneeier<BR>
havneeiere<BR>
havneenheter<BR>
havneforbund<BR>
havneforbundets<BR>
havneform&aring;l<BR>
havneforvaltningen<BR>
havnefunksjonene<BR>
havnefunksjoner<BR>
havnefylkene<BR>
havnefylker<BR>
havnehagen<BR>
havneinfrastrukturen<BR>
havneinnretningene<BR>
havneinnretninger<BR>
havneinteresser<BR>
havnekapasitet<BR>
havnekassa<BR>
havnekasse<BR>
havnekassemidler<BR>
havnekassen<BR>
havnekassene<BR>
havnekassens<BR>
havnelokalisering<BR>
havneloven<BR>
havnelovens<BR>
havnel&oslash;sning<BR>
havnel&oslash;sningene<BR>
havnel&oslash;sninger<BR>
havnemessig<BR>
havnemyndighetene<BR>
havnemyndigheter<BR>
</TD>
<TD></TD><TD> &nbsp;<TT><B> => </B></TT>&nbsp; </TD>
<TD></TD><TD>
havnedistrikt<BR>
havnedistrikt<BR>
havnedistrikt<BR>
havnedistrikt<BR>
havnedistrikt<BR>
havnedrift<BR>
havnedrift<BR>
havneeffektivit<BR>
havneei<BR>
havneeier<BR>
havneen<BR>
havneforbund<BR>
havneforbund<BR>
havneform&aring;l<BR>
havneforvaltning<BR>
havnefunksjon<BR>
havnefunksjon<BR>
havnefylk<BR>
havnefylk<BR>
havnehag<BR>
havneinfrastruktur<BR>
havneinnretning<BR>
havneinnretning<BR>
havneinteress<BR>
havnekapasit<BR>
havnekass<BR>
havnekass<BR>
havnekassemidl<BR>
havnekass<BR>
havnekass<BR>
havnekass<BR>
havnelokalisering<BR>
havn<BR>
havn<BR>
havnel&oslash;sning<BR>
havnel&oslash;sning<BR>
havnel&oslash;sning<BR>
havnemess<BR>
havnemynd<BR>
havnemynd<BR>
</TD>
<TD></TD><TD> </TD>
<TD></TD><TD>
opning<BR>
opninga<BR>
opningsbalanse<BR>
opningsbalansen<BR>
opp<BR>
oppad<BR>
opparbeide<BR>
opparbeidede<BR>
opparbeidelse<BR>
opparbeider<BR>
opparbeides<BR>
opparbeidet<BR>
opparbeiding<BR>
oppattbygging<BR>
oppbevarer<BR>
oppbevaring<BR>
oppbl&aring;st<BR>
oppbl&aring;ste<BR>
oppbrente<BR>
oppbygd<BR>
oppbygde<BR>
oppbygget<BR>
oppbygging<BR>
oppbygginga<BR>
oppbyggingen<BR>
oppdage<BR>
oppdager<BR>
oppdaterte<BR>
oppdeling<BR>
oppdelingen<BR>
oppdelt<BR>
oppdrag<BR>
oppdraget<BR>
oppdragsavtale<BR>
oppdragsgivere<BR>
oppdragstakaren<BR>
oppe<BR>
oppeb&aelig;rer<BR>
oppfarende<BR>
oppfatning<BR>
</TD>
<TD></TD><TD> &nbsp;<TT><B> => </B></TT>&nbsp; </TD>
<TD></TD><TD>
opning<BR>
opning<BR>
opningsbalans<BR>
opningsbalans<BR>
opp<BR>
oppad<BR>
opparbeid<BR>
opparbeid<BR>
opparbeid<BR>
opparbeid<BR>
opparbeid<BR>
opparbeid<BR>
opparbeiding<BR>
oppattbygging<BR>
oppbevar<BR>
oppbevaring<BR>
oppbl&aring;st<BR>
oppbl&aring;st<BR>
oppbrent<BR>
oppbygd<BR>
oppbygd<BR>
oppbygg<BR>
oppbygging<BR>
oppbygging<BR>
oppbygging<BR>
oppdag<BR>
oppdag<BR>
oppdater<BR>
oppdeling<BR>
oppdeling<BR>
oppdelt<BR>
oppdrag<BR>
oppdrag<BR>
oppdragsavtal<BR>
oppdragsgiver<BR>
oppdragstakar<BR>
opp<BR>
oppeb&aelig;r<BR>
oppfar<BR>
oppfatning<BR>
</TD>
</TR>
</TABLE></DL>


</TR>

<TR><TD>

<BR><BR>
<BR>&nbsp;<H2>The stemming algorith</H2>


The Norwegian alphabet includes the following additional letters,
<DL><DD>
    <B><I>&aelig;  &nbsp;  &aring;  &nbsp;  &oslash;</I></B>
</DL>


The following letters are vowels:
<DL><DD>
    <B><I>a  &nbsp;  e  &nbsp;  i  &nbsp;  o  &nbsp;  u  &nbsp;  y  &nbsp;  &aelig;  &nbsp;  &aring;  &nbsp;  &oslash;</I></B>
</DL>
<I>R</I>2 is not used: <I>R</I>1 is defined in the same way as in the
<A HREF="../german/stemmer.html">German stemmer</A>.
(See the <A HREF="../texts/r1r2.html"> note</A> on <I>R</I>1 and <I>R</I>2.)
<BR><BR>
Define a valid <B><I>s</I></B>-ending as one of
<DL><DD>
<B><I>b</I></B>  &nbsp;  <B><I>c</I></B>  &nbsp;  <B><I>d</I></B>  &nbsp;  <B><I>f</I></B>  &nbsp;  <B><I>g</I></B>  &nbsp;  <B><I>h</I></B>  &nbsp;  <B><I>j</I></B>  &nbsp;  <B><I>k</I></B>  &nbsp;
<B><I>l</I></B>  &nbsp;  <B><I>m</I></B>  &nbsp;  <B><I>n</I></B>  &nbsp;  <B><I>o</I></B>  &nbsp;  <B><I>p</I></B>  &nbsp;  <B><I>r</I></B>  &nbsp;  <B><I>t</I></B>  &nbsp;  <B><I>v</I></B>  &nbsp;
<B><I>y</I></B>  &nbsp;  <B><I>z</I></B>
</DL>
Do each of steps 1, 2 and 3.
<BR><BR>
Step 1:
<DL><DD>
    Search for the longest among the following suffixes in <I>R</I>1, and
    perform the action indicated.
<BR><BR><DL>
        <DT>(<I>a</I>)
            <B><I>a  &nbsp;  e  &nbsp;  ede  &nbsp;  ande  &nbsp;  ende  &nbsp;  ane  &nbsp;  ene  &nbsp;  hetene  &nbsp;  en
             &nbsp;  heten  &nbsp;  ar  &nbsp;  er  &nbsp;  heter  &nbsp;  as  &nbsp;  es  &nbsp;  edes  &nbsp;  endes  &nbsp;
            enes  &nbsp;  hetenes  &nbsp;  ens  &nbsp;  hetens  &nbsp;  ers  &nbsp;  ets  &nbsp;  et  &nbsp;  het  &nbsp;
            ast</I></B>
                <DD>delete
<BR><BR>
        <DT>(<I>b</I>)
            <B><I>s</I></B>
                <DD>delete if preceded by a valid <B><I>s</I></B>-ending
<BR><BR>
        <DT>(<I>c</I>)
            <B><I>erte  &nbsp;  ert</I></B>
                <DD>replace with <B><I>ert</I></B>
</DL>
<BR>
    (Of course the letter of the valid <B><I>s</I></B>-ending is
    not necessarily in <I>R</I>1)
</DL>
Step 2:
<DL><DD>
    If the word ends <B><I>dt</I></B> or <B><I>vt</I></B> in <I>R</I>1, delete the <B><I>t</I></B>.
<BR><BR>
    (For example, <I>meldt</I> <TT>-&gt;</TT> <I>meld</I>, <I>operativt</I> <TT>-&gt;</TT> <I>operativ</I>)
</DL>
Step 3:
<DL><DD>
    Search for the longest among the following suffixes in <I>R</I>1, and if found,
    delete.
<BR><BR>
<DL><DD>
    <B><I>leg  &nbsp;  eleg  &nbsp;  ig  &nbsp;  eig  &nbsp;  lig  &nbsp;  elig  &nbsp;  els
     &nbsp;  lov  &nbsp;  elov  &nbsp;  slov  &nbsp;   hetslov</I></B>
</DL>
</DL>

</TR>

<TR><TD BGCOLOR="lightblue">

<BR>&nbsp;<H2>The same algorithm in Snowball</H2>

<FONT SIZE=-1><PRE>
<DL><DD>
routines (
           mark_regions
           main_suffix
           consonant_pair
           other_suffix
)

externals ( stem )

integers ( p1 )

groupings ( v s_ending )

stringescapes {}

/* special characters (in ISO Latin) */

stringdef ae   hex '91'
stringdef ao   hex '86'
stringdef o/   hex '9B'

define v 'aeiouy{ae}{ao}{o/}'

define s_ending  'bcdfghjklmnoprtvyz'

define mark_regions as (

    $p1 = limit

    goto v gopast non-v  setmark p1
    try ( $p1 < 3  $p1 = 3 )
)

backwardmode (

    define main_suffix as (
        setlimit tomark p1 for ([substring])
        among(

            'a' 'e' 'ede' 'ande' 'ende' 'ane' 'ene' 'hetene' 'en' 'heten' 'ar'
            'er' 'heter' 'as' 'es' 'edes' 'endes' 'enes' 'hetenes' 'ens'
            'hetens' 'ers' 'ets' 'et' 'het' 'ast'
                (delete)
            's'
                (s_ending delete)
            'erte' 'ert'
                (<-'er')
        )
    )

    define consonant_pair as (
        test (
            setlimit tomark p1 for ([substring])
            among(
                'dt' 'vt'
            )
        )
        next] delete
    )

    define other_suffix as (
        setlimit tomark p1 for ([substring])
        among(
            'leg' 'eleg' 'ig' 'eig' 'lig' 'elig' 'els' 'lov' 'elov' 'slov'
            'hetslov'
                (delete)
        )
    )
)

define stem as (

    do mark_regions
    backwards (
        do main_suffix
        do consonant_pair
        do other_suffix
    )
)
</DL>
</PRE></FONT>
</TABLE>
</BODY>
</HTML>


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/norwegian/voc.txt === (20528/20628 lines abridged)
a
aabakken
aabakkens
aarbakke
aarum
aase
ab
abitanti
abitazione
ableg›yer
absolutt
absorberes
ad
adgang
adgangen
adkomst
adkomstdokument
adkomstdokumenter
adkomsten
adlyde
adlyder
adm
administrasjon
administrasjonen
administrasjonsdepartementet
administrasjonskostnadene
administrativ
administrative
administrativt
administrere
administrerende
administreres
administrert
adopsjon
adopsjonspenger
adresse
adresser
adskillelse
adskilt
advare
advarselen
advart
advokat
advokatar
advokatfirmaet
advokatfullmektig
agder
agenter
agenturer
aggregeres

[-=- -=- -=- 20528 lines omitted -=- -=- -=-]

›sekar
›ser
›st
›stfold
›stfoldhavnene
›stfoldhavner
›stfra
›sthavn
›sthavna
›stland
›stlandet
›stlandsfylkene
›stlandshavnene
›stlandsomr†der
›stlandsomr†det
›stlandsregionen
›stlandsregionens
›stlandssamarbeidet
›stlig
›stlige
›stmoe
›stover
›stre
›stside
›stsiden
›stvendte
›ve
›ver
›verste
›vre
›vrig
›vrige
›vste
›y
›ya
›ydelagde
›ydelagt
›ydelegging
›ydelegginga
›ye
›yeblikk
›yeblikkelig
›yeblikket
›yelokkene
›yelokket
›yenvipper
›yet
›yne
›ynene
›ystein