Am 28.03.2010 01:24, schrieb Arne Babenhauserheide:
> Hi, 
> 
> Ich habe check_neo inzwischen so weit, dass es auf die meisten Kriterien 
> prüfen und ein Layout darauf optimieren kann. 
> 
> Allerdings arbeitet das Layout aktuell mit hächstens abgeschätzten 
> Parametern, 
> daher brauche ich Hilfe, um es wirklich sinnvoll zu machen. 
> 
> Das Layout verwendet Kostenparameter, um die Güte eines Layouts zu berechnen, 
> und alles steht und fällt damit, wie gut diese Parameter sind (zusammen mit 
> der Qualität der Wortliste). 
> 
> Ihr könnt die Parameter recht einfach selbst anpassen und mit euren Werten 
> testen (sie stehen im Skript aktuell in den Zeilen 257 bis 276, kommen aber 
> auch gleich in dieser Mail: http://bitbucket.org/ArneBab/evolve-keyboard-
> layout/src/4bc6c132ec95/check_neo.py#cl-257 ). 
> 
> Bitte nicht erschrecken, wenn das etwas unübersichtlich wirkt. Sie sind alle 
> hinter dem Wert auf Englisch erklärt. 
> 
> Jeder Wert hier steht für die Gewichtung einer Kostenfunktion. Desto höher 
> sie 
> ist, desto wichtiger ist der Punkt in der Berechnung. 
> 
> Wenn ihr zu einer davon Fragen oder Anmerkungen habt, dann schreibt es bitte! 
> 
> 
> WEIGHT_POSITION = 1 #: reference
> WEIGHT_FINGER_REPEATS = 8 #: higher than a switch from center to side, but 
> lower than a switch from center to upper left.
> WEIGHT_FINGER_REPEATS_TOP_BOTTOM = 16 #: 2 times a normal repeat, since it's 
> really slow. Better two outside low or up than an up-down repeat. 
> WEIGHT_FINGER_DISBALANCE = 5 #: multiplied with the standard deviation of the 
> finger usage - value guessed and only valid for the 1gramme.txt corpus.
> WEIGHT_TOO_LITTLE_HANDSWITCHING = 1 #: how high should it be counted, if the 
> hands aren’t switched in a triple?
> WEIGHT_INTENDED_FINGER_LOAD_LEFT_PINKY_TO_RIGHT_PINKY = [
>     1,
>     2,
>     2,
>     3,
>     1,
>     1,
>     3,
>     2,
>     2,
>     1] #: The intended load per finger. Inversed and then used as multiplier 
> for the finger load before calculating the finger disbalance penalty. Any 
> load 
> distribution which strays from this optimum gives a penalty.
> WEIGHT_XCVZ_ON_BAD_POSITION = 0.1 #: the penalty *per letter* in the text if 
> xvcz are on bad positions (cumulative; if all 4 are on bad positions (not in 
> the first 5 keys, counted from the left side horizontally) we get 4 times the 
> penalty). 
> 
> 
> Außerdem gibt es noch die Kosten pro Taste, Zeile 356 ( 
> http://bitbucket.org/ArneBab/evolve-keyboard-
> layout/src/4bc6c132ec95/check_neo.py#cl-356 )
> Hier müssen noch die Kosten für die Gesamtbelastung der Finger rausgenommen 
> werden, da die schon woanders abgedeckt werden. Also sollte nur noch die 
> Erreichbarkeit der Taste (und die Geschwindigkeit des jew. Fingers) und die 
> Belastung die ein Druck auf genau diese Taste bringt drinstehen, nicht aber 
> sowas wie „der Kleine ist eh schwächer, auch wenn genau die Taste für ihn 
> eigentlich kein Problem ist“. 
> 
> # Structured reweighting (but still mostly from experience and deducing from 
> the work of others). 
> COST_PER_KEY  = [ # 0 heißt nicht beachtet
>         [0,0,0,0,0,0,0,0,0,0,0,0,0,0], # Zahlenreihe (0)
>         [0, 12,9,6,4,10,10,4,6,9,12,15,18,0], # Reihe 1
>         [0,  5,3,3,2,5,5,2,3,3,5,12,0,15], # Reihe 2 
>         [15,0,10,11,11,7,12,10,7,11,11,10,15],     # Reihe 3
>         [0,0,0,     5     ,0,0,0,0] # Reihe 4 mit Leertaste
> ]
> 
> Der Punkt braucht allerdings überarbeitung. Wenn sich jemand von euch mal die 
> Kosten pro Taste vornehmen will, würde ich (dem Vorschlag von Michael 
> Ostermeier folgend) vorschlagen, dem Zeigefinger nicht wie hier 2, sondern 10 
> Strafpunkte zu geben, dann haben wir mehr Flexibilität. Die Bedingung ist, 
> dass die Punkte ganze Zahlen sind (sonst wird der Code unnötig langsamer). 
> 
> 
> Nun aber dazu, wie ihr es selbst testen könnt (nur unter GNU/Linux geprüft; 
> ich habe hier nichts anderes): 
> 
> 1. Tarball-Snapshot (braucht Python3 → http://python.org/download )
> - wget http://bitbucket.org/ArneBab/evolve-keyboard-
> layout/get/55e78a669261.bz2
> - tar xf 55e78a669261.bz2
> - cd evolve-keyboard-layout/
> - ./check_neo.py
> 
> 2. Versionsverwaltung (braucht Python3 und Mercurial): 
> - (falls noch nicht vorhanden: easy_install mercurial )
> - hg clone https://[email protected]/ArneBab/evolve-keyboard-layout/
> - cd evolve-keyboard-layout/
> - ./check_neo.py
> 
> Der Aufruf started den Vergleich der Ergebnisse für Neo, Qwertz, Nordtast, 
> Dvorak und Colemak. Alle Vergleiche nutzen die Leipziger Wortliste. Wenn ihr 
> eine andere Wortlist wollt, müsst ihr nur 1gramme.txt, 2gramme.txt und 
> 3gramme.txt austauschen. 
> 
> 
> Zusätzlich könnt ihr ein Layout durch zufällige Mutationen entwickeln lassen, 
> d.h. es werden zufällig Tasten vertauscht, und wenn das mutierte Layout 
> besser 
> ist (weniger Strafpunkte hat) als das alte, wird die Mutation behalten. 
> 
> Was z.B. interessant sein dürfte: 
> 
>       ./check_neo.py --evolve 1000
>       1000 Mutationen testen. 
> 
> 
> Ein paar andere Methoden findet ihr via 
> 
>       ./check_neo.py --help
> 
> Das einfachste evolve scheint aber am effizientesten zu sein. 
> 
> Mit der Bash könnt ihr außerdem viele Ergebnisse hintereinander berechnen 
> (z.B. nützlich, um den Rechner eine Urlaubswoche lang arbeiten zu lassen). 
> Hier z.B. für 100 Layouts: 
> 
>       for i in {0..99}; do time ./check_neo.py --evolve 1000 --prerandomize 
> 10000 -q; done>> 2010-03-28-evolve-1000-results.txt
> 
> „-q“ hier sagt: zeig mir nur das Ergebnis, nicht die Zwischenschritte. 
> 
> Das beste findet ihr hier z.B. via grep, sort und tail. Hier für 
> Fingerwiederholungen 
> 
>       grep 2gramme 2010-03-28-evolve-1000-results.txt | sort -ur | tail
> 
> Dann nach dem besten Ergebnis suchen. Mein aktuell bestes für 
> Fingerwiederholungen: 
> 
>       grep "1.02004994329 % finger repeats in file 2gramme.txt" 2010-03-26-
> evolve-10000-results.txt  -A3 -B8
> # Evolved Layout
> [['^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '`', ()],
>  [(), 'ö', 'w', 'c', 'a', 'ä', 'f', 'h', 'u', 'm', 'y', 'x', '´', ()],
>  ['⇩', 't', 'n', 'r', 'e', 'o', 'g', 'd', 'i', 's', 'l', 'ß', '⇘', '\n'],
>  ['⇧', (), 'ü', 'p', 'v', '.', 'q', 'k', 'b', 'j', 'z', ',', '⇗'],
>  [(), (), (), ' ', (), (), (), ()]]
> # 1.30856908 billion total penalty compared to notime-noeffort
> # 14.8497008604 million keystrokes disbalance of the fingers
> # 1.02004994329 % finger repeats in file 2gramme.txt
> # 0.212532496307 % finger repeats top to bottom or vice versa
> # 8.94816062502 % of trigrams have no handswitching (uppercase ignored)
> # 4.00409258152 mean key position cost in file 1gramme.txt
> 
> 
> Nebenbei: Die Befehle hängen alle an die Ausgabedatei an, so dass es nur eine 
> sehr geringe Chance gibt, dass sie sich in die Quere kommen, wenn ihr einfach 
> mehrere nebeneinanden startet. Am effizientesten ist einer pro Prozessorkern. 
> 
> Ich lasse dieses Wochenende so eine Rechnung laufen, allerdings gleich mit 
> 10 000 Mutationsschritten, so dass bei mir ein einzelner Durchlauf knapp 5 
> Stunden dauert. 
> 
> 
> Nun aber viel Spaß beim Spielen :)
> 
> Ich würde mich über eure Rückmeldung freuen - und natürlich auch darüber, 
> wenn 
> ihr eure interessantesten Ergebnisse schreibt. 
> 
> Liebe Grüße, 
> Arne
> 
> PS: Solltet ihr auf einen Bug stoßen, dann schreibt das bitte auch. Ich habe 
> die letzten Tage recht viel umstrukturiert, so dass sich noch ein paar Fehler 
> im Code verstecken könnten…

Ich bekomme den Fehler:
Traceback (most recent call last):
  File "D:\Neo\NEOlytic\check_neo.py", line 1426, in <module>
    check_the_neo_layout(quiet=QUIET)
  File "D:\Neo\NEOlytic\check_neo.py", line 1343, in check_the_neo_layout
    data1 = read_file("1gramme.txt")
  File "D:\Neo\NEOlytic\check_neo.py", line 487, in read_file
    data = f.read()
  File "C:\DEV\python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position
1306: character maps to <undefined>

Was das AFAIK das „Á“ ist… Weiß jemand warum er das nicht mag?

Gruß Florian


Attachment: signature.asc
Description: OpenPGP digital signature

Antwort per Email an