Ich stelle ein neues Auswertungsprogramm für Tastaturen vor. Es ist so
blitzschnell, dass man keine Laufzeit überhaupt wahrnimmt. Man drückt
also Enter und schwupp ist es fertig.
Man braucht keinen Textkörper für dieses Auswerteprogramm. Das Programm
benötigt allerdings zwei Daten-Dateien, mit den Namen "buchstaben.txt"
und "bigramme.txt". Jede dieser Dateien muss in jeder Zeile eine Zahl
haben, die die Häufigkeit angibt, und einen Buchstaben bzw. ein Bigramm.
Die Tastaturen werden wie in den bisherigen Auswerteprogramme in einer
Datei namens "tastaturen.txt" – eine pro Zeile – angegeben. Man gibt
eine Tastatur an, wie bisher, indem man jede Taste einmal drückt,
angefangen mit der oberen Reihe links und endend mit der unteren Reihe
rechts. Jede Tastatur muss genau 32 Zeichen enthalten, nämlich die 30
deutschen Buchstaben und Punkt und Komma.
Das Programm gibt in dieser Version (ausw4.py) keine Gesamtwertung über
die Tastatur ab. Es hat sich nämlich in der manuellen Tastaturbastelei
als nicht hilfreich erwiesen. Wenn der Bastler etwas macht – etwa 2 oder
mehr Buchstaben vertauscht, dann guckt er typisch nach den Auswirkungen,
die diese Änderung bewirkt. Eine veränderte Buchstabenlage? Mehr
Fingerkollisionen? Die Gesamtwertung spielt da eine untergeordnete
Rolle.
Einerseits braucht man eine zusammenfassende Wertung der Buchstabenlage.
Das geschieht, wie in vorhergehenden Mails ausgiebig erörtert, durch
Vergabe von Strafpunkten für bestimmte Lagen. Jede Lage hat eine Anzahl
Strafpunkte zugeordnet.
5 3 3 3 4 4 3 3 3 5 7
1 0 0 0 2 2 0 0 0 1 7
6 5 5 5 7 7 5 5 5 6
Die Punkte werden wie oben angegeben vergeben. Der Python-Quelltext
dokumentiert genau, wie diese Punkte vergeben werden. Jeder, der Lust
hat, kann den Programmcode ändern. Ich bitte zu bemerken, dass man nicht
ganzzahlige Punkte vergeben muss! Wer einen größeren Spielraum möchte –
was in den Diskussionen immer wieder geäußert wurde – kann auch 2.5
(bitte Dezimalpunkt benutzen) oder etwa 5.183 Punkte vergeben.
Es wurde auch gelegentlich bemängelt, dass ich bei meinen Bewertungen zu
wenig Rücksicht auf Bigramme nehme. Das ist selbstverständlich Quatsch
gewesen, denn ich habe Dinge berücksichtigt, die darüber hinaus gehen.
Diesmal wird es so eine Kritik nicht geben. Das Programm nutzt
ausschließlich Bigramme für die Bewertung. Das geschieht in dieser
Version folgendermaßen:
Wenn die erste Buchstabentaste gedrückt wird, wird entweder die
Leertaste folgen (ein Einzelbuchstabe) oder es folgt ein weiterer
Buchstabe (ein Bi- oder Polygramm). Der nächste Buchstabe kann entweder
von der anderen Hand getippt werden, dann haben wir einen Handwechsel.
Oder er wird von der gleichen Hand getippt. Dann unterscheiden wir in
dieser Version drei Fälle: Der gleiche Finger wird benutzt – dann haben
wir eine Fingerwiederholung – oder ein weiter mittig befindtlicher
Finger wird benutzt – dann ist es eine Einwärtsbewegung – oder ein
weiter seitlich belegener Finger wird benutzt, und dann haben wir eine
Auswärtsbewegung. Da es keine weiteren Fälle gibt, können die
beschriebenen Fälle als Prozent ausgedrückt werden, wobei die Summe dann
immer 100 % wird.
====
Es ist durchaus möglich, weitere Ergebnisse zu berechnen. Diese ist aber
die erste Version von diesem Typ von Auswerteprogramm, die ich
geschrieben habe, und ich bin ganz am Anfang damit.
Amerikanische Tastaturbastler haben mir versichert, dass die Benutzung
von Python für diesen Zweck nicht möglich ist, weil Python zu langsam
ist.
====
Da man keinen Textkörper mehr braucht, kann jeder seine
Buchstabenhäufigkeiten und Bigrammhäufigkeiten beziehen, wo er will, sei
es beim Militär, Universitätsinstituten, Internet usw.
Man kann eine Buchstabenhäufigkeitstabelle "buchstaben.txt" erstellen,
indem man unter Linux eingibt:
cat textkoerper.txt | tr '[:upper:]' '[:lower:]' | grep -o
'[abcdefghijklmnopqrstuvwxyzäöüß,\.]\{1\}' | sort | uniq -c | sort -nr >
buchstaben.txt
Man kann eine Bigrammtabelle "bigramme.txt" erstellen, indem man unter
Linux eingibt:
cat textkoerper.txt | tr '[:upper:]' '[:lower:]' | grep -o
'[abcdefghijklmnopqrstuvwxyzäöüß,\.]\{2\}' | sort | uniq -c | sort -nr >
bigramme.txt
====
Und jetzt zum mehr Spannenden: Was ergibt das Programm bei bekannten
Tastaturen?
===========
Qwertz:
qwert zuiopü
asdfg hjklöä
yxcvb nm,.ß
Lagepunkte........ 309
Fingerwiederholung 14.196 %
Handwechsel....... 51.275 %
Einwärtsbewegung.. 16.090 %
Auswärtsbewegung.. 18.439 %
Wir sehen hier, dass die Vergabe von Lagepunkten etwas arbiträr ist.
Merken wir uns die 309. Jeder, der eine Verbesserung machen will, muss
da eine niedrigere Zahl haben. Merken wir uns die anderen Werte auch.
===========
Ristome:
qproc btdwjö
zlani uehsfy
xvgmk äüß,.
Lagepunkte........ 170
Fingerwiederholung 15.178 %
Handwechsel....... 55.448 %
Einwärtsbewegung.. 17.826 %
Auswärtsbewegung.. 11.549 %
Die preisgekrönte Tastatur aus "Jugend Forscht" hat tatsächlich
geschafft, eine bessere Buchstabenlage zu bekommen. 15 %
Fingerwiederholungen ist aber viel.
===========
Neo:
xvlcw khgfqß
uiaeo snrtdy
üöäpz bm,.j
Lagepunkte........ 140
Fingerwiederholung 9.109 %
Handwechsel....... 65.573 %
Einwärtsbewegung.. 8.438 %
Auswärtsbewegung.. 16.879 %
Wie die Neo-Leute selber behaupten, hat man eine noch bessere
Buchstabenlage und einen häufigeren Handwechsel. Ein deutlicher
Fortschritt, und bis dahin in der Geschichte den deutschen Tastaturen
die niedrigste Zahl der Fingerwiederholungen. Wie die Neo-Leute sagen:
hier favorisiert man gezielt die Auswärtsbewegung. Das ist gelungen!
===========
Bro:
xpc,y kghlfß
uieao dtnrsj
üqä.ö vmbzw
Lagepunkte........ 137
Fingerwiederholung 4.248 %
Handwechsel....... 75.058 %
Einwärtsbewegung.. 10.851 %
Auswärtsbewegung.. 9.844 %
Eine weitere Verbesserung der Buchstabenlage. Noch häufigere
Handwechsel. Sehr wenige Fingerwiederholungen. Damals das beste soweit.
===========
Mœsi:
yoa,x kghlfß
iuecp dtnrsj
üöä.q vmbzw
Lagepunkte........ 148
Fingerwiederholung 4.037 %
Handwechsel....... 75.058 %
Einwärtsbewegung.. 11.177 %
Auswärtsbewegung.. 9.728 %
Die erste Tastatur von Matthias Wächter. Weitere Verbesserung der
Fingerwiederholungen. Die marginal schlechtere Buchstabenlage ergibt
sich weiterhin aus der Art, wie wir Punkte verteilen.
===========
HP:
yoa,j kgclfx
iuehp dtnrsß
üöä.q vmbzw
Lagepunkte........ 143
Fingerwiederholung 4.061 %
Handwechsel....... 72.119 %
Einwärtsbewegung.. 12.010 %
Auswärtsbewegung.. 11.810 %
Noch eine Variante. Mit dem anderen Auswerteprogramm, das nur Wörter
auswertet, gab diese Variante bessere Ergebnisse und war der oben
genannten Tastatur überlegen. Matthias Wächter hat diese Ergebnisse
bezweifelt – und zwar ohne ein Auswerteprogramm am Laufen zu haben. Er
argumentierte, dass die Wortenden auch eine Bedeutung haben. Mit diesem
Auswerteprogramm sehen wir, dass er Recht hat. Denn heute habe ich
Bigramme mit Komma und Punkt. Und schon sieht die Lage anders aus.
===========
DK:
yoa,j pchlfx
iuedk gtnrsß
üöä.q vmbzw
Lagepunkte........ 142
Fingerwiederholung 4.025 %
Handwechsel....... 64.335 %
Einwärtsbewegung.. 9.610 %
Auswärtsbewegung.. 22.030 %
Auch nicht schlecht.
===========
Mœsi Variante
yoa,w kghlfq
iuecp dtnrsx
üöä.ß vmbzj
Lagepunkte........ 145
Fingerwiederholung 4.036 %
Handwechsel....... 72.282 %
Einwärtsbewegung.. 11.540 %
Auswärtsbewegung.. 12.143 %
Auch nicht schlecht
===========
Mœsi – weitere Variante:
yoa,j kghlfx
iuecp dtnrsß
üöä.q vmbzw
Lagepunkte........ 148
Fingerwiederholung 4.015 %
Handwechsel....... 74.910 %
Einwärtsbewegung.. 11.170 %
Auswärtsbewegung.. 9.905 %
Die von Matthias Wächter bevorzugte Tastatur. Tatsächlich ist sie auch
die, die mit dem neuen Auswerteprogramm die niedrigste
Fingerkollisionsrate hat bei noch sehr häufigem Handwechsel und leichter
Betonung der Einwärtsbewegungen. Formell nicht ganz so gute
Buchstabenlage wie die Bro-Tastatur, aber dennoch sehr angenehm zu
tippen.
Die Entwicklung von Auswerteprogrammen überhaupt ist auf Anregung von
Matthias geschehen von Anfang an. Ohne seinen Anstoß hätte es dieses
hier nicht gegeben.
Ulf
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# Zum Lesen und Schreiben von Unicode-Dateien
import codecs
# Einlesen der Datei mit den Buchstaben
# Es wird eine Datei benötigt, die in jeder Zeile
# eine Zahl gefolgt von Leerzeichen und einen Buchstaben
# enthält. Die Zahl ist die Häufigkeit. Nur 32 Buchstaben
# dürfen benutzt werden, etwa die deutschen Buchstaben,
# und Komma und Punkt
buchstaben = []
bugesamt = 0
buc = codecs.open('buchstaben.txt', encoding = 'utf-8', mode = 'r')
for zeile in buc:
zeile = zeile.strip()
(haeufigkeit, buchstabe) = zeile.split()
haeufigkeit = int(haeufigkeit)
buchstaben.append((buchstabe, haeufigkeit))
bugesamt += haeufigkeit
buc.close()
# Einlesen der Datei mit den Bigrammen
# Es wird eine Datei benötigt, die in jeder Zeile
# eine Zahl gefolgt von Leerzeichen und zwei Buchstaben
# enthält. Die Zahl ist die Häufigkeit, die Buchstaben das
# Bigramm. Es dürfen nur 32 verschiedene Zeichen benutzt
# werden, etwa die deutschen Buchstaben, Komma und Punkt
# Es ist klug, die Bigramm-Datei von Buchstabenwiederholungen
# zu bereinigen, etwa "mm" oder ".."
big = codecs.open('bigramme.txt', encoding = 'utf-8', mode = 'r')
bigramme = []
bigesamt = 0
for zeile in big:
zeile = zeile.strip()
(haeuf, bigr) = zeile.split()
haeuf = int(haeuf)
bigramme.append((bigr[0], bigr[1], haeuf))
bigesamt += haeuf
big.close()
# Die Datei, die die Tastaturen enthält
eintast = codecs.open('tastaturen.txt', encoding = 'utf-8', mode = 'r')
# Jede Zeile der Datei ist eine Tastatur mit den 32 Tasten genannt von links
# nach rechts und von oben nach unten
for T in eintast:
T = T.strip()
# Welcher Finger gehört zu der Buchstabe? Erste Ziffer.
# Li Kleinfinger = 1... li Zeigefinger = 4
# Re Zeigefinger = 5... re Kleinfinger = 8
# In welcher Gruppe liegt der Buchstabe? Zweite Ziffer
# 1 1 1 1 1 4 4 4 4 4 4
# 2 2 2 2 2 5 5 5 5 5 5
# 3 3 3 3 3 6 6 6 6 6
# Unter welcher Hand liegt der Buchstabe? Li = 0, Re = 1
# Dritte Ziffer
# Wieviele Punkte bringt der Buchstabe? Vierte Ziffer
# 5 3 3 3 4 4 3 3 3 5 7
# 1 0 0 0 2 2 0 0 0 1 7
# 6 5 5 5 7 7 5 5 5 6
# Danach wird so zugegriffen:
# dat['e'][0] ist der Finger, der 'e' tippt
# dat['e'][1] ist die Gruppe, in der 'e' liegt
# dat['e'][2] ist die Hand, die 'e' tippt
# dat['e'][3] ist die Punktezahl, die 'e' verursacht
# ist tmp ein eingelesener Buchstabe, ist also:
# dat[tmp][3] dessen Punkte.
dat = {
T[0]: (1, 1, 0, 5),
T[1]: (2, 1, 0, 3),
T[2]: (3, 1, 0, 3),
T[3]: (4, 1, 0, 3),
T[4]: (4, 1, 0, 4),
T[5]: (5, 4, 1, 4),
T[6]: (5, 4, 1, 3),
T[7]: (6, 4, 1, 3),
T[8]: (7, 4, 1, 3),
T[9]: (8, 4, 1, 5),
T[10]: (8, 4, 1, 7),
T[11]: (1, 2, 0, 1),
T[12]: (2, 2, 0, 0),
T[13]: (3, 2, 0, 0),
T[14]: (4, 2, 0, 0),
T[15]: (4, 2, 0, 2),
T[16]: (5, 5, 1, 2),
T[17]: (5, 5, 1, 0),
T[18]: (6, 5, 1, 0),
T[19]: (7, 5, 1, 0),
T[20]: (8, 5, 1, 1),
T[21]: (8, 5, 1, 7),
T[22]: (1, 3, 0, 6),
T[23]: (2, 3, 0, 5),
T[24]: (3, 3, 0, 5),
T[25]: (4, 3, 0, 5),
T[26]: (4, 3, 0, 7),
T[27]: (5, 6, 1, 7),
T[28]: (5, 6, 1, 5),
T[29]: (6, 6, 1, 5),
T[30]: (7, 6, 1, 5),
T[31]: (8, 6, 1, 6)
}
# Berechnung der Lagepunkte
lagep = 0
for b in buchstaben:
lagep += b[1] * dat[b[0]][3]
lagep = lagep * 100 / bugesamt
# Berechnungen über die Bigramme
hawe = 0 # Handwechsel
fiwi = 0 # Fingerwiederholungen
auro = 0 # Auswärtsbewegung
eiro = 0 # Einwärtsbewegung
for bi in bigramme:
# Andere Hand
if dat[bi[0]][2] != dat[bi[1]][2]:
hawe += bi[2]
# sonst ist es die gleiche Hand
else:
# Gleicher Finger
if dat[bi[0]][0] == dat[bi[1]][0]:
fiwi += bi[2]
# anderer Finger und zwar linke Hand
elif dat[bi[0]][2] == 0:
if dat[bi[1]][0] < dat[bi[0]][0]:
auro += bi[2]
else:
eiro += bi[2]
# sonst ist es die rechte Hand
else:
if dat[bi[1]][0] > dat[bi[0]][0]:
auro += bi[2]
else:
eiro += bi[2]
fiwi = fiwi * 100.0 / bigesamt
hawe = hawe * 100.0 / bigesamt
eiro = eiro * 100.0 / bigesamt
auro = auro * 100.0 / bigesamt
print "==========="
print T[0:5], T[5:11]
print T[11:16], T[16:22]
print T[22:27], T[27:]
print "Lagepunkte........ %6d" % lagep
print "Fingerwiederholung %6.3f %%" % fiwi
print "Handwechsel....... %6.3f %%" % hawe
print "Einwärtsbewegung.. %6.3f %%" % eiro
print "Auswärtsbewegung.. %6.3f %%" % auro