Für die Wortvorgabe hatten wir vor, eine Baumstruktur zu verwenden. In jedem Node (Knoten) steht genau ein Zeichen, sodass ein Pfad ein Wort ergibt. Jeder Node enthält außerdem eine Zahl, die eine Wertung für die Häufigkeit angibt. So werden häufige Wörter eher vorgeschlagen als selten verwendete.
Ein Pfad kann auch mehrere Wörter enthalten: Eisenbahn → “Eis”, “Eisen”, “Eisenbahn”. Die Nodes mit den Zeichen ‘i’, ‘e’, ‘b’ etc. haben die Wertung 0 und zählen daher nicht als Wort (so wird zum Beispiel “Eisenb” nicht vorgeschlagen).
Beispiel:
Durch diese Struktur können wir “Eis”, “Eisen”, “Eisenbahn”, “Eisenach” und “Eisbein” mit nur (theoretisch) 16 Zeichen speichern. Außerdem wird das Suchen durch diese Ordnung stark beschleunigt, vor allem wenn sehr viele Wörter gespeichert sind.
Da auch Wörter durch den Nutzer automatisch hinzugefügt und die Häufigkeiten reguliert werden, muss das Vokabular in eine Datei gespeichert werden. Die einfachste Idee ist, beim Speichern einfach alle Wörter zu bilden und als Zeilen zu speichern. Beim Öffnen des Programms wird die Datei eingelesen und alle Wörter neu zum Baum hinzugefügt. Es erweist sich aber als schwierig dabei effizient auch die Häufigkeiten zu berücksichtigen.
Der zweite Ansatz baut auf dem Prinzip von xml-Dateien auf.
XML-Dateien sind zum Beispiel so aufgebaut:
<abschnitt>
<part>
</part>
<part>
<inhalt>
</inhalt>
</part>
</abschnitt>
Damit lassen sich sowohl Listen als auch Baumstrukturen realisieren, nur sind bei den vielen <>>-Tags mit nur wenig Inhalt die ‘<’, ‘>’-Zeichen sehr verschwenderisch, daher sieht unser Ansatz deutlich anders aus:
Aus der langen Struktur (hier ohne "Eisenach")...
|<E>
| <i>
| |<s>
| | <e>
| | <n>
| | <b>
| | <a>
| | <h>
| | <n>
| | </n>
| | </h>
| | </a>
| | </b>
| | </n>
| | </e>
| | <b>
| | <e>
| | <i>
| | <n>
| | </n>
| | </i>
| | </e>
| | </b>
| |</s>
| </i>
|</E>.
...wird:
E i s e n b a h n ////// b e i n ///////
Dabei schließt ein ‘/’ je einen Tag.
Die Zahlen werden je hinter den Buchstaben geschrieben.
E0 i0 s1 e0 n1 b0 a0 h0 n1 ////// b0 e0 i0 n1 ///////
Auch das lässt sich noch weiter komprimieren, zum Beispiel können alle Leerzeichen weggelassen werden, wenn die Zahlen durch Steuerzeichen ersetzt werden, die man nicht in normalem Text verwendet (So bleit die Möglichkeit erhalten, auch Ziffern
in den "Wörtern" mitzuspeichern). Auch die Nullen (sind am häufigsten) können weggelassen werden, wobei unser Parser stets eine 0 annimmt, wenn keine Zahl dasteht.
Sowohl das Abspeichern als auch das Einlesen und Suchen haben wir rekursiv gelöst, was hier übersichtlicher ist, als iterativ zu arbeiten.
In einem kleinen Programm (auch im Code oben zu finden) haben wir das implementiert (Achtung, es wird wieder unsere GUI-Library verwendet). Beim Eingeben werden in der Liste unten Wörter vorgeschlagen, die beim Anwählen die Eingabe vervollständigen.
Behälter für den Arduino
Nach einer Brainstorming Session standen wir vor zwei Optionen. Entweder wir würden eine Box mithilfe von einem 3D-Drucker fertigen lassen, oder selbst eine Box aus Holz bauen. Da die Kosten beim 3D-Druck allerdings voraussichtlich zu hoch werde würden, haben wir uns für die zweite Option entschieden. Die Box sollte leicht und klein sein, weshalb wir relativ dünne Holzplatten verwendeten. Diese sägten und schliffen wir passend und klebten sie mit Holzkleber daraufhin. Als Schließmechanismus entschieden wir uns für zwei Magneten, deren Befestigung aber ziemlich ermüdend war, weil die verschiedenen Kleber meistens nicht lange gehalten haben. Nach einigen Versuchen sind die Magnete aber an ihrem Stellen geblieben.
==== Ausblick ====
- Ursprünglich hatten wir noch vor eine Sprachausgabe mit einzubringen, jedoch hat die Zeit nicht gereicht.
- Außerdem wäre es sehr interessant, noch einmal einen ganz anderen Ansatz zu probieren und mit maschinellem Lernen, statt mit Hard-Coding bei dem Erkennungsproblem zu arbeiten. Das würde sich bei der Sicherheit und Stabilität der Ergebnisse bei der Positionsauswertung sicher auszahlen.