Morphy ist eine Software die schon seit den 1990er existiert. Sie dient zur morphologischen Analyse von deutschen Texten. Da die Software nur unter Windows läuft ist sie leider nicht für jedermann zugänglich. Schon gar nicht für Serveranwendungen und Webseiten. Idealerweise werden auf der Webseite die Stammdaten zum Download angeboten mit dem man seine eigene Lösung erstellen kann. Die Daten liegen in zwei verschiedenen Datenformaten vor. Einmal als einfache CSV Datei mit ca. 2.1 MB Größe wo die Vollformen den Grundformen gegenüber gestellt sind. Das zweite Datenformat ist eine XML Datei mit ca. 600 MB Größe und enthält die kompletten Daten.
Morphy – Das deutsche Morphologie-Lexikon
Die Daten kann man jetzt natürlich ganz einfach nutzen um eine Anwendung zu bauen. Die CSV Datei könnte gehen, enthält aber nicht alle Informationen. Daher muss man auf die Daten in der XML Datei zugreifen. Da diese aber mit etwas über 600 MB ziemlich groß, kann diese nicht einfach gelesen und durchsucht werden.
Damit man die Daten also effizient nutzen kann muss man also irgendwie den Zugriff auf die Daten beschleunigen. Je nachdem welche Lösung man anstrebt, sind dabei einige Hürden zu meistern die das ganze vorgehen gar nicht so einfach machen. Ich habe mich entschlossen die XML Datei in die MySQL Datenbank zu importieren um dann bequem darauf zuzugreifen. Folgende Punkte sind als zu meistern.
- Import der XML Datei in MySQL. Durch die Größe von 600 MB ist dies etwas schwierig und dauert einige Zeit.
- Die Struktur der Tabelle sollte effizient sein
- Das ablegen der Daten sollte so wenig wie möglich an Speicherplatz verbrauchen. Immerhin sind es ca. 2 Millionen Datensätze wenn man für jede Vollform eine eigene Zeile nimmt.
1. Import der XML Datei in MySQL
Der Kampf mit der 700 MB großen XML Datei. Der erste einfache Versuch per PHP Script scheiterte am Memory Limit.
Folgendes muss gelöst werden:
- 700 MB große XML Datei
- 431146 Grundformen mit 6366280 Vollformen. Es werden also mind. 6366280 Zeilen in der Datenbanktabelle gespeichert.
- Die Tabellengröße ohne Index ist ca. 570 MB Groß
- Datenbank INSERTs zusammenfassen. (chuncked insertion)
- PHP Script Speicher-effizient aufbauen. Die neue Funktion die es seit PHP 5.3 gibt nutzen:
gc_collect_cycles()
- evtl. mysql_free_result() nutzen um RAM zu sparen
weiter geht es in Kürze mit folgenden Thema: Optimierung und Verkleinerung der zu speichernden Daten. Tagset übersetzen in Integer. Verbesserung der Spalten in der MySQL Tabelle.