1
Hallo. Ich habe mir den XML-Dump vom Wiktionary geholt. Der ist fast 850 MByte groß. Außerdem habe ich drei neue MySQL-Tabellen angelegt, um sie mit den Daten aus dem XML-Dump zu füllen und so einen Versuch, ein Wörterbuch zu bauen, zu unternehmen. Dieses Mal sind die Tabellen gleich von Anfang an in Normalform (also eine Tabelle für das eigentliche Wort, eine für zusätzliche Informationen zum Wort und eine für die Kombinationen zur Übersetzung). Dazu habe ich noch ein PHP-Skript, das den XML-Dump in Blöcken von <page> bis </page> auswertet, die relevanten Elemente in einen String packt und den an eine Stored Procedure sendet. So soll es jedenfalls funktioneren. An der Stored Procedure fehlt auch nur noch eine Sache. Die Stored Procedure nimmt den String (besser wäre natürlich ein assoziatives Array, aber das geht nunmal nicht mit SQL) wieder auseinander und verteilt die Elemente dann auf die Datenbanktabellen.
Die Sache, die noch fehlt, ist das Vermeiden doppelter Einträge. Bei einer nichtnormalisierten, einzelnen Datenbanktabelle hätte ein einfaches SELECT Klarheit geschaffen. Mit normalisierten Tabellen ist das komplizierter. Wahrscheinlich hat Wiktionary nur eine Seite pro Wort. Deswegen darf sich die Fallunterscheidung auf die möglichen Übersetzungen beschränken. Die werden im XML-Dump gegebenenfalls wiederholt und nicht referenziert.
Ich vermute, daß es eine Abfrage mit JOIN erfordert, ähnlich wie wenn das fertige Wörterbuch abgefragt würde. Aber Letzteres ist leichter, weil dann einfach nur alles ausgegeben werden muß, was vorhanden ist. Vor dem Eintragen muß ich unterscheiden zwischen noch nicht vorhanden, exakt so vorhanden, Homonym. Beim Homonym ist der Eintrag zwar vorhanden, aber es ist trotzdem nicht das gleiche Wort. Das läßt sich nur an den Zusatzeinträgen in der Tabelle für die Zusätze erkennen. Da ist aber wiederum jeder einzelne Eintrag optional. Es könnte sogar sein, daß das gleiche Wort mal in der XML-Datei eine Anmerkung mit sich führt und in einem anderem Fall nicht. Je nach dem Ersteller der entsprechenden Wiktionary-Seite. Es wäre schade auf solche Anmerkungen zu verzichten. Das macht die Abfrage schwierig, weil bei vielen AND im WHERE-Teil wird ein Eintrag mit zu wenigen optionalen Einträgen wahrscheinlich nicht gefunden. Mehrere Zusätze aus der selben Tabelle wären natürlich auch abzufragen, was mich vor ein weiteres Rätsel stellt, weil beim JOIN doch gleich viele Werte vorhanden sein müssen? Der WHERE-Teil stattdessen mit OR gebaut stellt nicht sicher, daß es sich um das gleiche Wort handelt.
Wie kann ich also herausfinden, ob ein Wort schon eingetragen ist, aber der Eintrag nicht bloß ein Homonym ist? (Aussprache, Anmerkungen, Grammatik befindet sich alles in der Tabelle Zusatz und kann immer auch fehlen.)
Ranma
Die Sache, die noch fehlt, ist das Vermeiden doppelter Einträge. Bei einer nichtnormalisierten, einzelnen Datenbanktabelle hätte ein einfaches SELECT Klarheit geschaffen. Mit normalisierten Tabellen ist das komplizierter. Wahrscheinlich hat Wiktionary nur eine Seite pro Wort. Deswegen darf sich die Fallunterscheidung auf die möglichen Übersetzungen beschränken. Die werden im XML-Dump gegebenenfalls wiederholt und nicht referenziert.
Ich vermute, daß es eine Abfrage mit JOIN erfordert, ähnlich wie wenn das fertige Wörterbuch abgefragt würde. Aber Letzteres ist leichter, weil dann einfach nur alles ausgegeben werden muß, was vorhanden ist. Vor dem Eintragen muß ich unterscheiden zwischen noch nicht vorhanden, exakt so vorhanden, Homonym. Beim Homonym ist der Eintrag zwar vorhanden, aber es ist trotzdem nicht das gleiche Wort. Das läßt sich nur an den Zusatzeinträgen in der Tabelle für die Zusätze erkennen. Da ist aber wiederum jeder einzelne Eintrag optional. Es könnte sogar sein, daß das gleiche Wort mal in der XML-Datei eine Anmerkung mit sich führt und in einem anderem Fall nicht. Je nach dem Ersteller der entsprechenden Wiktionary-Seite. Es wäre schade auf solche Anmerkungen zu verzichten. Das macht die Abfrage schwierig, weil bei vielen AND im WHERE-Teil wird ein Eintrag mit zu wenigen optionalen Einträgen wahrscheinlich nicht gefunden. Mehrere Zusätze aus der selben Tabelle wären natürlich auch abzufragen, was mich vor ein weiteres Rätsel stellt, weil beim JOIN doch gleich viele Werte vorhanden sein müssen? Der WHERE-Teil stattdessen mit OR gebaut stellt nicht sicher, daß es sich um das gleiche Wort handelt.
Wie kann ich also herausfinden, ob ein Wort schon eingetragen ist, aber der Eintrag nicht bloß ein Homonym ist? (Aussprache, Anmerkungen, Grammatik befindet sich alles in der Tabelle Zusatz und kann immer auch fehlen.)
Ranma