Lückentext

XML vs. SQL

Mein Ziel ist es, einen Lückentext aus einem Text zu generieren. Zufällig sollen Worte aus dem Text herausgepickt werden. Ist das auserwählte Wort ein Nomen, soll eine Auswahl der im Text vorkommenden Nomen angeboten werden. Die für die Lücke angebotene Auswahl an Wörtern sollen die selbe Wortart wie das fehlende Wort haben. Welche Datengrundlage soll ich mir für mein Vorhaben zusammen zimmern? Mir fällt sofort XML ein. Allerdings denke ich sofort danach an Effizienz. Soll meine Lösung auch auf einem Smartphone laufen, muss meine interne Datenstruktur sofort aus den Daten aufgebaut worden sein. Beim Parsen von XML gibt es zwei Möglichkeiten, nämlich DOM oder SAX. Wenn ich XML als DOM einlese, werden die XML Daten vollständig in einer internen Objektstuktur abgebildet. Wenn ich aber meine 40 MB großes XML Datei dermassen vollständig einlese, dauert das mindestens ein paar Sekunden. Per SAX wird XML eingelesen, indem ich benachrichtigt werde, wenn der Parser ein neues Element erreicht hat und wenn das alte Element verlassen wird. Ich habe dann die Möglichkeit, mir meine Datenstruktur selbst aufzubauen. Die Datenstruktur kann dann genau passend erzeugt werden, während ich unter Verwendung von DOM noch einmal hingehen und mir meine benötigten Daten aus dem DOM holen muss. Aber auch hier muss ich Aufwand betreiben, um die vorhanden Daten in eine interne Struktur zu bringen. Richtig flexibel ist man aber mit einer Datenbank. Die Daten können in der Datenbank bleiben und ich kann bequem per SQL darauf zugreifen. Ich entscheide mich für SQLite. Meine Datenbank muss in Java erzeugt werden, da der Stanfort POS Tagger, welcher auch deutsche Texte beherrscht, nur für Java existiert. Ich importiere die Bibliothek SQLJet und es klappt wunderbar. Um die Geschwindigkeit des Datenzugriffs zu erhöhen, erzeuge ich mir einen Index über die am häufigsten nachgefragten Spalten in meiner Tabelle.

Suche nach dem Layout für Qt

Nun, da ich meine Datenbank erzeugt habe geht es wieder in C++ und Qt weiter. Qt bietet selbst eine Zugriffsmöglichkeit für SQLite. Alles läuft problemlos, bis ich meinen Lückentext dann auch auf der Oberfläche sehen will. Die Lücken will ich als QComboBox und den übrigen Text als QLabel Objekte darstellen. Qt bitete mir aber nur eine spärliche Auswahl an Layouts an, nämlich gerade einmal drei. Ich will die Sätze meines Lückentextes in einem QVBoxLayout und die Wörter der Sätze in einem QHBoxLayout unterbringen. Aber diese Layouts scheinen für meine Zwecke nicht gemacht worden zu sein. Mein Vorhaben sprengt die Möglichkeiten dieser Layouts, so dass ich ganz komische Effekte beim generieren meiner Lückentexte erlebe. Qt geht hin und berechnet für jedes Label allerhand und will das Zeug ja irgendwie in Boxen darstellen. Ich bin ratlos und schicke ein Gebet zum Himmel: Oh Gott, wie soll es weitergehen? Lasse mich nicht im Stich! Qt hat ein Interface QLayout vorgesehen, um selbst Layouts implementieren zu können. Doch es scheint mir zu aufwendig für meine einfache Anwendung. Ich entdecke das FlowLayout, ein von Qt als Beispiel gedachtes Layout, welches genau das tut, was ich brauche, nämlich einfach nur Controls hintereinander zu zeichnen. Warum muss man so etwas Einfaches selbst programmieren? In Qt scheint man einiges selbst machen zu müssen. Ich wollte eigentlich den Test so programmieren, dass ich beim Ende per Email benachrichtigt werde. Aber eine Email zu schreiben ist auch kein Einzeiler. Nun gebe ich wie vorher meine Sätze in ein QHBoxLayout, aber die einzelnen Wörter in das FlowLayout. Wenn ein neuer Lückentext erzeugt wird, muss ich zuerst die alten QWidgets aus dem obersten Layout löschen. Da in Qt jedes Widget seine beinhalteten Elemente selbst löscht, brauche in nur die erste Ebene meiner Widgets in dem obersten Layout zu löschen:

    QLayout* hLayout = clozeWidget->layout();

    // Delete all the existing buttons in the layout
    QLayoutItem *wItem = hLayout->takeAt(0);
    while (wItem != 0){
        delete wItem->widget();
        delete wItem;
        wItem = hLayout->takeAt(0);
    }

clozefoto