Über den Vokabeltrainer Felix A

Diese Software habe ich gemacht, um eine ärgerliche Schwäche eines käuflichen Vokabeltrainers loszuwerden. Das Produkt heißt "Schindlers PC Latein". Bei dieser ansonsten guten Software verliert man schnell die Lust zum Üben, da alle Antworten immer buchstabengetreu eingegeben werden müssen. Das bedeuten unter anderem, das die Frage nach dem lateinischen Wort ex immer exakt mit aus...heraus (drei Punkte!) beantwortet werden muss. Da das Programm einem anschließend einen reichlich unverschämten Satz um die Ohren haut, ist es mit der Freude am Lernen schnell vorbei.

Bei sprachlichen Eingaben über die Tastatur darf man nicht exakt vergleichen, sondern muss gewisse Toleranzen gestatten (Dreher,und andere Formen von "typos"). Dazu braucht es ein Ähnlichkeitsmaß für Zeichenketten. Für diese Software habe ich die sogenannte Levenshtein-Distanz gewählt.

Was ist die Levenshtein-Distanz ?

Die Levenshtein-Distanz ist ein einfaches Ählichkeitsmaß für zwei Wörter W und V. Es wurde von Vladimir I. Levenshtein gefunden und ist nichts weiter als die Anzahl der Editieroperationen, die erforderlich sind, um W in V zu überführen.

Beispiel: Die Levenshtein-Distanz der Zeichenketten W="sich nähern" und V="sicj nähernm" ist 2, da zum einen das "j" durch "h" ersetzt und das "m" entfernt werden muss.

Wie die Levenshtein-Distanz berechnet wird, findet man unter www.levenshtein.de ausführlich erklärt.Diese Software berechnet die Levenshtein-Distanz mithilfe des CPAN-Moduls Text::Levenshtein.

Die beim Felix A Vokabeltrainer maximal tolerierte Levenshtein-Distanz ist 2. Dadurch wird zum Beispiel "auseiandergehn" als Antwort auf "discedere" noch akzeptiert.

Wie wählt man gleichwarscheinlich eine beliebige Zeile eines Textes aus, ohne vorher zu wissen, wie lang er ist ?

Die Frage mutet etwas sonderbar an, hat aber mit dieser Software zu tun. Es ist eine mathematisch interessante Frage mit einer orginellen Antwort.

Dazu muss ich allerdings etwas ausholen. Aber es lohnt sich weiterzulesen, da selbst von 20 gestandenen Informatikern und Mathematikern bestenfalls einer diese Frage richtig beantworten kann. Die Meisten antworten spontan "das geht nicht!".

In diesem Vokabeltrainer liegen die 1672 Vokabeln von Felix A in einer einzigen Textdatei vor. Auf eine Textdatei kann nur sequentiell zugegriffen werden. Das bedeutet, daß man ihre Zeilen nacheinander einlesen kann aber nicht spontan die 100.Zeile ansteuern und auslesen kann. Um nun eine gleichverteilte zufällige Auswahl einer einzelnen Zeile durchführen zu können, ist es bei naiver Betrachtung erforderlich, zunächst die Anzahl der Invdividuen (Zeilen) zu kennen (hier o.b.d.A die Zahl n, dann eine Zufallszahl im Bereich 1 - n zu erzeugen, und die entsprechende Zeile einzulesen. Technisch hieße das, zunächst die Textdatei von vorne bis hinten komplett einzulesen, um festzustellen, wieviele Zeilen sie hat (n), dann eine Zufallszahl r im Bereich 1..n zu erzeugen und dann die Textdatei nochmals zeilenweise zu lesen und bei der r-ten Zeile zu stoppen.

Das klingt aufwendig und ist es auch. Vor allem ist der Ansatz unelegant. Um das Problem etwas lebensnäher zu machen: Sie haben eine Arztpraxis und wissen erst am Ende des Tages, wieviele Patienten heute kommen werden. Trotzdem möchten Sie jeden Tag genau einem Patienten eine Flasche Tomatensaft schenken. Jeder ihrer Patienten soll die gleiche Chance haben, den Tomatensaft zu bekommen. Am selben Tag möchten sie dem Patienten sein Präsent überreichen. Wie also geht das ?

Antwort:

  1. Sie stellen den Tomatensaft bereit und öffnen das Wartezimmer.
  2. Wenn der erste Patient ihr Behandlungszimmer betritt, behandeln sie ihn und halten ihn darauf fest, denn wenn er bis Feierabend der Letzte bleiben sollte, ist er der korrekte Gewinner des Tomatensaftes.
  3. Wenn der zweite Patient in die Praxis kommt wählen Sie eine Zufallszahl aus der Menge {1,2}. Würfeln Sie dabei eine 1, so schicken Sie den ersten Patienten Nachhause und halten den zweiten Patienten fest.
  4. Beim dritten Patienten würfeln Sie eine Zahl zwischen 1 und 3. Falls Sie wieder eine 1 würfeln, halten Sie den dritten Patienten fest und schicken, wen auch immer sie vorher festgehalten haben nachhause.
  5. So verfahren Sie weiter, indem Sie bei Patient Nr. k eine Zahl von eins bis k würfeln und den Patienten genau dann (unter Freilassung Ihres bisherigen Gefangenen) festhalten, wenn eine 1 dabei rauskommt.
  6. Am Ende ihres Arbeitstages schicken Sie denjenigen Patienten, dessen Freiheit sie gerade berauben, mit dem Tomatensaft nachhause.
  7. Erwarten Sie keinen Dank dafür.

Was ist Perl und was hat Perl mit Latein zu tun?

Perl ist eine mächtige Programmiersrache, die ausnahmsweise nicht von einem Informatiker, sondern von einem Linguisten entworfen wurde. Der Erfinder ist der mir schon wegen seiner christlichen Orientierung sehr sympathische Larry Wall Dieser Vokabeltrainer wurde in Perl geschreiben und umfasst nicht mehr als 160 Zeilen Perlcode

Wie mächtig Perl ist, erkennen Sie auch als nicht-Fachmann daran, daß der ganze oben so wortreich von mir beschriebene Auswahlprozess in Perl nur eine einzige Code umfassst:


	  rand($.) < 1 && ($line = $_) while <>;
      

Verständlicher, aber in einer weniger idiomatischen Schreibweise:

	$n=0;
	open WARTEZIMMER,"< Patienten.txt";
	while ($patient = <WARTEZIMMER>) {
	if (rand $n < 1) {
	$gefangener = $patient;
	}    
	$n = $n + 1;      
	}
      

Einer der Gründe, warum ich Perl erwähne ist, daß es vermutlich die einzige Programmiersprache ist, mit der in Latein programmiert werden kann. Der geistreiche Kopf auf den das zurückgeht, heißt Damien Conway. Von Ihm stammt ein Perl-Modul namens Lingua::Romana::Perligata, mit dem er demonstriert, wie auch eine Programmiersprache so aufgebaut werden kann, daß die Beziehung der Elemente untereinander mehr durch Beugungen und weniger durch die Syntax geklärt werden. Zu dieser wenigstes kuriosen Idee sagt Conway selbst:

The Lingua::Romana::Perligata makes it makes it possible to write Perl programs in Latin. (If you have to ask "Why?", then the answer probably won't make any sense to you either.)

Weiteres dazu findet sich in einem Aufsatz dazu.

Dies Alles nur als Gedanken, die man zu einem Programmierprojekt eines Wochenendes so haben kann. Allen Interessierten wünsche ich viel Spaß mit dem Vokabeltrainer Felix A und viel Erfolg bei den Klassenarbeiten!


Patrick Krusenotto

Zurück zum Vokabeltrainer Felix A

Valid XHTML 1.0 Strict