German stemming algorithm


 

Links to resources

Snowball main page
The stemmer in Snowball
The ANSI C stemmer
— and its header
Sample German vocabulary
Its stemmed equivalent
Vocabulary + stemmed equivalent in two columns
Tar-gzipped file of all of the above

German stop word list
The stemmer in Snowball — MS DOS Latin I encodings
Germanic language stemmers


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

word stem          word stem
aufeinander
aufeinanderbiss
aufeinanderfolge
aufeinanderfolgen
aufeinanderfolgend
aufeinanderfolgende
aufeinanderfolgenden
aufeinanderfolgender
aufeinanderfolgt
aufeinanderfolgten
aufeinanderschlügen
aufenthalt
aufenthalten
aufenthaltes
auferlegen
auferlegt
auferlegten
auferstand
auferstanden
auferstehen
aufersteht
auferstehung
auferstünde
auferwecken
auferweckt
auferzogen
aufessen
auffa
auffallen
auffallend
auffallenden
auffallender
auffällig
auffälligen
auffälliges
auffassen
auffasst
auffaßt
auffassung
auffassungsvermögen
  =>   aufeinand
aufeinanderbiss
aufeinanderfolg
aufeinanderfolg
aufeinanderfolg
aufeinanderfolg
aufeinanderfolg
aufeinanderfolg
aufeinanderfolgt
aufeinanderfolgt
aufeinanderschlug
aufenthalt
aufenthalt
aufenthalt
auferleg
auferlegt
auferlegt
auferstand
auferstand
aufersteh
aufersteht
aufersteh
auferstund
auferweck
auferweckt
auferzog
aufess
auffa
auffall
auffall
auffall
auffall
auffall
auffall
auffall
auffass
auffasst
auffasst
auffass
auffassungsvermog
kategorie
kategorien
kategorisch
kategorische
kategorischen
kategorischer
kater
katerliede
katern
katers
käthchen
kathedrale
kathinka
katholik
katholische
katholischen
katholischer
kattun
kattunhalstücher
katz
kätzchen
kätzchens
katze
katzen
katzenschmer
katzensprung
katzenwürde
kätzin
kätzlein
katzmann
kauen
kauerte
kauf
kaufe
kaufen
käufer
kauffahrer
kaufherr
kaufleute
käuflich
  =>   kategori
kategori
kategor
kategor
kategor
kategor
kat
katerlied
kat
kat
kathch
kathedral
kathinka
kathol
kathol
kathol
kathol
kattun
kattunhalstuch
katz
katzch
katzch
katz
katz
katzenschm
katzenspr
katzenwurd
katzin
katzlein
katzmann
kau
kauert
kauf
kauf
kauf
kauf
kauffahr
kaufherr
kaufleut
kauflich



 

The stemming algorithm

German includes the following accented forms,
ä   ö   ü
and a special letter, ß, equivalent to double s.

The following letters are vowels:
a   e   i   o   u   y   ä   ö   ü
First, replace ß by ss, and put u and y between vowels into upper case. R1 and R2 are first set up in the standard way (see the note on R1 and R2), but then R1 is adjusted so that the region before it contains at least 3 letters.

Define a valid s-ending as one of b, d, f, g, h, k, l, m, n, r or t.

Define a valid st-ending as the same list, excluding letter r.

Do each of steps 1, 2 and 3.

Step 1:
Search for the longest among the following suffixes,

(a) em   ern   er
(b) e   en   es
(c) s (preceded by a valid s-ending)

and delete if in R1. (Of course the letter of the valid s-ending is not necessarily in R1.) If an ending of group (b) is deleted, and the ending is preceded by niss, delete the final s.

(For example, äckern -> äck, ackers -> acker, armes -> arm, bedürfnissen -> bedürfnis)
Step 2:
Search for the longest among the following suffixes,

(a) en   er   est
(b) st (preceded by a valid st-ending, itself preceded by at least 3 letters)

and delete if in R1.

(For example, derbsten -> derbst by step 1, and derbst -> derb by step 2, since b is a valid st-ending, and is preceded by just 3 letters)
Step 3: d-suffixes (*)
Search for the longest among the following suffixes, and perform the action indicated.

end   ung
delete if in R2
if preceded by ig, delete if in R2 and not preceded by e

ig   ik   isch
delete if in R2 and not preceded by e

lich   heit
delete if in R2
if preceded by er or en, delete if in R1

keit
delete if in R2
if preceded by lich or ig, delete if in R2
Finally,
turn U and Y back into lower case, and remove the umlaut accent from a, o and u.

 

The same algorithm in Snowball


/* Extra rule for -nisse ending added 11 Dec 2009 */ routines ( prelude postlude mark_regions R1 R2 standard_suffix ) externals ( stem ) integers ( p1 p2 x ) groupings ( v s_ending st_ending ) stringescapes {} /* special characters (in ISO Latin I) */ stringdef a" hex 'E4' stringdef o" hex 'F6' stringdef u" hex 'FC' stringdef ss hex 'DF' define v 'aeiouy{a"}{o"}{u"}' define s_ending 'bdfghklmnrt' define st_ending s_ending - 'r' define prelude as ( test repeat ( ( ['{ss}'] <- 'ss' ) or next ) repeat goto ( v [('u'] v <- 'U') or ('y'] v <- 'Y') ) ) define mark_regions as ( $p1 = limit $p2 = limit test(hop 3 setmark x) gopast v gopast non-v setmark p1 try($p1 < x $p1 = x) // at least 3 gopast v gopast non-v setmark p2 ) define postlude as repeat ( [substring] among( 'Y' (<- 'y') 'U' (<- 'u') '{a"}' (<- 'a') '{o"}' (<- 'o') '{u"}' (<- 'u') '' (next) ) ) backwardmode ( define R1 as $p1 <= cursor define R2 as $p2 <= cursor define standard_suffix as ( do ( [substring] R1 among( 'em' 'ern' 'er' ( delete ) 'e' 'en' 'es' ( delete try (['s'] 'nis' delete) ) 's' ( s_ending delete ) ) ) do ( [substring] R1 among( 'en' 'er' 'est' ( delete ) 'st' ( st_ending hop 3 delete ) ) ) do ( [substring] R2 among( 'end' 'ung' ( delete try (['ig'] not 'e' R2 delete) ) 'ig' 'ik' 'isch' ( not 'e' delete ) 'lich' 'heit' ( delete try ( ['er' or 'en'] R1 delete ) ) 'keit' ( delete try ( [substring] R2 among( 'lich' 'ig' ( delete ) ) ) ) ) ) ) ) define stem as ( do prelude do mark_regions backwards do standard_suffix do postlude )