[libtext-german-perl] 01/05: [svn-inject] Installing original source of libtext-german-perl

dom at earth.li dom at earth.li
Thu Mar 31 21:23:58 UTC 2016


This is an automated email from the git hooks/post-receive script.

dom pushed a commit to branch master
in repository libtext-german-perl.

commit 620272522ecd75429394c73db03a3e8a1f2c89c6
Author: Dominic Hargreaves <dom at earth.li>
Date:   Tue Feb 26 00:04:39 2008 +0000

    [svn-inject] Installing original source of libtext-german-perl
---
 German.pod                  |  43 +++
 MANIFEST                    |  16 +
 META.yml                    |  10 +
 Makefile.PL                 |  11 +
 README                      |  28 ++
 lib/Text/German.pm          | 103 +++++++
 lib/Text/German/Adjektiv.pm | 103 +++++++
 lib/Text/German/Ausnahme.pm |  73 +++++
 lib/Text/German/Cache.pm    |  84 ++++++
 lib/Text/German/Endung.pm   | 184 ++++++++++++
 lib/Text/German/Regel.pm    | 578 ++++++++++++++++++++++++++++++++++++
 lib/Text/German/Util.pm     |  41 +++
 lib/Text/German/Verb.pm     | 707 ++++++++++++++++++++++++++++++++++++++++++++
 lib/Text/German/Vorsilbe.pm | 105 +++++++
 t/basic.t                   |  51 ++++
 t/cache.t                   |  50 ++++
 16 files changed, 2187 insertions(+)

diff --git a/German.pod b/German.pod
new file mode 100644
index 0000000..dc35e0f
--- /dev/null
+++ b/German.pod
@@ -0,0 +1,43 @@
+#                              -*- Mode: Perl -*- 
+# German.pod -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Tue Jul  2 11:24:15 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:52:51 2005
+# Language        : CPerl
+# Update Count    : 10
+# Status          : Unknown, Use with caution!
+
+=head1 NAME
+
+Text::German - German grundform reduction
+
+=head1 SYNOPSYS
+
+C<use Text::German;>
+
+C<$stem = Text::German::reduce($word)>
+
+=head1 DESCRIPTION
+
+This is a rather incomplete implementaion of work done by Gudrun
+Putze-Meier. I have to confess that I never read her original
+paper. So all credit belongs to her, all bugs are mine. I tried to get
+some insight from an implementation of two students of mine. They
+remain anonymous because their work was the wost piece of code I ever
+saw. My code behaves mostly as their implementation did except it is
+about 75 times faster.
+
+=head1 AUTHOR
+
+Ulrich Pfeifer F<E<lt>pfeifer at wait.deE<gt>>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996 Ulrich Pfeifer. All rights reserved. This program
+is free software; you can redistribute it and/or modify it under the
+same terms as Perl itself.
+
+=head1 CHANGES
+
+0.5: Fixed copyright statement
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..bf99d24
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,16 @@
+German.pod
+MANIFEST
+Makefile.PL
+README
+lib/Text/German.pm
+lib/Text/German/Adjektiv.pm
+lib/Text/German/Ausnahme.pm
+lib/Text/German/Cache.pm
+lib/Text/German/Endung.pm
+lib/Text/German/Regel.pm
+lib/Text/German/Util.pm
+lib/Text/German/Verb.pm
+lib/Text/German/Vorsilbe.pm
+t/basic.t
+t/cache.t
+META.yml                                 Module meta-data (added by MakeMaker)
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..4cc1961
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,10 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         Text-German
+version:      0.06
+version_from: lib/Text/German.pm
+installdirs:  site
+requires:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..bf87fbb
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+    'NAME'	   => 'Text::German',
+    'VERSION_FROM' => 'lib/Text/German.pm',
+    'LIBS'	   => [''],   # e.g., '-lm' 
+    'DEFINE'	   => '',     # e.g., '-DHAVE_SOMETHING' 
+    'INC'	   => '',     # e.g., '-I/usr/include/other' 
+    'dist'         => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
+);
diff --git a/README b/README
new file mode 100644
index 0000000..9e66d1e
--- /dev/null
+++ b/README
@@ -0,0 +1,28 @@
+NAME
+    Text::German - German grundform reduction
+
+SYNOPSYS
+    "use Text::German;"
+
+    "$stem = Text::German::reduce($word)"
+
+DESCRIPTION
+    This is a rather incomplete implementaion of work done by Gudrun
+    Putze-Meier. I have to confess that I never read her original paper. So
+    all credit belongs to her, all bugs are mine. I tried to get some
+    insight from an implementation of two students of mine. They remain
+    anonymous because their work was the wost piece of code I ever saw. My
+    code behaves mostly as their implementation did except it is about 75
+    times faster.
+
+AUTHOR
+    Ulrich Pfeifer <pfeifer at wait.de>
+
+COPYRIGHT
+    Copyright (c) 1996 Ulrich Pfeifer. All rights reserved. This program is
+    free software; you can redistribute it and/or modify it under the same
+    terms as Perl itself.
+
+CHANGES
+    0.5: Fixed copyright statement
+
diff --git a/lib/Text/German.pm b/lib/Text/German.pm
new file mode 100644
index 0000000..a39f831
--- /dev/null
+++ b/lib/Text/German.pm
@@ -0,0 +1,103 @@
+#!/usr/bin/perl
+#                              -*- Mode: Perl -*- 
+# Word.pm -- 
+# ITIID           : $ITI$ $Header $__Header$
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 13:57:42 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 12:17:56 2005
+# Language        : Perl
+# Update Count    : 70
+# Status          : Unknown, Use with caution!
+#
+
+package Text::German;
+
+$VERSION = $VERSION = 0.06;
+use Text::German::Util;
+require Text::German::Adjektiv;
+require Text::German::Ausnahme;
+require Text::German::Endung;
+require Text::German::Regel;
+require Text::German::Verb;
+require Text::German::Vorsilbe;
+require Text::German::Cache;
+
+sub partition {
+    my $word = shift;
+    my $vorsilbe = Text::German::Vorsilbe::max_vorsilbe($word);
+    my $vl       = length($vorsilbe||'');
+    my $endung   = Text::German::Endung::max_endung(substr($word,$vl));
+    my $el       = length($endung||'');
+    my $l        = length($word);
+
+    return ($vorsilbe, substr($word, $vl, $l-$vl-$el), $endung);
+}
+
+sub reduce {
+    my $word        = shift;
+    my $satz_anfang = shift;
+    my @word = partition($word);
+    my @tmp;
+
+    printf "INIT %s\n", join ':', @word if $debug;
+    $word[0] ||= '';
+    $word[2] ||= '';
+
+    my $a = Text::German::Ausnahme::reduce(@word);
+    return($a) if defined $a;
+
+    my $c = wordclass($word, $satz_anfang);
+
+    unless ($c&$FUNNY || $word[2]) {
+      return $word[1];
+    }
+    if ($c & $VERB) {
+	@tmp = Text::German::Verb::reduce(@word);
+	if ($#tmp) {
+	    @word = @tmp;
+	    printf "VERB %s\n", join ':', @word if $debug;
+            return($word[1].'en');
+	}
+    }
+    if ($c & $ADJEKTIV) {
+	@tmp = Text::German::Adjektiv::reduce(@word);
+	if ($#tmp) {
+	    @word = @tmp;
+	    printf "VERB %s\n", join ':', @word if $debug;
+            return($word[1]);
+	}
+    }
+    @tmp = Text::German::Regel::reduce(@word);
+    if ($#tmp) {
+	@word = @tmp;
+	printf "REGEL %s\n", join ':', @word if $debug;
+    }
+    #return join ':', @word;
+    return $word[0].$word[1]; # vorsilbe wieder anhaengen
+}
+
+# Do not use this! 
+my $cache;
+
+sub cache_reduce {
+  unless ($cache) {
+    $cache = Text::German::Cache->new(Verbose  => 0,
+                                      Function => sub {reduce($_[0], 1); },
+                                      Gc       => 1000,
+                                      Hold     => 600,
+                                     );
+  }
+  $cache->get(@_);
+}
+
+# This is a hoax!
+sub stem {
+  my $word        = shift;
+  my $gf          = reduce($word, @_);
+  my @word = partition($gf);
+
+  return $word[1];
+}
+
+1;
diff --git a/lib/Text/German/Adjektiv.pm b/lib/Text/German/Adjektiv.pm
new file mode 100644
index 0000000..181857c
--- /dev/null
+++ b/lib/Text/German/Adjektiv.pm
@@ -0,0 +1,103 @@
+#                              -*- Mode: Perl -*- 
+# Adjektiv.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:42:22 2005
+# Language        : Perl
+# Update Count    : 22
+# Status          : Unknown, Use with caution!
+
+package Text::German::Adjektiv;
+use Text::German::Util;
+
+{
+  local ($_);
+  while (<DATA>) {
+    chomp;
+    ($adjektiv, $key) = split;
+    $ADJEKTIV{$adjektiv} = [split ':', $key];
+  }
+  close DATA;
+}
+
+sub reduce {
+  my($v,$s,$e) = @_;
+  
+  
+  #return undef unless $v.$s.$e =~ /$UMLAUTR/o;
+  while (1) {                   # algorithmus unklar
+    if (defined $ADJECTIV{$s}) {
+      return ($v, $ADJECTIV{$s}->[0], $e);
+    }
+    $s .= substr($e,0,1);
+    last unless $e;
+    $e  = substr($e,1);
+  }
+  return undef;
+}
+
+1;
+__DATA__
+�lt	alt:1
+�rg	arg:1
+�rm	arm:1
+alt	alt:1
+arg	arg:1
+arm	arm:1
+b�ng	bang:0
+bang	bang:0
+bl�ss	bla�:0
+bla�	bla�:0
+d�mm	dumm:1
+dumm	dumm:1
+fr�mm	fromm:0
+fromm	fromm:0
+ges�nd	gesund:0
+gesund	gesund:0
+gl�tt	glatt:0
+glatt	glatt:0
+gr��	gro�:1
+gr�b	grob:1
+gro�	gro�:1
+grob	grob:1
+h�rt	hart:1
+h�ch	hoch:1
+h�h	hoch:1
+hart	hart:1
+hoch	hoch:1
+j�ng	jung:1
+jung	jung:1
+k�lt	kalt:1
+k�rg	karg:0
+k�rz	kurz:1
+kalt	kalt:1
+karg	karg:0
+kl�g	klug:1
+klug	klug:1
+kr�nk	krank:1
+kr�mm	krumm:0
+krank	krank:1
+krumm	krumm:0
+kurz	kurz:1
+l�ng	lang:1
+lang	lang:1
+n�ch	nah:1
+n�h	nah:1
+n�ss	na�:0
+na�	na�:0
+nah	nah:1
+r�t	rot:0
+rot	rot:0
+sch�rf	scharf:1
+scharf	scharf:1
+schm�l	schmal:0
+schmal	schmal:0
+schw�ch	schwach:1
+schw�rz	schwarz:1
+schwach	schwach:1
+schwarz	schwarz:1
+st�rk	stark:1
+stark	stark:1
+w�rm	warm:1
+warm	warm:1
diff --git a/lib/Text/German/Ausnahme.pm b/lib/Text/German/Ausnahme.pm
new file mode 100644
index 0000000..95c299d
--- /dev/null
+++ b/lib/Text/German/Ausnahme.pm
@@ -0,0 +1,73 @@
+#                              -*- Mode: Perl -*- 
+# Ausnahme.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:42:38 2005
+# Language        : Perl
+# Update Count    : 23
+# Status          : Unknown, Use with caution!
+
+package Text::German::Ausnahme;
+
+{
+  local ($_);
+  while (<DATA>) {
+    chomp;
+    ($ausnahme, $key) = split;
+    $AUSNAHME{$ausnahme} = $key;
+  }
+  close DATA;
+}
+
+sub reduce {
+  my($v,$s,$e) = @_;
+  
+  $s = $v.$s;
+  while (1) {                   # algorithmus unklar
+    return $AUSNAHME{$s} if defined $AUSNAHME{$s};
+    last unless $e;
+    $s .= substr($e,0,1);
+    $e = substr($e,1);
+  }
+  return undef;
+}
+
+1;
+__DATA__
+Anzeich	Anzeichen
+Charakter	Charakter
+Daten	Daten
+Denken	Denken
+Eltern	Eltern
+Entwicklungsl�nd	Entwicklungsland
+Frau	Frau
+Gedankeng�ng	Gedankengang
+Geschichte	Geschichte
+Herausgeb	Herausgeber
+Interess	Interesse
+Italien	Italien
+Jahr	Jahr
+L�nd	Land
+Lexika	Lexikon
+Problem	Problem
+Prominentenlexika	Prominentenlexikon
+R�te	Rat
+Rahmen	Rahmen
+Recht	Recht
+Sinn	Sinn
+Ziel	Ziel
+Zigeun	Zigeuner
+Zusammenh�ng	Zusammenhang
+ausgestat	ausstatten
+ausstat	ausstatten
+ber�cksichtig	ber�cksichtigen
+direkt	direkt
+entgegengesetz	entgegensetzen
+entgegensetz	entgegensetzen
+entwickel	entwickeln
+erkannt	erkennen
+hoh	hoch
+kannt	kennen
+kl�r	kl�ren
+widerleg	widerlegen
diff --git a/lib/Text/German/Cache.pm b/lib/Text/German/Cache.pm
new file mode 100644
index 0000000..62d7bb5
--- /dev/null
+++ b/lib/Text/German/Cache.pm
@@ -0,0 +1,84 @@
+#                              -*- Mode: Perl -*- 
+# Cache.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Mon May 13 11:14:06 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:43:04 2005
+# Language        : CPerl
+# Update Count    : 17
+# Status          : Unknown, Use with caution!
+
+package Text::German::Cache;
+
+sub new {
+  my $type = shift;
+  my $self = {};
+  my %para = @_;
+
+  $self->{Function} = $para{Function} || \&Text::German::reduce;
+  $self->{Hold}     = $para{Hold}     || 100;
+  $self->{Gc}       = $para{Gc}       || 2 * $self->{Hold};
+  $self->{Verbose}  = $para{Verbose}  || 0;
+  $self->{Entries}  = 0;
+  $self->{Contents} = {};
+  $self->{Hit}      = {};
+  $self->{Hits}     = 0;
+  $self->{Misses}   = 0;
+  bless $self, ref($type) || $type;
+}
+
+sub get {
+  my $self = shift;
+  my $key  = shift;
+
+  if (defined $self->{Contents}->{$key}) {
+    $self->{Hits}++;
+    $self->{Hit}->{$key}++;
+  } else {
+    $self->{Misses}++;
+    $self->{Entries}++;
+    if ($self->{Entries} >= $self->{Gc}) {
+      $self->gc;
+    }
+    $self->{Contents}->{$key} = &{$self->{Function}}($key);
+  }
+  $self->{Contents}->{$key};
+}
+
+sub gc {
+  my $self = shift;
+  my %rank;
+  my $rank;
+  
+  if ($self->{Verbose}) {
+    printf (STDERR "Cache: enter garbadge collect %d\n", $self->{Entries});
+  }
+  for (keys %{$self->{Contents}}) {
+    push @{$rank{$self->{Hit}->{$_}}}, $_;
+  }
+  for $rank (sort {$a <=> $b} keys %rank) {
+    for (@{$rank{$rank}}) {
+      if ($self->{Verbose}) {
+        printf (STDERR "Cache: deleting $_(%d)\n", $rank+1);
+      }
+       delete $self->{Contents}->{$_};
+       delete $self->{Hit}->{$_};
+       $self->{Entries}--;
+     }
+    # We delete a complete rank. this is more than we must do ..
+    last if $self->{Entries} <= $self->{Hold};
+  }
+  if ($self->{Verbose}) {
+    printf (STDERR "Cache: leave garbadge collect %d\n", $self->{Entries});
+  }
+}
+
+sub DESTROY {
+  my $self = shift;
+
+  if ($self->{Verbose}) {
+    printf (STDERR "\nCache Hits: %d\tMisses: %d\n", $self->{Hits}, $self->{Misses});
+  }
+}
+
+1;
diff --git a/lib/Text/German/Endung.pm b/lib/Text/German/Endung.pm
new file mode 100644
index 0000000..ad0d9b1
--- /dev/null
+++ b/lib/Text/German/Endung.pm
@@ -0,0 +1,184 @@
+#                              -*- Mode: Perl -*- 
+# Endung.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 12:16:20 2005
+# Language        : Perl
+# Update Count    : 45
+# Status          : Unknown, Use with caution!
+
+package Text::German::Endung;
+# require Exporter;
+# @ISA = qw(Exporter);
+# @EXPORT = qw(%ENDUNG);
+
+use Text::German::Util;
+{
+  local ($_);
+  
+  while (<DATA>) {
+    chomp;
+    my ($endung, $key) = split;
+    my ($a,$b,$c,$d) = split ':', $key; # $c, $d nicht verwedet?
+    my $B = Text::German::Util::bit_to_int($b);
+    $ENDUNG{$endung} = [$a,$B,$c,$d];
+  }
+  close DATA;
+}
+
+sub endungen {
+  my $word  = shift;
+  my $class = wordclass($word);
+  my @result;
+  
+  for $i (1 .. length($word)) {
+    my $endung = substr($word, length($word)-$i,$i);
+    if (defined $ENDUNG{$endung} && defined $ENDUNG{$endung}->[1]
+        and ($ENDUNG{$endung}->[1] & $class)) {
+      push @result, $endung;
+    }
+  }
+  @result;
+}
+
+sub max_endung {
+  my $word   = shift;
+  my $class  = wordclass($word);
+  my $result = undef;
+  
+  for $i (1 .. length($word)) {
+    my $endung = substr($word, length($word)-$i,$i);
+    if (defined $ENDUNG{$endung}
+        and ($ENDUNG{$endung}->[1] & $class)) {
+      $result = $endung
+        if !defined($result) || length($endung) > length($result);
+      
+    }
+  }
+  $result;
+}
+
+sub wort_klasse {
+  my $endung = shift;
+  
+  $ENDUNG{$endung}->[1];
+}
+
+sub regel {
+  my $endung = shift;
+  
+  $ENDUNG{$endung}->[0];
+}
+
+1;
+#       regel
+#           wortklassen
+#                     nachfolgeregel
+__DATA__
+e	001:11100:000:000
+em	004:00100:000:000
+en	002:11101:000:010
+end	003:00010:000:011
+ende	037:00010:001:047
+endem	039:00010:004:049
+enden	038:00010:002:048
+ender	040:00010:005:050
+endere	057:00010:092:067
+enderem	059:00010:094:069
+enderen	058:00010:093:068
+enderer	060:00010:095:070
+enderes	061:00010:096:071
+endes	041:00010:007:051
+endste	077:00010:102:087
+endstem	079:00010:104:089
+endsten	078:00010:103:088
+endster	080:00010:105:090
+endstes	081:00010:106:091
+ene	032:00001:001:001
+enem	034:00001:004:004
+enen	033:00001:002:002
+ener	035:00001:005:005
+enere	052:00001:092:092
+enerem	054:00001:094:094
+eneren	053:00001:093:093
+enerer	055:00001:095:095
+eneres	056:00001:096:096
+enes	036:00001:007:007
+enste	072:00001:102:102
+enstem	074:00001:104:104
+ensten	073:00001:103:103
+enster	075:00001:105:105
+enstes	076:00001:106:106
+er	005:10100:000:000
+ere	092:00100:001:001
+erem	094:00100:004:004
+eren	093:00100:002:002
+erer	095:00100:005:005
+eres	096:00100:007:007
+ern	006:10000:000:010
+es	007:10100:000:012
+est	008:00100:000:013
+este	097:00100:001:102
+estem	099:00100:004:104
+esten	098:00100:002:103
+ester	100:00100:005:105
+estes	101:00100:007:106
+et	009:00001:000:014
+ete	042:00001:001:017
+etem	044:00001:004:019
+eten	043:00001:002:018
+eter	045:00001:005:020
+etere	062:00001:092:022
+eterem	064:00001:094:024
+eteren	063:00001:093:023
+eterer	065:00001:095:025
+eteres	066:00001:096:026
+etes	046:00001:007:021
+etste	082:00001:102:102
+etstem	084:00001:104:104
+etsten	083:00001:103:103
+etster	085:00001:105:105
+etstes	086:00001:106:106
+n	010:11000:000:000
+nd	011:00010:000:000
+nde	047:00010:001:001
+ndem	049:00010:004:004
+nden	048:00010:002:002
+nder	050:00010:005:005
+ndere	067:00010:092:092
+nderem	069:00010:094:094
+nderen	068:00010:093:093
+nderer	070:00010:095:095
+nderes	071:00010:096:096
+ndes	051:00010:007:007
+ndste	087:00010:102:102
+ndstem	089:00010:104:104
+ndsten	088:00010:103:103
+ndster	090:00010:105:105
+ndstes	091:00010:106:106
+s	012:10000:000:000
+st	013:01000:000:014
+ste	102:00100:001:017
+stem	104:00100:004:019
+sten	103:00100:002:018
+ster	105:00100:005:020
+stes	106:00100:007:021
+t	014:01001:000:000
+te	017:01001:001:001
+tem	019:00001:004:004
+ten	018:01001:002:002
+ter	020:00001:005:005
+tere	022:00001:092:092
+terem	024:00001:094:094
+teren	023:00001:093:093
+terer	025:00001:095:095
+teres	026:00001:096:096
+tes	021:00001:007:007
+test	015:01000:000:008
+teste	027:00001:097:097
+testem	029:00001:099:099
+testen	028:00001:098:098
+tester	030:00001:100:100
+testes	031:00001:101:101
+tet	016:01000:000:009
diff --git a/lib/Text/German/Regel.pm b/lib/Text/German/Regel.pm
new file mode 100644
index 0000000..65be93f
--- /dev/null
+++ b/lib/Text/German/Regel.pm
@@ -0,0 +1,578 @@
+#                              -*- Mode: Perl -*- 
+# Regel.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 12:11:51 2005
+# Language        : Perl
+# Update Count    : 73
+# Status          : Unknown, Use with caution!
+
+package Text::German::Regel;
+use Text::German::Util;
+
+$debug = 0;
+ at REGEL = ();                    # -w
+
+{
+  local ($_);
+  
+  while (<DATA>) {
+    chomp;
+    my ($regel, $a,$b,$c,$d,$e, at f) = split(/:/, $_);
+    next unless $regel;
+    push(@{$REGEL[$regel]}, [$a,
+                             $b,
+                             $c,
+                             bit_to_int($d),
+                             bit_to_int($e),
+                             @f]);
+  }
+  close DATA;
+}
+sub reduce {
+  my($v,$s,$e) = @_;
+  #my $init = join ':', ($v,$s,$e);
+  #local ($debug) = ($s eq 'Mit')?4:0;
+  
+  return undef if length($s.$e) < 3;
+  while (length($s)<3) {
+    $s .= substr($e,0,1);
+    $e = substr($e,1);
+  }   
+  while (1) {
+    my @tmp = reduce1($v,$s,$e);
+    if ($#tmp) {
+      my $tmp = join ':', @tmp;
+      #print STDERR "$init => $tmp\n";
+      return @tmp;              # if $tmp  ne $init;
+    }
+    return @tmp if !$e;
+    $s .= substr($e,0,1);
+    $e = substr($e,1);
+  }
+}
+
+sub reduce1 {
+  my($v,$s,$e) = @_;
+  my $fc;
+  my $fr;
+  my $did_match;
+  
+  while (1) {
+    $fr = Text::German::Endung::regel($e); # || '001'; # ???
+    last if defined $fr;
+    last unless $e;
+    $s .= substr($e,0,1);
+    $e = substr($e,1);
+  }
+  return undef unless $fr;
+  $fc = Text::German::Endung::wort_klasse($e);
+  
+ ruleset: 
+  while (defined $REGEL[$fr]) {
+    for $r (@{$REGEL[$fr]}) {
+      next unless $r->[4] | $fc; # allowed wordclasses
+      my $match = $r->[5];
+      $match =~ s/\+/[bcdfghjklmnpqrstvwxyz]/;
+      $match =~ s/\%/[aeiou\344\366\374]/;
+      #my $ns = $s.$e;
+      #$ns = substr($ns,0,length($ns)-$r->[1]);
+      #$e  = substr($e, length($e)-$r->[1]);
+      print "\tREGEL: $fr:", (join ':', @{$r}),"\t($s,$match)\n"
+        if $debug > 1;
+      if ($s =~ /$match$/) {
+        $did_match++;
+        print "\tREGEL: $fr:", (join ':', @{$r}),"\t$s => "
+          if $debug;
+        $s = (substr($s,0,length($s)-$r->[7])) if $r->[7];
+        $s .= $r->[8] if $r->[8];
+        print "$s\n" if $debug;
+        if ($r->[6]) {          # vorsilbe 'ge' kann entfallen?
+          $v =~ s/^ge//;
+        }
+        $fr = $r->[0];
+        $fc = $r->[3];          # ???
+        if ($fr ne '000') {
+          next ruleset;
+        } else {
+          #$s = substr($s,0,length($s)-$r->[1]);
+          last;
+        }
+      }
+    }
+    last;
+  }
+  if ($did_match) {
+    return ($v,$s,$e);
+  } else {
+    return undef;
+  }
+}
+
+1;
+
+# regel
+# 0 Folgeregel
+# 1 # zeichen entfernen
+# 2
+# 3 new wc
+# 4 KLASSE fuer match
+# 5 MATCH
+# 6 vorsilbe ge
+# 7 #chars to remove
+# 8 string to append
+# 017:000:2:te:01001:01001:�nn:1:3:ann
+__DATA__
+001:000:1:e:11100:00100:isch:0:0:
+001:000:1:e:11100:10100:icht:0:0:
+001:000:1:e:11100:10100:sch:0:0:
+001:000:1:e:11100:00100:haft:0:0:
+001:000:1:e:11100:00100:lich:0:0:
+001:000:1:e:11100:00100:voll:0:0:
+001:000:1:e:11100:10100:wert:0:0:
+001:000:1:e:11100:10000:bold:0:0:
+001:000:1:e:11100:10000:ling:0:0:
+001:000:1:e:11100:10000:rich:0:0:
+001:000:1:e:11100:10000:werk:0:0:
+001:000:1:e:11100:00100:reich:0:0:
+001:000:1:e:11100:10100:ond:0:0:e
+001:000:1:e:11100:10000:iss:0:1:
+001:000:1:e:11100:00100:abl:0:2:bel
+001:000:1:e:11100:00100:ant:0:0:
+001:000:1:e:11100:00100:ell:0:0:
+001:000:1:e:11100:00100:ent:0:0:
+001:000:1:e:11100:00100:esk:0:0:
+001:000:1:e:11100:00100:ibl:0:2:bel
+001:000:1:e:11100:10100:ff:0:0:
+001:000:1:e:11100:00100:los:0:0:
+001:000:1:e:11100:00100:sam:0:0:
+001:000:1:e:11100:10100:sal:0:0:
+001:000:1:e:11100:01000:ifizier:0:0:en
+001:000:1:e:11100:01000:isier:0:0:en
+001:000:1:e:11100:10100:weis:0:0:e
+001:000:1:e:11100:10000:zeug:0:0:
+001:000:1:e:11100:10100:�r:0:0:
+001:000:1:e:11100:10100:oid:0:0:
+001:000:1:e:11100:00100:�s:0:0:
+001:000:1:e:11100:10000:�l:0:3:al
+001:000:1:e:11100:10000:eur:0:0:
+001:000:1:e:11100:10000:ier:0:0:
+001:000:1:e:11100:10100:ad:0:0:e
+001:000:1:e:11100:10100:od:0:0:e
+001:000:1:e:11100:10100:ud:0:0:e
+001:000:1:e:11100:10100:ed:0:0:
+001:000:1:e:11100:10100:id:0:0:
+001:000:1:e:11100:10100:ig:0:0:
+001:000:1:e:11100:10100:al:0:0:
+001:000:1:e:11100:10100:er:0:0:
+001:000:1:e:11100:00100:ig:0:0:
+001:000:1:e:11100:00100:iv:0:0:
+001:000:1:e:11100:00100:os:0:0:
+001:000:1:e:11100:10000:an:0:0:
+001:000:1:e:11100:10100:ar:0:0:
+001:000:1:e:11100:10000:at:0:0:
+001:000:1:e:11100:10100:%b:0:0:e
+001:000:1:e:11100:10100:c:0:0:e
+001:000:1:e:11100:10000:�ng:0:3:ang
+001:000:1:e:11100:10100:g:0:0:e
+001:000:1:e:11100:10100:f:0:0:e
+001:000:1:e:11100:00100:frei:0:0:
+001:000:1:e:11100:10100:i:0:0:e
+001:000:1:e:11100:10000:ys:0:0:e
+001:000:1:e:11100:10000:st�nd:0:3:and
+001:000:1:e:11100:10000::0:0:e
+002:010:2:en:11101:00100:isch:0:0:
+002:010:2:en:11101:10100:icht:0:0:
+002:010:2:en:11101:10100:schaft:0:0:
+002:010:2:en:11101:00100:haft:0:0:
+002:010:2:en:11101:00100:lich:0:0:
+002:010:2:en:11101:00100:voll:0:0:
+002:010:2:en:11101:10100:wert:0:0:
+002:010:2:en:11101:10000:bold:0:0:
+002:010:2:en:11101:10000:ling:0:0:
+002:010:2:en:11101:10000:niss:0:1:
+002:010:2:en:11101:10000:rich:0:0:
+002:010:2:en:11101:10000:werk:0:0:
+002:010:2:en:11101:00100:reich:0:0:
+002:010:2:en:11101:10000:ism:0:0:us
+002:010:2:en:11101:00100:abl:0:2:bel
+002:010:2:en:11101:10100:ant:0:0:
+002:010:2:en:11101:00100:ell:0:0:
+002:010:2:en:11101:00100:ent:0:0:
+002:010:2:en:11101:00100:esk:0:0:
+002:010:2:en:11101:00100:ibl:0:2:bel
+002:010:2:en:11101:10000:anz:0:0:
+002:010:2:en:11101:10000:enz:0:0:
+002:010:2:en:11101:10000:inn:0:1:
+002:010:2:en:11101:10000:ist:0:0:
+002:010:2:en:11101:10000:ung:0:0:
+002:010:2:en:11101:10100:amm:0:0:
+002:010:2:en:11101:10100:rn:0:0:
+002:010:2:en:11101:10100:mp:0:0:e
+002:010:2:en:11101:10100:tr:0:0:um
+002:010:2:en:11101:10100:los:0:0:
+002:010:2:en:11101:00100:sam:0:0:
+002:010:2:en:11101:10100:sal:0:0:
+002:010:2:en:11101:10000:hem:0:0:a
+002:010:2:en:11101:01000:ifizier:0:0:en
+002:010:2:en:11101:01000:isier:0:0:en
+002:010:2:en:11101:10000:it�t:0:0:
+002:010:2:en:11101:10000:heit:0:0:
+002:010:2:en:11101:10000:keit:0:0:
+002:010:2:en:11101:10000:zeug:0:0:
+002:010:2:en:11101:10100:oid:0:0:
+002:010:2:en:11101:00100:�s:0:0:
+002:010:2:en:11101:10100:�r:0:0:
+002:010:2:en:11101:10000:�l:0:3:al
+002:010:2:en:11101:10100:eur:0:0:
+002:010:2:en:11101:10100:eus:0:0:e
+002:010:2:en:11101:10000:ier:0:0:
+002:010:2:en:11101:01000:ier:0:0:en
+002:010:2:en:11101:10000:ion:0:0:
+002:010:2:en:11101:11100:eid:0:0:en
+002:010:2:en:11101:11100:iem:0:0:en
+002:010:2:en:11101:10100:al:0:0:
+002:010:2:en:11101:10100:er:0:0:
+002:010:2:en:11101:00100:ig:0:0:
+002:010:2:en:11101:00100:iv:0:0:
+002:010:2:en:11101:00100:os:0:0:
+002:010:2:en:11101:10100:ad:0:0:e
+002:010:2:en:11101:10100:an:0:0:
+002:010:2:en:11101:10100:ar:0:0:
+002:010:2:en:11101:10100:at:0:0:
+002:010:2:en:11101:10000:ik:0:0:
+002:010:2:en:11101:10000:or:0:0:
+002:010:2:en:11101:10100:id:0:0:
+002:010:2:en:11101:10100:od:0:0:e
+002:010:2:en:11101:10100:ud:0:0:e
+002:010:2:en:11101:10100:em:0:0:
+002:010:2:en:11101:10100:op:0:0:
+002:010:2:en:11101:10100:ur:0:0:
+002:010:2:en:11101:10000:radi:0:0:us
+002:010:2:en:11101:10000:di:0:0:um
+002:010:2:en:11101:00100:frei:0:0:
+002:010:2:en:11101:10000:ei:0:0:
+002:010:2:en:11101:10100:i:0:0:e
+002:010:2:en:11101:10100:e:0:0:e
+002:010:2:en:11101:10000:ys:0:0:e
+002:010:2:en:11101:10000:wes:0:0:en
+002:010:2:en:11101:10000:Wes:0:0:en
+002:010:2:en:11101:10000:orm:0:0:
+002:010:2:en:11101:10000:�ng:0:3:ang
+003:011:3:end:00010:00010::0:0:en
+004:000:2:em:00100:00100:isch:0:0:
+004:000:2:em:00100:00100:haft:0:0:
+004:000:2:em:00100:00100:lich:0:0:
+004:000:2:em:00100:00100:voll:0:0:
+004:000:2:em:00100:00100:wert:0:0:
+004:000:2:em:00100:00100:reich:0:0:
+004:000:2:em:00100:00100:abl:0:2:bel
+004:000:2:em:00100:00100:ant:0:0:
+004:000:2:em:00100:00100:ell:0:0:
+004:000:2:em:00100:00100:ent:0:0:
+004:000:2:em:00100:00100:esk:0:0:
+004:000:2:em:00100:00100:ibl:0:2:bel
+004:000:2:em:00100:00100:los:0:0:
+004:000:2:em:00100:00100:sam:0:0:
+004:000:2:em:00100:00100:�r:0:0:
+004:000:2:em:00100:00100:oid:0:0:
+004:000:2:em:00100:00100:�s:0:0:
+004:000:2:em:00100:00100:al:0:0:
+004:000:2:em:00100:00100:ar:0:0:
+004:000:2:em:00100:00100:er:0:0:
+004:000:2:em:00100:00100:ig:0:0:
+004:000:2:em:00100:00100:iv:0:0:
+004:000:2:em:00100:00100:os:0:0:
+004:000:2:em:00100:00100:frei:0:0:
+005:000:2:er:10100:00100:isch:0:0:
+005:000:2:er:10100:00100:haft:0:0:
+005:000:2:er:10100:00100:lich:0:0:
+005:000:2:er:10100:00100:voll:0:0:
+005:000:2:er:10100:00100:wert:0:0:
+005:000:2:er:10100:00100:reich:0:0:
+005:000:2:er:10100:00100:abl:0:2:bel
+005:000:2:er:10100:00100:ant:0:0:
+005:000:2:er:10100:00100:ell:0:0:
+005:000:2:er:10100:00100:ent:0:0:
+005:000:2:er:10100:00100:esk:0:0:
+005:000:2:er:10100:00100:ibl:0:2:bel
+005:000:2:er:10100:00100:los:0:0:
+005:000:2:er:10100:00100:sam:0:0:
+005:000:2:er:10100:00100:�r:0:0:
+005:000:2:er:10100:00100:oid:0:0:
+005:000:2:er:10100:00100:�s:0:0:
+005:000:2:er:10100:00100:al:0:0:
+005:000:2:er:10100:00100:ar:0:0:
+005:000:2:er:10100:00100:ig:0:0:
+005:000:2:er:10100:00100:iv:0:0:
+005:000:2:er:00100:00100:os:0:0:
+005:000:2:er:00100:00100:frei:0:0:
+005:000:2:er:00100:10000:ust:0:0:er
+006:010:3:ern:10000:10000::0:0:
+007:012:2:es:10100:10100:niss:0:1:
+007:012:2:es:10100:10100:abl:0:2:bel
+007:012:2:es:10100:10100:ibl:0:2:bel
+007:012:2:es:10100:10100:cod:0:0:es
+007:012:2:es:10100:10100:mod:0:0:es
+007:012:2:es:10100:10100:iz:0:2:ex
+007:012:2:es:10100:10100:ei:0:0:
+007:012:2:es:10100:10100:i:0:0:es
+007:012:2:es:10100:10100::0:0:
+008:013:3:est:00100:00100:cht:0:0:en
+008:013:3:est:00100:00100:haft:0:0:
+008:013:3:est:00100:00100:wert:0:0:
+008:013:3:est:00100:00100:ant:0:0:
+008:013:3:est:00100:00100:ent:0:0:
+008:013:3:est:00100:00100:los:0:0:
+008:013:3:est:00100:00100:oid:0:0:
+008:013:3:est:00100:00100:�s:0:0:
+008:013:3:est:00100:00100:os:0:0:
+008:013:3:est:00100:00100:n:0:0:en
+008:013:3:est:00100:00100:frei:0:0:
+009:014:2:et:00001:00001:cht:1:0:en
+009:014:2:et:00001:00001:magn:0:0:et
+009:014:2:et:00001:00001:n:1:0:en
+009:014:2:et:00001:00001:eit:1:0:en
+010:000:1:n:11000:10000:enser:0:0:
+010:000:1:n:11000:10000:aner:0:0:
+010:000:1:n:11000:10000:iker:0:0:
+010:000:1:n:11000:10000:iner:0:0:
+010:000:1:n:11000:10000:ler:0:0:
+010:000:1:n:11000:10000:ner:0:0:
+010:000:1:n:11000:10000:el:0:0:
+010:000:1:n:11000:10000:er:0:0:
+010:000:1:n:11000:01000:el:0:0:n
+010:000:1:n:11000:01000:er:0:0:n
+010:000:1:n:11000:10000:io:0:0:n
+010:000:1:n:11000:10000::0:0:
+
+011:000:2:nd:00010:00010::0:0:nd
+012:000:1:s:10000:10000:wach:0:0:s
+012:000:1:s:10000:10000:llap:0:0:s
+012:000:1:s:10000:10000:pul:0:0:s
+012:000:1:s:10000:10000:seit:0:0:s
+012:000:1:s:10000:10000:s:0:0:s
+012:000:1:s:10000:10000:gla:0:0:s
+012:000:1:s:10000:10000:ga:0:0:s
+012:000:1:s:10000:10000:lo:0:0:s
+012:000:1:s:10000:10000:�:0:0:s
+012:000:1:s:10000:10000:au:0:0:
+012:000:1:s:10000:10000:i:0:0:s
+012:000:1:s:10000:10000:u:0:0:s
+012:000:1:s:10000:10000::0:0:
+013:014:2:st:01000:01000:isch:0:0:
+013:014:2:st:01000:01000:lich:0:0:
+013:014:2:st:01000:01000:voll:0:0:
+013:014:2:st:01000:01000:reich:0:0:
+013:014:2:st:01000:01000:ell:0:0:
+013:014:2:st:01000:01000:esk:0:0:
+013:014:2:st:01000:01000:abel:0:0:
+013:014:2:st:01000:01000:ibel:0:0:
+013:014:2:st:01000:01000:sam:0:0:
+013:014:2:st:01000:01000:�r:0:0:
+013:014:2:st:01000:01000:ier:0:0:en
+013:014:2:st:01000:01000:al:0:0:
+013:014:2:st:01000:01000:er:0:0:
+013:014:2:st:01000:01000:ig:0:0:
+013:014:2:st:01000:01000:iv:0:0:
+013:014:2:st:01000:01000:el:0:0:en
+013:014:2:st:01000:01000:er:0:0:en
+014:000:1:t:01001:01001:haf:0:0:t
+014:000:1:t:01001:01001:wer:0:0:t
+014:000:1:t:01001:01001:ier:1:0:en
+014:000:1:t:01001:01001:en:0:0:t
+014:000:1:t:01001:01001:an:0:0:t
+014:000:1:t:01001:01001:er:1:0:n
+014:000:1:t:01001:01001:el:1:0:n
+014:000:1:t:01001:01001:ig:1:0:en
+014:000:1:t:01001:01001:t:0:0:t
+014:000:1:t:01001:01001:%:0:0:t
+014:000:1:t:01001:01001::1:0:en
+015:008:4:test:01000:01000:ier:0:0:en
+015:008:4:test:01000:01000:er:0:0:n
+015:008:4:test:01000:01000:el:0:0:n
+015:008:4:test:01000:01000:ig:0:0:en
+015:008:4:test:01000:01000:s:0:0:en
+015:008:4:test:01000:01000:+me:0:0:n
+015:008:4:test:01000:01000:+ne:0:0:n
+015:008:4:test:01000:01000:te:0:0:n
+015:008:4:test:01000:01000:de:0:0:n
+016:009:3:tet:01000:01000:ier:0:0:en
+016:009:3:tet:01000:01000:er:0:0:n
+016:009:3:tet:01000:01000:el:0:0:n
+016:009:3:tet:01000:01000:ig:0:0:en
+016:009:3:tet:01000:01000:s:0:0:en
+016:009:3:tet:01000:01000:+me:0:0:n
+016:009:3:tet:01000:01000:+ne:0:0:n
+016:009:3:tet:01000:01000:te:0:0:n
+016:009:3:tet:01000:01000:de:0:0:n
+017:001:2:te:01001:01001:ier:1:0:en
+017:001:2:te:01001:01001:er:1:0:n
+017:001:2:te:01001:01001:el:1:0:n
+017:001:2:te:01001:01001:ig:1:0:en
+018:002:3:ten:01001:01001:ier:1:0:en
+018:002:3:ten:01001:01001:%er:1:0:en
+018:002:3:ten:01001:01001:er:1:0:n
+018:002:3:ten:01001:01001:el:1:0:n
+018:002:3:ten:01001:01001:%g:1:0:en
+018:002:3:ten:01001:01001:ei:0:0:ten
+018:002:3:ten:01001:01001:i:1:0:t
+019:004:3:tem:00001:00001:wer:0:0:t
+019:004:3:tem:00001:00001:haf:0:0:t
+019:004:3:tem:00001:00001:en:0:0:t
+019:004:3:tem:00001:00001:an:0:0:t
+019:004:3:tem:00001:00001::1:0:en
+020:005:3:ter:00001:00001::1:0:en
+021:007:3:tes:00001:00001::1:0:en
+022:092:4:tere:00001:00001::1:0:en
+023:093:5:teren:00001:00001::1:0:en
+024:094:5:terem:00001:00001::1:0:en
+025:095:5:terer:00001:00001::1:0:en
+026:096:5:teres:00001:00001::1:0:en
+027:097:5:teste:00001:00001::1:0:en
+028:098:6:testen:00001:00001::1:0:en
+029:099:6:testem:00001:00001::1:0:en
+030:100:6:tester:00001:00001::1:0:en
+031:101:6:testes:00001:00001::1:0:en
+032:001:3:ene:00001: : : : : 
+033:002:4:enen:00001: : : : : 
+034:004:4:enem:00001: : : : : 
+035:005:4:ener:00001: : : : : 
+036:007:4:enes:00001: : : : : 
+037:047:4:ende:00010:00010::0:0:end
+038:048:5:enden:00010:00010::0:0:end
+039:049:5:endem:00010:00010::0:0:end
+040:050:5:ender:00010:00010::0:0:end
+041:051:5:endes:00010:00010::0:0:en
+042:017:3:ete:00001:00001:+m:1:0:en
+042:017:3:ete:00001:00001:+n:1:0:en
+042:017:3:ete:00001:00001:t:1:0:en
+042:017:3:ete:00001:00001:d:1:0:en
+043:018:4:eten:00001:00001:+m:1:0:en
+043:018:4:eten:00001:00001:+n:1:0:en
+043:018:4:eten:00001:00001:t:1:0:en
+043:018:4:eten:00001:00001:d:1:0:en
+043:018:4:eten:00001:00001:a:0:0:et
+043:018:4:eten:00001:00001:i:0:0:eten
+044:019:4:etem:00001:00001:+m:1:0:en
+044:019:4:etem:00001:00001:+n:1:0:en
+044:019:4:etem:00001:00001:t:1:0:en
+044:019:4:etem:00001:00001:d:1:0:en
+045:020:4:eter:00001:00001:+m:1:0:en
+045:020:4:eter:00001:00001:+n:1:0:en
+045:020:4:eter:00001:00001:t:1:0:en
+045:020:4:eter:00001:00001:d:1:0:en
+046:021:4:etes:00001:00001:+m:1:0:en
+046:021:4:etes:00001:00001:+n:1:0:en
+046:021:4:etes:00001:00001:t:1:0:en
+046:021:4:etes:00001:00001:d:1:0:en
+047:001:3:nde:00010:00010:r:0:0:nd
+047:001:3:nde:00010:00010:l:0:0:nd
+048:002:4:nden:00010:00010:r:0:0:nd
+048:002:4:nden:00010:00010:l:0:0:nd
+049:004:4:ndem:00010:00010:r:0:0:nd
+049:004:4:ndem:00010:00010:l:0:0:nd
+050:005:4:nder:00010:00010:r:0:0:nd
+050:005:4:nder:00010:00010:l:0:0:nd
+051:007:4:ndes:00010:00010:r:0:0:nd
+051:007:4:ndes:00010:00010:l:0:0:nd
+052:092:5:enere:00001: : : : : 
+053:093:6:eneren:00001: : : : : 
+054:094:6:enerem:00001: : : : : 
+055:095:6:enerer:00001: : : : : 
+056:096:6:eneres:00001: : : : : 
+057:067:6:endere:00010:00010::0:0:end
+058:068:7:enderen:00010:00010::0:0:end
+059:069:7:enderem:00010:00010::0:0:end
+060:070:7:enderer:00010:00010::0:0:end
+061:071:7:enderes:00010:00010::0:0:end
+062:022:5:etere:00001:00001:+m:1:0:en
+062:022:5:etere:00001:00001:+n:1:0:en
+062:022:5:etere:00001:00001:t:1:0:en
+062:022:5:etere:00001:00001:d:1:0:en
+063:023:6:eteren:00001:00001:+m:1:0:en
+063:023:6:eteren:00001:00001:+n:1:0:en
+063:023:6:eteren:00001:00001:t:1:0:en
+063:023:6:eteren:00001:00001:d:1:0:en
+064:024:6:eterem:00001:00001:+m:1:0:en
+064:024:6:eterem:00001:00001:+n:1:0:en
+064:024:6:eterem:00001:00001:t:1:0:en
+064:024:6:eterem:00001:00001:d:1:0:en
+065:025:6:eterer:00001:00001:+m:1:0:en
+065:025:6:eterer:00001:00001:+n:1:0:en
+065:025:6:eterer:00001:00001:t:1:0:en
+065:025:6:eterer:00001:00001:d:1:0:en
+066:026:6:eteres:00001:00001:+m:1:0:en
+066:026:6:eteres:00001:00001:+n:1:0:en
+066:026:6:eteres:00001:00001:t:1:0:en
+066:026:6:eteres:00001:00001:d:1:0:en
+067:092:5:ndere:00010:00010:r:0:0:nd
+067:092:5:ndere:00010:00010:l:0:0:nd
+068:093:6:nderen:00010:00010:r:0:0:nd
+068:093:6:nderen:00010:00010:l:0:0:nd
+069:094:6:nderem:00010:00010:r:0:0:nd
+069:094:6:nderem:00010:00010:l:0:0:nd
+070:095:6:nderer:00010:00010:r:0:0:nd
+070:095:6:nderer:00010:00010:l:0:0:nd
+071:096:6:nderes:00010:00010:r:0:0:nd
+071:096:6:nderes:00010:00010:l:0:0:nd
+072:102:5:enste:00001: : : : : 
+073:103:6:ensten:00001: : : : : 
+074:104:6:enstem:00001: : : : : 
+075:105:6:enster:00001: : : : : 
+076:106:6:enstes:00001: : : : : 
+077:087:6:endste:00010:00010::0:0:end
+078:088:7:endsten:00010:00010::0:0:end
+079:079:7:endstem:00010:00010::0:0:end
+080:090:7:endster:00010:00010::0:0:end
+081:091:7:endstes:00010:00010::0:0:end
+082:102:5:etste:00001:00001:+m:1:0:en
+082:102:5:etste:00001:00001:+n:1:0:en
+082:102:5:etste:00001:00001:t:1:0:en
+082:102:5:etste:00001:00001:d:1:0:en
+083:103:6:etsten:00001:00001:+m:1:0:en
+083:103:6:etsten:00001:00001:+n:1:0:en
+083:103:6:etsten:00001:00001:t:1:0:en
+083:103:6:etsten:00001:00001:d:1:0:en
+084:104:6:etstem:00001:00001:+m:1:0:en
+084:104:6:etstem:00001:00001:+n:1:0:en
+084:104:6:etstem:00001:00001:t:1:0:en
+084:104:6:etstem:00001:00001:d:1:0:en
+085:105:6:etster:00001:00001:+m:1:0:en
+085:105:6:etster:00001:00001:+n:1:0:en
+085:105:6:etster:00001:00001:t:1:0:en
+085:105:6:etster:00001:00001:d:1:0:en
+086:106:6:etstes:00001:00001:+m:1:0:en
+086:106:6:etstes:00001:00001:+n:1:0:en
+086:106:6:etstes:00001:00001:t:1:0:en
+086:106:6:etstes:00001:00001:d:1:0:en
+087:102:5:ndste:00010:00010:r:0:0:nd
+087:102:5:ndste:00010:00010:l:0:0:nd
+088:103:6:ndsten:00010:00010:r:0:0:nd
+088:103:6:ndsten:00010:00010:l:0:0:nd
+089:104:6:ndstem:00010:00010:r:0:0:nd
+089:104:6:ndstem:00010:00010:l:0:0:nd
+090:105:6:ndster:00010:00010:r:0:0:nd
+090:105:6:ndster:00010:00010:l:0:0:nd
+091:106:6:ndstes:00010:00010:r:0:0:nd
+091:106:6:ndstes:00010:00010:l:0:0:nd
+092:001:3:ere:00100:00100:e:0:0:er
+092:001:3:ere:00100:00100::0:0:
+093:002:4:eren:00100:00100:i:0:0:eren
+093:002:4:eren:00100:00100::0:0:
+094:004:4:erem:00100:00100::0:0:
+095:005:4:erer:00100:00100::0:0:
+096:007:4:eres:00100:00100::0:0:
+097:102:4:este:00100:00100::0:0:
+098:103:5:esten:00100:00100::0:0:
+099:104:5:estem:00100:00100:f:0:0:est
+099:104:5:estem:00100:00100::0:0:
+100:005:5:ester:00100:00100::0:0:
+101:106:5:estes:00100:00100::0:0:
+102:017:3:ste:00100:00100::0:0:
+103:018:4:sten:00100:00100::0:0:
+104:019:4:stem:00100:00100:y:0:0:stem
+104:019:4:stem:00100:00100::0:0:
+105:020:4:ster:00100:00100::0:0:
+106:021:4:stes:00100:00100::0:0:
diff --git a/lib/Text/German/Util.pm b/lib/Text/German/Util.pm
new file mode 100644
index 0000000..fbba3c8
--- /dev/null
+++ b/lib/Text/German/Util.pm
@@ -0,0 +1,41 @@
+#                              -*- Mode: Perl -*- 
+# Util.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 16:08:41 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:44:12 2005
+# Language        : Perl
+# Update Count    : 8
+# Status          : Unknown, Use with caution!
+
+package Text::German::Util;
+require Exporter;
+ at ISA = qw(Exporter);
+ at EXPORT = qw(bit_to_int wordclass $CAPITAL $LOWER $ADJEKTIV $UMLAUTR 
+	     $VERB $FUNNY $ADJEKTIV $ANY);
+
+sub bit_to_int {
+    my $bitvec = shift;
+
+    unpack('I', pack('b*', $bitvec)."\0\0\0\0");
+}
+
+$CAPITAL  = bit_to_int('10000');
+$LOWER    = bit_to_int('01111');
+$ADJEKTIV = bit_to_int('00100');
+$VERB     = bit_to_int('01000');
+$FUNNY    = bit_to_int('01001');
+$ANY      = bit_to_int('11111');
+$UMLAUTR  = "[���]";
+
+sub wordclass {
+  my ($word, $satz_anfang) = @_;
+  
+  if ($satz_anfang) {
+    return $ANY;
+  } elsif ($word =~ /^[A-Z���]/) {
+    $CAPITAL;
+  } else {
+    $LOWER;
+  }
+}
diff --git a/lib/Text/German/Verb.pm b/lib/Text/German/Verb.pm
new file mode 100644
index 0000000..71ff7c9
--- /dev/null
+++ b/lib/Text/German/Verb.pm
@@ -0,0 +1,707 @@
+#                              -*- Mode: Perl -*- 
+# Verb.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:44:28 2005
+# Language        : Perl
+# Update Count    : 29
+# Status          : Unknown, Use with caution!
+
+package Text::German::Verb;
+require Exporter;
+ at ISA = qw(Exporter);
+ at EXPORT = qw(%VERB);
+
+{
+  local ($_);
+  
+  while (<DATA>) {
+    chomp;
+    ($verb, $key) = split;
+    $VERB{$verb} = [split ':', $key];
+  }
+  close DATA;
+}
+
+sub reduce {
+    my($v,$s,$e) = @_;
+    my $ge = ($v.$s =~ /^ge/)?'ge':'';
+    
+    while (1) {		# algorithmus unklar
+	#print "reduce: $s\n";
+	if (defined $VERB{$s}) {
+	    if ($VERB{$s}->[1]) { # 'ge' gehoert zum stamm 
+		my $vg = $v;
+		$vg =~ s/^ge//;
+		return ($vg, $ge.$VERB{$s}->[0], $e);
+	    } else {
+		return ($v, $VERB{$s}->[0], $e);
+	    }
+	}
+	last unless $e;
+	$s .= substr($e,0,1);
+	$e  = substr($e,1);
+    }
+    return undef;
+}
+
+1;
+# stamm ersatz:ge gehoert zum wort
+# f�hr	fahr:0
+__DATA__
+��	ess:0
+a�	ess:0
+b�ck	back:0
+b�nd	bind:0
+b�r	b�r:1
+b�rg	berg:0
+b�t	bitt:0
+b�g	bieg:0
+b�t	biet:0
+b�k	back:0
+back	back:0
+band	bind:0
+bar	berst:0
+barg	berg:0
+bat	bitt:0
+bei�	bei�:0
+ber	berst:0
+berg	berg:0
+berst	berst:0
+bet	bitt:0
+bi�	bei�:0
+bieg	bieg:0
+bier	b�r:1
+biet	biet:0
+bind	bind:0
+bir	berst:0
+birg	berg:0
+biss	bei�:0
+bitt	bitt:0
+bl�	blas:0
+blas	blas:0
+bleib	bleib:0
+bleich	bleich:0
+blich	bleich:0
+blieb	bleib:0
+blies	blas:0
+bog	bieg:0
+bor	berst:0
+borg	berg:0
+bot	biet:0
+br�	brat:0
+br�ch	bring:0
+br�t	brat:0
+brach	bring:0
+brann	brenn:0
+brat	brat:0
+brech	brech:0
+brenn	brenn:0
+brich	brech:0
+briet	brat:0
+bring	bring:0
+broch	brech:0
+buk	back:0
+bund	bind:0
+d�ch	denk:0
+d�ng	ding:0
+d�nk	d�nk:0
+d�rb	derb:0
+d�rf	d�rf:0
+dach	denk:0
+dang	ding:0
+darb	derb:0
+darf	d�rf:0
+deih	deih:1
+denk	denk:0
+derb	derb:0
+deuch	d�nk:0
+dieh	deih:1
+ding	ding:0
+dirb	derb:0
+dorb	derb:0
+dr�ng	dring:0
+dr�sch	dresch:0
+dr�sch	dresch:0
+dr�ss	drie�:0
+drang	dring:0
+drasch	dresch:0
+dresch	dresch:0
+drie�	drie�:0
+dring	dring:0
+drisch	dresch:0
+dro�	drie�:0
+drosch	dresch:0
+dross	drie�:0
+drung	dring:0
+dung	ding:0
+durf	d�rf:0
+ess	ess:0
+f�hl	fehl:0
+f�hr	fahr:0
+f�ll	fall:0
+f�nd	find:0
+f�ng	fang:0
+f�ch	fecht:0
+f�hl	fehl:0
+f�hr	f�hr:0
+fahl	fehl:0
+fahr	fahr:0
+fall	fall:0
+fand	find:0
+fang	fang:0
+fech	fecht:0
+fecht	fecht:0
+fehl	fehl:0
+fich	fecht:0
+fiehl	fehl:0
+fiel	fall:0
+find	find:0
+fing	fang:0
+fl�ch	flecht:0
+fl�g	flieg:0
+fl�h	flieh:0
+fl�ss	fliess:0
+flech	flecht:0
+flecht	flecht:0
+flei�	flei�:0
+fli�	flei�:0
+flich	flecht:0
+flicht	flecht:0
+flieg	flieg:0
+flieh	flieh:0
+fliess	fliess:0
+fliss	flei�:0
+flo�	fliess:0
+floch	flecht:0
+flog	flieg:0
+floh	flieh:0
+floss	fliess:0
+foch	fecht:0
+fohl	fehl:0
+fr��	fress:0
+fr�g	frag:0
+fr�r	frier:0
+fra�	fress:0
+frag	frag:0
+fress	fress:0
+fri�	fress:0
+frier	frier:0
+fror	frier:0
+frug	frag:0
+fuhr	fahr:0
+fund	find:0
+g��	gess:0
+g�b	geb:0
+g�l	gelt:0
+g�nn	ginn:0
+g�r	g�r:0
+g�l	gelt:0
+g�nn	ginn:0
+g�r	g�r:0
+g�ss	gie�:0
+ga�	gess:0
+gab	geb:0
+gal	gelt:0
+gang	geh:0
+gann	ginn:0
+geb	geb:0
+geh	geh:0
+gelt	gelt:0
+gess	gess:0
+gi�	gess:0
+gib	geb:0
+gie�	gie�:0
+gil	gelt:0
+gilt	gelt:0
+ging	geh:0
+ginn	ginn:0
+gl�mm	glimm:0
+gleich	gleich:0
+gleit	gleit:0
+glich	gleich:0
+glimm	glimm:0
+glitt	gleit:0
+glomm	glimm:0
+go�	gie�:0
+gol	gelt:0
+gonn	ginn:0
+gor	g�r:0
+goss	gie�:0
+gr�b	grab:0
+gr�b	grab:0
+grab	grab:0
+greif	greif:0
+griff	greif:0
+grub	grab:0
+h�l	halt:0
+h�lf	helf:0
+h�lt	halt:0
+h�ng	h�ng:0
+h�tt	hab:0
+h�b	heb:0
+h�b	heb:0
+h�lf	helf:0
+ha	hab:0
+hab	hab:0
+hal	halt:0
+half	helf:0
+halt	halt:0
+hang	h�ng:0
+hat	hab:0
+hau	hau:0
+heb	heb:0
+hei�	hei�:0
+helf	helf:0
+hie�	hei�:0
+hieb	hau:0
+hiel	halt:0
+hilf	helf:0
+hing	h�ng:0
+hob	heb:0
+holf	helf:0
+hub	heb:0
+i�	ess:0
+ies	
+k�m	komm:0
+k�mm	komm:0
+k�nn	k�nn:0
+k�r	kies:0
+kam	komm:0
+kann	k�nn:0
+kies	kies:0
+kl�ng	kling:0
+kl�mm	klimm:0
+klang	kling:0
+klimm	klimm:0
+kling	kling:0
+klomm	klimm:0
+klung	kling:0
+kneif	kneif:0
+kniff	kneif:0
+komm	komm:0
+konn	k�nn:0
+kor	kies:0
+kr�ch	kriech:0
+kreisch	kreisch:0
+kriech	kriech:0
+krisch	kreisch:0
+kroch	kriech:0
+l��	lass:0
+l�d	lad:0
+l�g	lieg:0
+l�ng	ling:1
+l�s	les:0
+l�uf	lauf:0
+l�g	l�g:0
+l�r	lier:0
+l�sch	l�sch:0
+l�d	lad:0
+l�g	l�g:0
+lad	lad:0
+lag	lieg:0
+lang	ling:1
+las	les:0
+lass	lass:0
+lauf	lauf:0
+leg	lieg:0
+leid	leid:0
+leih	leih:0
+les	les:0
+lie	les:0
+lie�	lass:0
+lief	lauf:0
+lieg	lieg:0
+lieh	leih:0
+lier	lier:0
+lies	les
+ling	ling:1
+lisch	l�sch:0
+litt	leid:0
+log	l�g:0
+lor	lier:0
+losch	l�sch:0
+lud	lad:0
+lung	ling:1
+m��	mess:0
+m�ch	m�g:0
+m�g	m�g:0
+m�lk	melk:0
+m��	m�ss:0
+m�ss	m�ss:0
+ma�	mess:0
+mag	m�g:0
+mahl	mahl:0
+meid	meid:0
+melk	melk:0
+mess	mess:0
+mi�	mess:0
+mied	meid:0
+milk	melk:0
+moch	m�g:0
+molk	melk:0
+mu�	m�ss:0
+n�hm	nehm:0
+n�s	nes:1
+n�ss	nie�:1
+nahm	nehm:0
+nann	nenn:0
+nas	nes:1
+nehm	nehm:0
+nenn	nenn:0
+nes	nes:1
+nie�	nie�:1
+nimm	nehm:0
+no�	nie�:1
+nomm	nehm:0
+noss	nie�:1
+pf�hl	pfehl:0
+pf�nd	pfind:0
+pf�ng	pfang:0
+pf�hl	pfehl:0
+pfahl	pfehl:0
+pfand	pfind:0
+pfang	pfang:0
+pfehl	pfehl:0
+pfeif	pfeif:0
+pfiehl	pfehl:0
+pfiff	pfeif:0
+pfind	pfind:0
+pfing	pfang:0
+pfl�g	pfleg:0
+pfleg	pfleg:0
+pflog	pfleg:0
+pfohl	pfehl:0
+pfund	pfind:0
+preis	preis:0
+pries	preis:0
+qu�ll	quell:0
+quell	quell:0
+quill	quell:0
+quoll	quell:0
+r�	rat:0
+r�ng	ring:0
+r�nn	rinn:0
+r�t	rat:0
+r�ch	riech:0
+r�nn	rinn:0
+ra	rat:0
+rang	ring:0
+rann	renn:0
+rat	rat:0
+rei�	rei�:0
+reib	reib:0
+reit	reit:0
+renn	renn:0
+ri�	rei�:0
+rie	rat:0
+rieb	reib:0
+riech	riech:0
+rief	ruf:0
+riet	rat:0
+ring	ring:0
+rinn	rinn:0
+riss	rei�:0
+ritt	reit:0
+roch	riech:0
+ronn	rinn:0
+ruf	ruf:0
+rung	ring:0
+s��	sitz:0
+s�h	seh:0
+s�ng	sing:0
+s�nk	sink:0
+s�nn	sinn:0
+s�uf	sauf:0
+s�ff	sauf:0
+s�g	saug:0
+s�nn	sinn:0
+s�t	sied:0
+s�tt	sied:0
+sa�	sitz:0
+sah	seh:0
+salz	salz:0
+sand	send:0
+sang	sing:0
+sank	sink:0
+sann	sinn:0
+sauf	sauf:0
+saug	saug:0
+sch�h	scheh:1
+sch�b	schieb:0
+sch�l	schelt:0
+sch�ll	schall:0
+sch�r	scher:0
+sch�ss	schie�:0
+sch�f	schaff:0
+schaff	schaff:0
+schah	scheh:1
+schal	schelt:0
+schall	schall:0
+scheh	scheh:1
+schei�	schei�:0
+scheid	scheid:0
+schein	schein:0
+schelt	schelt:0
+scher	scher:0
+schi�	schei�:0
+schie�	schie�:0
+schieb	schieb:0
+schied	scheid:0
+schieh	scheh:1
+schien	schein:0
+schil	schelt:0
+schilt	schelt:0
+schind	schind:0
+schiss	schei�:0
+schl�f	schlaf:0
+schl�g	schlag:0
+schl�ng	schling:0
+schl�ss	schlie�:0
+schl�g	schlag:0
+schlaf	schlaf:0
+schlag	schlag:0
+schlang	schling:0
+schlei�	schlei�:0
+schleich	schleich:0
+schleif	schleif:0
+schli�	schlei�:0
+schlich	schleich:0
+schlie�	schlie�:0
+schlief	schlaf:0
+schliff	schleif:0
+schling	schling:0
+schliss	schlei�:0
+schlo�	schlie�:0
+schloss	schlie�:0
+schlug	schlag:0
+schlung	schling:0
+schm�lz	schmelz:0
+schmei�	schmei�:0
+schmelz	schmelz:0
+schmi�	schmei�:0
+schmilz	schmelz:0
+schmiss	schmei�:0
+schmolz	schmelz:0
+schn�b	schnaub:0
+schnaub	schnaub:0
+schneid	schneid:0
+schnitt	schneid:0
+schnob	schnaub:0
+scho�	schie�:0
+schob	schieb:0
+schol	schelt:0
+scholl	schall:0
+schor	scher:0
+schoss	schie�:0
+schr�k	schreck:0
+schrak	schreck:0
+schreck	schreck:0
+schrei	schrei:0
+schreib	schreib:0
+schreit	schreit:0
+schri	schrei:0
+schrick	schreck:0
+schrie	schrei:0
+schrieb	schreib:0
+schrit	schreit:0
+schritt	schreit:0
+schrock	schreck:0
+schuf	schaff:0
+schund	schind:0
+schw�mm	schwimm:0
+schw�nd	schwind:0
+schw�ng	schwing:0
+schw�ll	schwell:0
+schw�mm	schwimm:0
+schw�r	schw�r:0
+schw�r	schw�r:0
+schwamm	schwimm:0
+schwand	schwind:0
+schwang	schwing:0
+schweig	schweig:0
+schwell	schwell:0
+schwieg	schweig:0
+schwill	schwell:0
+schwimm	schwimm:0
+schwind	schwind:0
+schwing	schwing:0
+schwoll	schwell:0
+schwomm	schwimm:0
+schwor	schw�r:0
+schwund	schwind:0
+schwung	schwing:0
+schwur	schw�r:0
+seh	seh:0
+send	send:0
+sess	sitz:0
+sied	sied:0
+sieh	seh:0
+sing	sing:0
+sink	sink:0
+sinn	sinn:0
+sitz	sitz:0
+soff	sauf:0
+sog	saug:0
+sonn	sinn:0
+sot	sied:0
+sott	sied:0
+sp�nn	spinn:0
+sp�nn	spinn:0
+spann	spinn:0
+spei	spei:0
+spi	spei:0
+spie	spei:0
+spinn	spinn:0
+splei�	splei�:0
+spli�	splei�:0
+spliss	splei�:0
+sponn	spinn:0
+spr�ch	sprech:0
+spr�ng	spring:0
+spr�ss	sprie�:0
+sprach	sprech:0
+sprang	spring:0
+sprech	sprech:0
+sprich	sprech:0
+sprie�	sprie�:0
+spring	spring:0
+spro�	sprie�:0
+sproch	sprech:0
+spross	sprie�:0
+sprung	spring:0
+st�ch	stech:0
+st�hl	stehl:0
+st�k	steck:0
+st�nd	steh:0
+st�nk	stink:0
+st��	sto�:0
+st�b	stieb:0
+st�hl	stehl:0
+st�nd	steh:0
+st�rb	sterb:0
+stach	stech:0
+stahl	stehl:0
+stak	steck:0
+stand	steh:0
+stank	stink:0
+starb	sterb:0
+stech	stech:0
+steck	steck:0
+steh	steh:0
+stehl	stehl:0
+steig	steig:0
+sterb	sterb:0
+stich	stech:0
+stie�	sto�:0
+stieb	stieb:0
+stieg	steig:0
+stiehl	stehl:0
+stink	stink:0
+stirb	sterb:0
+sto�	sto�:0
+stob	stieb:0
+stoch	stech:0
+stohl	stehl:0
+storb	sterb:0
+streich	streich:0
+streit	streit:0
+strich	streich:0
+strit	streit:0
+stritt	streit:0
+stunk	stink:0
+sung	sing:0
+sunk	sink:0
+t�	tun:0
+t�t	tun:0
+ta	tun:0
+tan	tun:0
+tat	tun:0
+tr�f	treff:0
+tr�g	trag:0
+tr�nk	trink:0
+tr�t	tret:0
+tr�ff	trief:0
+tr�g	tr�g:0
+tr�g	tr�g:0
+traf	treff:0
+trag	trag:0
+trank	trink:0
+trat	tret:0
+treff	treff:0
+treib	treib:0
+tret	tret:0
+trieb	treib:0
+trief	trief:0
+triff	treff:0
+trink	trink:0
+trit	tret:0
+tritt	tret:0
+troff	treff:0
+trog	tr�g:0
+trug	trag:0
+trunk	trink:0
+tu	tun:0
+tun	tun:0
+w�ch	wachs:0
+w�nd	wind:0
+w�nn	winn:1
+w�sch	wasch:0
+w�b	web:0
+w�g	wieg:0
+w�nn	winn:1
+w��	wiss:0
+w�chs	wachs:0
+w�rb	werb:0
+w�rd	werd:0
+w�rf	werf:0
+w�sch	wasch:0
+wachs	wachs:0
+wand	wind:0
+wann	winn:1
+warb	werb:0
+ward	werd:0
+warf	werf:0
+wasch	wasch:0
+web	web:0
+wei�	wiss:0
+weich	weich:0
+weis	weis:0
+werb	werb:0
+werd	werd:0
+werf	werf:0
+wich	weich:0
+wieg	wieg:0
+wies	weis:0
+will	woll:0
+wind	wind:0
+winn	winn:1
+wir	werd:0
+wirb	werb:0
+wird	werd:0
+wirf	werf:0
+wiss	wiss:0
+wob	web:0
+wog	wieg:0
+woll	woll:0
+wonn	winn:1
+worb	werb:0
+word	werd:0
+worf	werf:0
+wr�ng	wring:0
+wrang	wring:0
+wring	wring:0
+wrung	wring:0
+wu�	wiss:0
+wuchs	wachs:0
+wund	wind:0
+wurd	werd:0
+wusch	wasch:0
+z�g	zieh:0
+zieh	zieh:0
+zog	zieh:0
+zw�ng	zwing:0
+zwang	zwing:0
+zwing	zwing:0
+zwung	zwing:0
diff --git a/lib/Text/German/Vorsilbe.pm b/lib/Text/German/Vorsilbe.pm
new file mode 100644
index 0000000..269adeb
--- /dev/null
+++ b/lib/Text/German/Vorsilbe.pm
@@ -0,0 +1,105 @@
+#                              -*- Mode: Perl -*- 
+# Vorsilbe.pm -- 
+# Author          : Ulrich Pfeifer
+# Created On      : Thu Feb  1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr  3 11:44:42 2005
+# Language        : Perl
+# Update Count    : 23
+# Status          : Unknown, Use with caution!
+
+package Text::German::Vorsilbe;
+# require Exporter;
+# @ISA = qw(Exporter);
+# @EXPORT = qw(%VORSILBE);
+
+{
+  local ($_);
+  while (<DATA>) {
+    chomp;
+    ($vorsilbe, $key) = split;
+    $VORSILBE{$vorsilbe} = pack 'b*', $key;
+  }
+  close DATA;
+}
+
+sub vorsilben {
+  my $word = shift;
+  my @result;
+  
+  for $i (1 .. length($word)) {
+    my $vorsilbe = substr($word,0,$i);
+    if (defined $VORSILBE{$vorsilbe}) {
+      push @result, $vorsilbe;
+    }
+  }
+  @result;
+}
+
+sub max_vorsilbe {
+  my $word  = shift;
+  my $result = undef;
+  
+  for $i (1 .. length($word)) {
+    my $vorsilbe = substr($word,0,$i);
+    if (defined $VORSILBE{$vorsilbe}) {
+      $result = $vorsilbe
+        if !defined($result) || length($vorsilbe) > length($result);
+    }
+  }
+  $result;
+}
+
+1;
+# un ?
+
+__DATA__
+ab	010
+an	010
+auf	010
+aus	010
+be	100
+bei	010
+da	010
+dabei	011
+dar	010
+darauf	011
+drauf	012
+durch	110
+ein	010
+em	100
+ent	100
+er	100
+fest	010
+fort	010
+frei	010
+ge	100
+her	010
+herauf	011
+herum	011
+herunter	011
+hin	010
+hinauf	011
+hinzu	011
+miss	100
+mit	010
+nach	010
+nahe	010
+ob	100
+recht	010
+ueber	110
+um	110
+umher	011
+unter	110
+ver	100
+vor	010
+voraus	011
+vorher	011
+weg	010
+wider	110
+wieder	110
+zer	100
+zu	010
+zugrunde	012
+zurueck	012
+zusammen	012
diff --git a/t/basic.t b/t/basic.t
new file mode 100644
index 0000000..6078727
--- /dev/null
+++ b/t/basic.t
@@ -0,0 +1,51 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN {print "1..15\n";}
+END {print "not ok 1\n" unless $loaded;}
+use Text::German;
+$loaded = 1;
+$i = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+$Text::German::Regel::debug = 0;
+$Text::German::debug = 0;
+$debug = 0;
+#	gemachter testen h�uslich ��e verband verbarg verbi� fr�mmlich
+#	vordersten hintersten geheiligt gem��igt wenn ich so wollte
+#	wie ich k�nnte w�rde ich noch ganz anders als die anderen
+#	qualifiziert �usserst fade findet das mein k�tzchen eure
+#	heiserkeit heiterkeiten hoheitsvollerweise
+
+ at should = qw(
+
+             infrastrukturell Verfall gesellschaftlich Organisation DDR
+             f�hren verh�rten isolationistisch Politik reformerisch
+             Anforderung Mitte Jahr Krisenpotential
+
+             );
+for $word 
+    (qw(
+
+        infrastrukturelle Verfall gesellschaftlichen Organisation DDR
+        f�hrte verh�rteten isolationistischen Politik reformerische
+        Anforderungen Mitte Jahre Krisenpotential
+)) {
+    #$x = join ':', Text::German::partition($word);
+    print "=====$word=====\n" if $debug;
+    $x = Text::German::reduce($word);
+    $y = shift @should;
+    print "$word => $x ($y)\n";
+    $i++;
+    ($x eq $y)? print "ok $i\n": print "not ok $i\n";
+}
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
diff --git a/t/cache.t b/t/cache.t
new file mode 100644
index 0000000..6e3cf80
--- /dev/null
+++ b/t/cache.t
@@ -0,0 +1,50 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN {print "1..19\n";}
+END {print "not ok 1\n" unless $loaded;}
+use Text::German;
+$loaded = 1;
+$i = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+$Text::German::Regel::debug = 0;
+$Text::German::debug = 0;
+$debug = 0;
+#	gemachter testen h�uslich ��e verband verbarg verbi� fr�mmlich
+#	vordersten hintersten geheiligt gem��igt wenn ich so wollte
+#	wie ich k�nnte w�rde ich noch ganz anders als die anderen
+#	qualifiziert �usserst fade findet das mein k�tzchen eure
+#	heiserkeit heiterkeiten hoheitsvollerweise
+
+ at should = qw(
+
+             infrastrukturell DDR Verfall gesellschaftlich Organisation DDR
+             f�hren verh�rten f�hren isolationistisch Mitte Mitte Politik reformerisch
+             Anforderung Mitte Jahr Krisenpotential
+
+             );
+for $word 
+    (qw(
+
+        infrastrukturelle DDR Verfall gesellschaftlichen Organisation DDR
+        f�hrte verh�rteten f�hrte isolationistischen Mitte Mitte Politik reformerische
+        Anforderungen Mitte Jahre Krisenpotential
+)) {
+    print "=====$word=====\n" if $debug;
+    $x = Text::German::cache_reduce($word);
+    $y = shift @should;
+    print "$word => $x ($y)\n";
+    $i++;
+    ($x eq $y)? print "ok $i\n": print "not ok $i\n";
+}
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libtext-german-perl.git



More information about the Pkg-perl-cvs-commits mailing list