OCRopus check groundtruth

When training a character model for OCRopus you need a good selection of ground truth data for training and testing. To be able to recognize a certain charater it must be included in the training data. Otherwise the neuronal network has no chance to detect the character’s appearance. Although not strictly required, it is also a good idea to include every possible character at least once in the ground truth data used for testing.

With several thousand characters it is sometimes difficult to keep an overview. Therefore, I have written a small script that checks the characters contained in the ground data. You can find it here in my fork of the OCRopus code:

Here is the result of the skript applied to the currect version of the Gothic print model

WARNING: Missing training data for these characters:
WARNING: Missing test data for these characters:

I will immediately begin the search for the missing characters…

Testing OCRopus character models

After you have trained an OCRopus character model or selected an existing character model you want to measure its character recognition accuracy. Do measure it you need ground truth data (images and text) that has not been used in the training for the model. If you would use images that have been used in the training process you might only measure and overfitting of the model (i.e., the character models ‘knows’ the solution for exactly this image).

When training my character models I have already excluded ca. 10% of the ground truth data from the training and put in into a directory named testing. Run a recognition for the images contained in that folder:

ocropus-rpred -q -m YOURMODEL "testing/*.bin.png"

If your computer has several CPUs you can speed up the recognition step by using the -Q option. In this example OCRopus will use six cores:

ocropus-rpred -q -Q6 -m YOURMODEL "testing/*.bin.png"

OCRopus contains a program that compares the .gt.txt files (containing the correct ground truth text) with the .txt files generated by the OCR:

ocropus-errs "testing/*.gt.txt"

The output of the program will end with lines like this:

errors 49
missing 0
total 14051
err 0.349 %
errnomiss 0.349 %

The testing folder contained 14,051 character. Only 49 of these characters are not the ones expected. In other words, in this sample 99.65% of the characters were recognized correctly.

You can also analyse the most common problems using a program included in OCRopus:

ocropus-econf "testing/*.gt.txt"

In my example the result looks like this:

errors 49
missing 0
total 14051
err 0.349 %
errnomiss 0.349 %
25 _
8 , .
7 _ '
5 _ -
3 _ .
1 . ,

25 whitespace characters are missing, 15 others have been recognized as punctuation. If you are only interested in wrong letters you can choose a different comparision by adding an option to ocropus-errs or ocropus-econf:

ocropus-errs -k letters "testing/*.gt.txt"

The possible option for the comparision are:

  • exact – count every character
  • nospace – ignore whitespace characters (space, tab)
  • letdig – count only letters (A-Z) and digits (0-9)
  • letters – count only letters (A-Z)
  • spletdig – count letters, digits and space
  • digits – count only digits (0-9)
  • lnc – count only letters (A-Z) and ignore the case

Optimizing Binarization for OCRopus

In many hours of work and frustration I have learned that page segmentation and character models have a strong influence on the result of OCR. However, I always underestimated the effects of the initial step – the binarization.

Now I have looked at the binarization step more closely. Starting material are rather poor scans  of the Austrian-Hungarian casualty lists. The scans themselves are not so bad. However, the paper is more than 100 years old and yellowed. There is a cutout:

Instead of looking at the binarization result directly or applying any kind of metric to it, I deceided to measure the final OCR result, i.e. the character accuracy. To avoid any problems during page segmentation I cut the two-column scans in half manually. Additionally I counted the detected lines. Since I used the same ground truth data for all measurements a missing/additional line would immediately be noticed by a very high error rate.

Typically ocropus-nlbin is used to create a bi-tonal image. As you can see the result is not very promissing. May characters are eroded.

After running the page segmentation ocropus-gpagesep without additional parameters I noticed that some characters/words were eroded. By using the debug mode (“-d” option) you can see these holes in the line seeds:

With the “–usegauss” option that switches to a Gaussian kernel instead of a uniform kernel that problem can be avoided. But there was still another problem. Occasionally two lines were merged into one image. I also investiaged that problem using the debug mode. This is the relevant section:

The 7th and 8th line get merged. Apparently, the small red connection between the two lines is the cause of the merging. It seems as if the problem always occurs near white column separators. Therefore, I have to deactivate the detection of white column separators:

ocropus-gpageseg --csminheight 100000 --usegauss 0001.bin.png

Now the page separation works without problems and I can run the character prediction using my trained character model for the casualty lists.

As a different approach for binarization I have used ScanTailor, a program that has served me well in the past optimizing scans. By default ScanTailtor produces a 600dpi bi-tonal image from 300dpi gayscale input. It also allows the use the configure the threshold used for binarization. Although values from -50 to +50 are possible, for this example only values between 0 and +40 seem reasonable.

Finally, here are the results of my experiments:

The bars in blue show the results of the ScanTailor binarization. The most right bar shows the effect the resolution of the bi-tonal image has. It is a 300dpi version with the best threshold setting determined for the 600dpi images.

As you can see, the binarization method used has a significant influence on the recognition quality. In my case the character recognition error is reduced by more than 60%.

You can find all images and ground truth data for this experiment on GitHub:

Practical Expercience with OCRopus Model Training

In this blog posts I would like to share some of my experience in training models for the outstanding OCR program OCRopus.

Keep training and test data seperated.

Inseparable from the training of a model is testing. I put my training and test data into two directories, `training` and `testing`. That makes it easy to add more test data later. And it also simplifies scripts like the one below.

Choose good training data.

I mostly work with source that contain alphabetic lists. In that case it is a bad idea to use complete pages for training (and testing). Particularly capitals would be missing. It is better to select lines from every page. For example you could select the 10th and 15th line of each page.

Let OCR help.

Creating ground truth data is time consuming. If there is a model that more or less works for your scans — use it to prepare ground truth data. In most cases it is easier to proofread and correct text than to type it from scratch.

  ocropus-rpred -q -m INITIAL_MODEL_FILE training/*.png testing/*.png
  ocropus-gtedit html training/*.png testing/*.png

Have enough samples for each character.

In many cases it will be difficult to have enough samples for every character. At least in German texts the Letters J, Y, X, and Q are rare. To check which characters occur in you training data you can use this command:

  cat training/*.gt.txt | sed 's/\(.\)/\1\n/g'| sort | uniq -c

Now you can look through your scanned text if you find more examples for the rare or even missing letters. Our directory layout with `training` and `testing` directory makes it easy to add more examples.

And don’t forget to check you test data as well:

  cat testing/*.gt.txt | sed 's/\(.\)/\1\n/g'| sort | uniq -c

Find typos in ground truth.

If you have not created your ground truth with double-keying or something similar, there is a great chance that it will contain typos. Especialy if you followed my previous hint with OCR correction you might find it difficult to spot mixed characters like one, lower case l and upper case I.

As soon as you have a suitable trained model, you can use it to spot errors in ground truth data. Run a prediction on the training data and check all lines with differences between ground truth and prediction.

  ocropus-rpred -q -m YOUR_MODEL_FILE training/*.png
  ocropus-gtedit html `ocropus-errs training/*.gt.txt 2>/dev/null |grep -v "^ 0" | cut -b 15- | sed 's/.gt.txt/.png/' `


One of the most underestimated programs for OCR (Optical Character Recognition) is OCRopus. The reason for this may lie in its sophisticated operation with several command line programs. You have to know the correct order to invoke the programs and the effects of OCRopus’ various options. You can achieve very good recognition rates (>99% correct characters) with OCRopus. However, you have to train a recognition model for your sources. A very good introduction to the use of OCRopus and the training of models is given in these two blog posts:

In this text I am going to focus on working with sources in table form. They are typical for official publications of the 19th and early 20th century such as statistics, registers, municipality lists etc. The printed tables are usually separated by vertical black lines. In combination with the lines (typically not separated by horizontal lines) they form table cells. Each table cell must be processed independently. Mixing content from neighboring cells will lead to bad results. Therefore, the detection of column separator is crucial.

The separation of the scan is done by ocropus-gpageseg. To detect vertical black lines as column separators you have to use the -b option. With the default setting only two vertical black lines will be recognized. The --maxseps option controls the number of detected black lines. When working with historical sources the lines are occasionally partial disconnected. In that case each line segment is counted as a black line. Therefore, you have to specify a much greater value for --maxseps.

Here is an example how the --maxseps effects the detection of column separators.



















The first four lines are detected perfectly. The 5th and 6th line are not detected completely. The 7th and 8th line are detected in the middle of the column separator. Step 9 shows the mentioned problem of partial disconnected lines. The first column separator is split in two lines. The lower part is detected later. However, the upper quarter has been completely overlooked. It is also interesting that 9 column separators are the maximum for this example. Even if you specify a greater value for --maxseps the missing parts of the column separators will not be recognized.

Sometimes the column detection does not work at all. Here is an example for such a case (the maxcols value has been set to 99 to void any limitation):


Maybe the column-spanning text block at the top confuses OCRopus’ algorithm. If you look very closely to the right border you can spot some detected vertical lines there. Does this dirt on the scan disturb the line detection? To check this, I manually crop the image.


Voilà, the center line is detected:


As you can see in this example, pre-processed cleaned scans are a prerequisite for good column detection results. Maybe the column detection algorithm can be optimized to deal with the quite common soiled scans.

Science 2.0 …?!

1069524880.LGL.2D.2048x2048Vor ein paar Wochen – es war zu der Zeit als die Deutsche Bahn noch zwischen Dresden und Hamburg einen IC regelmäßig verkehren lassen konnte – fand in Hamburg die zweite Konferenz zum Thema Science 2.0 des gleichnamigen Forschungsverbunds der Leibniz-Gemeinschaft statt.

Science 2.0 …?!

Immerhin zeigt die aktuelle Diskussion, an der sich auch Spitzenpolitiker intensiv beteiligen, dass bei der Industrie bereits die Version 4.0 angesagt ist. So frage ich mich, wie gerade die Wissenschaft so hinterher hängen kann? “Industrie 4.0” adressiert im Sinne der vierten industriellen Revolution die zunehmende Digitalisierung, Vernetzung und IT-Durchdringung von Produktionsprozessen und Produkten in der Industrie, um eine Ressourceneffizienz und ein schnelleres Reaktionsvermögen auf Marktgegebenheiten zu erlangen. Eine solche Wirkung zu erzielen, bedarf es einer exakten Kenntnis über Prozesse und deren Planbarkeit (genaueres dazu findet man zum Beispiel unter Aber auch in der Industrie gilt, dass nicht jede Produktion für “Industrie 4.0” relevant ist. Zudem sind, zumindest aus meiner Sicht, bei den meisten von uns schon genau solche Dinge wie Digitalisierung, Vernetzung und IT im privaten Alltag angekommen – so dass es eigentlich keine Revolution, vielleicht aber doch eine Innovation darstellt. Wie der einzelne sie nutzt und warum, ist allerdings auch im privaten ganz heterogen.

Wie sieht der Arbeitsalltag eines Wissenschaftlers aus? Sind Digitalisierung, Vernetzung und IT-Durchdringung nicht auch bei der Wissenschaft angekommen und haben sie ähnliche Ziele und Wirkungen auf die Prozesse? Welche Rolle hat die IT überhaupt im Alltag eines Wissenschaftlers und welche Werkzeuge werden genutzt? Brauchen wir neue, ggf. “smarte” Werkzeuge? Das sind einige der Fragen, die meine aktuelle Studie zum Thema Alltag von Wissenschaftlern leitet. Dabei geht es schlussendlich um die Frage, wie IT sein muss, um nutzbringend für den Alltag von Wissenschaftlern zu sein ‒ und das herauszufinden ist eine Aufgabe meiner Disziplin, der Wirtschaftsinformatik, die sich ja speziell mit dem “Mensch-Aufgabe-Technik-Ordnungsrahmen” (Lutz J. Heinrich) auseinanderzusetzen hat.

Mein Weg bei der Suche nach Erkenntnissen ist das digital aufgezeichnete Gespräch. Ich folge Leitfragen, aber ich vertiefe Themen, wenn es sich anbietet und der Gesprächspartner die Bereitschaft dazu signalisiert. Dabei entstehen Gespräche, die nicht nur abstrakt von der Struktur der Arbeit berichten, wie es von einem rationalen Wissenschaftler vielleicht vermutet werden könnte. Manchmal höre ich auch von den mir bekannten Sorgen um Drittmittelakquise, Kennzahlen zu Publikationen und vor allem der Zeit als begrenzte Ressource.

Es ist bemerkenswert, dass es keinen generalisierbaren Musteralltag für Wissenschaftler gibt und dabei Einflussfaktoren wie Position oder eigenes Rollenverständnis wichtig sind. Der Alltag eines Wissenschaftlers ist auch bei weitem nicht nur von wissenschaftlichen Prozessen bestimmt. Arbeitsfelder wie Lehre, Drittmittelakquise oder auch Organisation und Verwaltung bilden bei manchem, gewollt oder ungewollt, einen zeitlich intensiven Bestandteil. Tätigkeiten wie Drittmittelanträge schreiben, Netzwerke und Kontakte pflegen, Projekte verwalten, Lehrveranstaltungen und Seminare begleiten, Kommunikation, Recherche und Publikation sind nur ein kleiner Anteil der Aufgaben, die bewältigt werden. Auch arbeiten Wissenschaftler häufig in Zyklen. Wenn das Semester ansteht, dann erfolgt eine Konzentration auf die Lehre. Wenn der Lehrbetrieb endet, rücken Wissenschaft und Forschungsanträge mehr in den Mittelpunkt. Durch die nach wie vor zunehmende Internationalisierung ist hier allerdings auch ein verschwimmen der Grenzen zu erkennen.

Sicher wäre es, zielorientiert gedacht, verlockend, in einer wissenschaftlichen Arbeit zehn gute Ideen pro Stunde im Sinne einer Ressourceneffizienz zu haben. Aber gute Ideen und Denkprozesse folgen kaum Effizienz. Sie sind eher kreativ, unstrukturiert und auch nicht zwingend immer erfolgreich. Auch arbeiten Wissenschaftler auf ganz unterschiedliche Weise an Themen: manche wählen bewusst eine Art Stille auch von der IT, indem Desktopmeldungen unterdrückt und Kommunikationspfade zeitlich begrenzt unterbrochen werden. Bei anderen spielen bei Lesen und Denken und nach wie vor Zettel und Stift eine große Rolle, aber auch die Präsenz von Technologien wie Grid Computing und Web 2.0 werden mir häufig berichtet. Dabei sind sicher auch der Bezug zum fachlichen Thema und der damit verbundene Bedarf wichtig. Organisational sind internationale Projekte und virtuelle Kooperationen ebenso vorzufinden wie eine Arbeit in kleinen, ganz direkten und persönlichen Projektgruppen.

Meine Interviews folgen keinem voll durchstrukturierten, vorgegebenen Weg. Ich lasse mich auf Antworten ein und manchmal werden die Gespräche nicht nur die 30 angesetzten Minuten lang, sondern es werden 90 Minuten daraus. Die Aufzeichnung lasse ich in einem Rechenzentrum in einer Spracherkennung bearbeiten. Großrechner erkennen Worte und Pausen, die dann häufig noch einmal einer händischen Korrektur bedürfen, aber manchmal schon sehr nah an der wörtlichen Aussage sind. IT macht mich effizient und verbessert meinen Forschungsprozess in den unterstützenden Tätigkeiten und reduziert den Zeitaufwand. Aber die eigentliche Leistung und damit die Erkenntnis zu den einzelnen Fragen, dabei unterstützt sie mich nicht und den Prozess verändert sie auch nicht. Ich denke nicht schneller und das ist schon in Ordnung, denn ich habe durch die IT-Unterstützung mehr Zeit für das, was Mehrwerte schaffen kann. Wenn also Werkzeuge dazu führen, dass die Ressource Zeit im Alltag von Wissenschaftlern geschont wird, dann sind sie notwendig und wichtig und müssen bei all den Tätigkeiten genutzt werden, bei denen Effizienz das einzige Ziel sein kann. Und dazu gehört eben Verwaltung oder Kommunikation. Den Erkenntnisgewinn und damit das eigentliche Produkt (denken wir zurück an die Industrie 4.0) der Wissenschaftler ‒ und da sind diese Prozesse eben anderes als in der Industrie ‒ wird eine noch so effiziente Unterstützung nicht besser machen, sondern nur der Mensch ‒ der Wissenschaftler.

Bildquelle 1:×2048.png

Experiment zu double keying

Bei der Erfassung von textuellen Einträgen aus historischen Dokumenten in einem Crowdsourcing Projekt ist die Qualität der Ergebnisse besonders wichtig. Zu diesem Zweck wurde im Zuge der Masterarbeit “Entwicklung und Bewertung von Verfahren zur hochqualitativen und effizienten semi-automatischen Text- und Strukturerkennung bei historischen Quellen” in den vergangenen Monaten das Dateneingabesystem des Vereins für Computergenealogie (CompGen-DES) durch ein Instrument zur Sicherung der Qualität der Daten erweitert.

Bisher verwendete das Dateneingabesystem das Prinzip der einfachen Erfassung, in dem jeder Eintrag einmal erfasst wurde. Wenn auf einer Seite alle Einträge erfasst waren, wurde die Seite von einem Nutzer als fertig gemeldet. Das neue Instrument, welches die Qualität der Daten sichern soll, ist die n-fache Erfassung, dabei wird jeder Eintrag initial von zwei Nutzern erfasst, danach werden die Einträge verglichen. Gibt es eine Übereinstimmung, wird angenommen, dass der Eintrag korrekt erfasst wurde. Gibt es beim Vergleich keine Übereinstimmung, so wird der Eintrag erneut erfasst, bis zwischen den Nutzern eine mehrheitliche Übereinstimmung gefunden wird. Eine Seite ist damit erst fertig erfasst, wenn für alle Einträge eine solche Übereinstimmung gefunden wurde.


Generierte Seite im Aussehen der Schweizer Interniertenlisten von 1916 ähnlich

Der Vergleich und alle dazugehörigen Regelungen werden vom System übernommen, der Nutzer kann wie gewohnt die Bearbeitung einer Seite durchführen. Um nun die Qualität der einfachen Erfassung und die der n-fachen Erfassung gegenüberstellen zu können, benötigt man eine Seite, deren Erfassungsergebnis bereits bekannt ist. Diese bekannte Ergebnismenge bezeichnet man auch als Ground Truth. Durch die Ground Truth lässt sich bereits nach der ersten Erfassung einer Seite feststellen, wie hoch die Abweichungen der Erfassung von dem Idealergebnis sind. Würde man die Ground Truth nicht kennen, so könnte man zwischen den Erfassungsarten nur die Verbesserung von einer zur nächsten Erfassung darstellen, sich aber nicht auf die Güte der Daten beziehen.

Aus diesem Grund wurde im Dateneingabesystem ein Testprojekt angelegt, in welchem sich viele “Scans” einer Seite befinden, die aus bereits bekannten Daten generiert wurde. Diese Seite wurde der Liste der deutschen Internierten in der Schweiz von 1916 nachempfunden, da hier besonders viele interessante Fälle vorkommen.

Für die Auswertung hoffen wir auf möglichst viele fleißige Mithelfer, die sich an diesem Test beteiligen, indem Sie eine oder mehrere Seiten in dem Testprojekt erfassen.

Hier geht es zum Testprojekt.  Vorher sollte man sich jedoch die Bedienungsanleitung des DES und die Editionsrichtlinien durchlesen, damit man auch alles so eingibt, wie geplant. Man braucht zum Mitmachen allerdings einen (kostenlose) Nutzeraccount von

Allen Teilnehmenden vielen Dank, dass Sie sich die Zeit nehmen und aktiv an der Verbesserung des Dateneingabesystems mitwirken.

Class or individual that is the question

Immer wieder kommt es vor, dass man bei der Erstellung von Taxonomien bzw. Ontologien vor der Frage steht, ob man etwas als Klasse oder Individuum modellieren soll. Das mag auf ersten Blick sonderbar erscheinen, sind doch Klasse und Individuum so völlig verschieden.

Betrachten wir als Beispiel die Modellierung von Berufen. Der Einfachheit halber seien die Berufe in drei große Gruppen eingeteilt: Berufe in der Landwirtschaft, Berufe in der Industrie und Berufe im Dienstleistungssektor (im Folgenden ist aber nur kurz von Landwirtschaft, Industrie und Dienstleistung die Rede). Als ganz konkretes Beispiel für die Nutzung unserer Berufstaxonomie soll folgender Sachverhalt dienen: „Schweinebauer Knut entscheidet sich 2010, von der Schweinezucht auf Getreibeanabau zu wechseln und wird somit zum Getreidebauer“. Offensichtlich handelt es sich bei „Knut“ um ein Individuum. Wir wollen Knut als eine Instanz von Person definieren:

ClassAssertion( :Person :Knut )

Die Berufe „Schweinebauer“ und „Getreidebauer“ lassen sich wie folgt eingruppieren:


Nun stellt sich die Frage, macht man „Schweinebauer“ (und alle anderen Berufe) zu einer Klasse oder zu einem Individuum. Entscheiden wir uns zunächst dafür, die Berufe als Klassen zu modellieren:


Die Darstellung, dass Knut ein Schweinebauer ist bei der Modellierung der Berufe als Klassen einfach:


Wie würde es aussehen, wenn man aus „Schweinebauer“ ein Individuum macht? Da nun Knut keine Instanz dieser Klasse sein kann, muss man eine Verbindung über eine Object Property herstellen:


Problematisch wird es dadurch, dass Knut 2010 ein Getreidebauer, also eine Instanz der Klasse „Getreidebauer“ wird. Da OWL keine Zeit kennt und jede Aussage damit ewig gilt, ist er nun plötzlich „Getreidebauer“ und „Schweinebauer“. Dadurch wird sogar die Ontologie inkonsistent, da (in unserem einfachen Beispiel) die Klassen disjunkt sind. Ein ähnliches Problem hat man, bei der Verwendung von Individuen, da auch hier die beiden Object Properties, die Knut mit den beiden Berufs-Instanzen verbinden, nicht zu unterscheiden wären. Als Lösung verwendet man ein anonymes Individuum, dem man sogar noch Informationen über die Zeit mitgeben kann:


Diese Lösung funktioniert allerdings auch für Klassen:


Bisher haben wir also noch kein klares Argument für Individuum oder Klasse gefunden. Ein kleinen Vorteil bietet die Modellierung als Individuum, da beim Ignorieren von Zeitangaben zumindest keine inkonsistenten Ontologie entstehen.

Was ist also dann eine Entscheidungskriterium für Individuum oder Klasse? In der Regel begnügt man sich nicht damit, nur eine einfache Taxonomie von Berufen aufzustellen, sondern möchte die einzelnen Berufen mit weiteren Informationen versehen. Das können je nach Einsatzzweck ganz verschiedene Dinge sein, z.B.

  1. Handelt es sich um einen Ausbildungsberuf?
  2. Wie viel verdient ein Azubi im ersten Lehrjahr?
  3. Ein Schweinebauer hat etwas mit Schweinen zu tun.
  4. Ein Schweinebauer arbeitet auf einem Bauernhof.

Die erste Information ließe sich problemlos mit einer Unterklassenbeziehung realisieren. Bei der zweiten Information bietet sich eine Data Property an, die letzten beiden Informationen legen die Verwendung von Object Properties (oder unschön Data Properties und Literale) nahe. Ist damit die Entscheidung, Individuen zu verwenden, bereits gefallen, da Objekt Properties und Data Properties nur für Individuen angegeben werden können?

Mit einem Kniff kann man auch Klassen mit den entsprechenden Informationen versehen:

SubClassOf(:Schweinebauer :Bauer)
EquivalentClasses(  :Schweinebauer  
                    DataHasValue( : arbeitetAuf "Bauernhof" )

Es reicht, dass Knut eine Instanz der Klasse Schweinebauer ist, damit eine implizite Aussage

:Knut : arbeitetAuf „Bauernhof“

in der Ontologie enthalten ist. Auch mit einer Object Property funktioniert dies. Statt DataHasValue verwendet man ObjectHasValue. Dann ist Knut mit einem Individuum „Bauernhof“ verbunden. Eine Klasse „Bauernhof“ kann an dieser Stelle übrigens nicht verwendet werden, das Ziel einer Object Property ist stets ein Individuum. Diese Tatsache ist der nächste Hinweis, dass eine Modellierung als Klasse nicht günstig ist. Man denke daran, wie man aufschreiben würde, welchen Beruf Personen haben, die auf Arbeitsplatz der Klasse „Bauernhof“ arbeiten.

Deutlich zu Tage tritt das Problem, wenn man verschiedene Berufe miteinander in Beziehung setzen möchte. Das kann z.B.

  • eine Ähnlichkeitsbeziehung quer über Teilbäume der Taxonomie hinweg sein („Tischler ist ähnlich wie Zimmermann“),
  • verschiedene Qualifikationsstufen „Tischlermeister ist eine höhere Qualifikation als Tischlergeselle“ oder
  • ein Hinweis auf einen Nachfolgeberuf („Hausmeister ist heute Facility manager“).

Da man den oben genannten Kniff nur auf einer Seite einer Object Property anwenden kann, ist man bei einer Verbindung zweier Berufe mit Hilfe einer Object Property gezwungen, sie als Individuen zu modellieren.

Ein weiterer ganz praktischer Grund, einen Beruf als Individuum zu modellieren, liegt darin, dass auch die Deutsche Nationalbibliothek in der GND Berufe als Individuen modelliert, z.B. Tischler =

Allerdings ist es sinnvoll, einen Teil der Berufshierarchie trotzdem als Klassen zu modellieren, um eine automatische Klassifikation beim Reasoning zur Verfügung zu haben. Wo aber zieht man die Trennlinie zwischen Klassen und Individuen? Die Antwort ist relativ einfach: Alle abstrakten Berufe/Berufsgruppen werden als Klassen, alle konkreten Berufe als Individuen modelliert.


Dass es nicht richtig sein kann, nur Klassen zu verwenden, ergibt sich auch ganz intuitiv, wenn man sich folgende Aussagen durchliest, die sich durch eine Klassenhierarchie der Berufe und die Klassenzugehörigkeiten einer Person ergeben würden:

  • Beruf in der Landwirtschaft ist ein Beruf. – ok
  • Bauer ist ein Beruf in der Landwirtschaft. – ok
  • Bauer ist ein Beruf. – ok
  • Knut ist eine Person. – ok
  • Knut ist ein Schweinebauer. – ok
  • Knut ist ein Bauer. – ok
  • Knut ist ein Beruf in der Landwirtschaft. – Hier stimmt etwas nicht!

Und genau an dieser Stelle („Bauer“ isA „Beruf in der Landwirtschaft“) sollte man den Wechsel von Klasse zu Individuum durchführen, also „Bauer“ instanceOf „Beruf in der Landwirtschaft“.

< comsys:Berechenbarkeit folge="3" >

2014-09-30 DSC02217Ordnung muss sein. Ordnung ist das halbe Leben.

Es gibt viele schwierige Erziehungsaufgaben. Eine davon ist: Wie bringe ich meinen Kindern Ordnung bei?

Das Fragezeichen ist kein Zufall. Ich würde von mir behaupten, dass ich es auch nach der Erziehung von zwei Töchtern immer noch nicht richtig weiss, wie das geht – Kinder zur Ordnung zu erziehen. Ich versuch’ jetzt ‘mal, die Schwierigkeiten, die dabei auftauchen (können), zu illustrieren.

Unser Leben ist – um es mit einer gewissen minimalen Ordnung auszustatten – in einen 7-Tage-Rhythmus eingeteilt, den man “Woche” nennt. Am Sonntag drückt man auf einen Reset-Knopf, der zum montäglichen Restart vorbereitet. Das Drücken des Reset-Knopfs war während meiner Erziehungszeit keine beiläufige Aktion, sondern eine sehr wohl inszenierte Handlung: ein opulentes Frühstück mit allerlei Köstlichkeiten, darunter insbesondere Räucherlachs, der mir noch heute eine Delikatesse ist.

Auch von den Kindern wurde dieses Frühstück als eine wichtige Handlung wahrgenommen, wahrscheinlich eher wegen Ernsthaftigkeit der Eltern als wegen des Delikatessenangebots – Kinder sind da nicht so wählerisch. Die Ernsthaftigkeit – ja, die wurde knallhart durch eine ErstWennDu-Dann-Konstruktion erzeugt: Erst wenn Du Dein Zimmer aufgeräumt hast, dann starten wir mit dem Frühstück. Auch am Sonntag also: Erziehung zur Ordnung!

Mammamia – die armen Kinder!

Aufräumen – das ist ja mehr, als die Dinge, die auf dem Fußboden herumliegen, in irgendeine Kiste zu schmeißen und diese dann unters Bett zu schieben. Aufräumen – das ist ja viel mehr! Das ist ja: die Dinge, die auf dem Fußboden herumliegen, zu klassifizieren und klassengerecht in klassenweise vorgehaltene Boxen einzuschlichten. Und diese dann an definierten Orten unterzubringen.

Aber woher sollen Kinder denn eigentlich das richtige Klassenbewußtsein bekommen? Ich glaube, das habe ich damals nicht richtig bedacht. Ich habe damals gedacht: Das ist doch klar!

Leider war es meist nicht so klar, und bei dem Inspektionsgang vor dem Frühstück musste nachgeholfen werden. Trotzdem – keines der Kinder ist verhungert. Weder sonntags, noch werktags.

Von der Familie zum Staat ist es manchmal nur ein kleiner Schritt. Internationaler Handel und staatliches Kontrollbedürfnis verlangen ebenfalls eine Ordnung. Die Warenströme, die über die nationalstaatlichen Grenzen fließen, müssen erfasst und möglicherweise verzollt werden. Ebenso wie die Kinder zunächst die Dinge klassifizieren mussten, bevor sie sie aufräumen konnten, braucht der Staat (bzw. die Staatengemeinschaft) Warenklassifikationen. Oder wie es das Statistische Bundesamt etwas allgemeiner formuliert:

"Bei der Beobachtung von Massenerscheinungen … fällt stets eine Fülle von Daten an, die notwendigerweise auf geeignete Art verdichtet werden muss, um ihre Präsentation und Analyse zu erleichtern bzw. erst möglich zu machen. Voraussetzung hierfür ist das Vorliegen verbindlicher Einteilungen der zu beobachtenden ökonomischen, sozialen oder sonstigen Tatbestände. Nur durch die verbindliche Anwendung einer bestimmten Klassifikation und deren Klassifizierungsregeln wird erreicht, dass Einzeldaten – abgesehen davon, dass diese aus Geheimhaltungsgründen, stichprobentheoretischen Überlegungen oder aufgrund anderer Ursachen gar nicht zugänglich gemacht werden können – von den verschiedenen Nutzern statistischer Angaben einheitlich gruppiert werden.

Für verschiedene Fragestellungen werden unterschiedliche Klassifikationen entwickelt. Hierzu zählen Klassifikationen zur Gliederung wirtschaftlicher Aktivitäten, von Waren und Dienstleistungen, sozioökonomischen Merkmalen, Regionalangaben usw. Zum Teil liegen für die Gliederung derselben Art von Tatbeständen, zum Beispiel von Waren, verschiedene Klassifikationen vor, die dem jeweiligen Erhebungszweck entsprechend konzipiert sind. So erfassen sowohl das Warenverzeichnis für die Außenhandelsstatistik als auch das Güterverzeichnis für Produktionsstatistiken im Wesentlichen physische Erzeugnisse, wegen unterschiedlicher Verwendungs- und Analysezwecke jedoch in anderer Gliederung.

Neben der einheitlichen Anwendung einer Klassifikation bei der Erhebung, Aufbereitung und Analyse statistischer Daten auf nationaler Ebene hat in den vergangenen Jahren die Verwendung international vergleichbarer Klassifikationen stark an Bedeutung gewonnen. Daher werden bei nationalen statistischen Erhebungen inzwischen häufig Klassifikationen verwendet, die verbindlich auf internationalen oder EU-weiten Vorgaben aufbauen oder es kommen sogar unmittelbar internationale Klassifikationen zum Einsatz." (

Das Forschungsziel, das ich mir gesetzt habe und über das ich hier in diesem Blog schon berichtet habe, verlangt offensichtlich, dass ich mit modernen Warenklassifikationen auseinandersetze. Du, liebe Leserin, wirst Dich nun fragen: Warum im Plural? Reicht denn nicht eine einzige Warenklassifikation? Nein, man möchte uns das Leben schwer machen, es gibt mehrere Klassifikationen. Ich beschäftige mich derzeit mit zweien, von denen ich erwarte, dass sie einen zumindest ähnlichen Zweck verfolgen wie die Warenklassifikation der Reichsstatistik, nämlich mit der Standard International Trade Classification (SITC) der Vereinten Nationen und Kombinierten Nomenklatur (CN) der Europäischen Kommission, wobei diese Kombinierte Nomenklatur eine Erweiterung des Harmonized System der Welthandelsorganisation (WTO) ist. Wie ich schon berichtet habe, umfasst die SITC 2970 Positionen. Für die CN habe ich keine entsprechende Angabe gefunden, und nachzählen mochte ich nicht; es sei nur bemerkt, dass der Warencode eine achtstellige Zahl ist.

Die Reichsstatistik benutzt als Warencode eine fortlaufende Nummer, die Warencodes der SITC und der CN sind im Gegensatz dazu hierarchisch aufgebaut. Die SITC-Hierarchie umfasst 10 Teile, 67 Abschnitte, 262 Gruppen, 1023 Untergruppen und 2970 Kleinste Gliederungseinheiten (sogenannte Fünfsteller) (Wikipedia); der SITC-Warencode hat fünf Stellen. Der Warencode der CN ist in vier jeweils zweistellige Schlüssel aufgeteilt; in den 21 Abschnitten der CN sind insgesamt 97 Kapitel enthalten, und jedes Kapitel hat Unterpositionen, und jede Unterposition kann noch weiter aufgeteilt werden.

Das sieht doch alles ganz ordentlich aus, oder?

Wenn ich mir vorstelle, meine Kinder hätten ihre diversen Utensilien nach der SITC bzw. der CN klassifizieren müssen … nein, das will ich mir lieber nicht vorstellen. Die Kinder wären verhungert – und die Eltern auch. Ich will also nicht davon reden, wie schwierig es ist, Dinge so “feingranular” zu klassifizieren. Ich will stattdessen darüber reden, wie “ordentlich” denn die Hierarchien der SITC und der CN gebildet sind bzw. was es eigentlich bedeutet, eine “ordentliche” Hierarchie aufzubauen.

Dem Informatiker scheint diese Frage eine der leichtesten zu sein: Hierarchisch – das bedeutet eine Baumstruktur. Da gibt es Knoten und Kanten wie in jedem Graphen, der Graph ist ungerichtet und zusammenhängend, es gibt keine Schlingen, einer der Knoten ist der Wurzelknoten, der keinen Vorgänger hat, alle anderen Knoten sind nur mit ihren Vorgängern verbunden. Man kann die Knoten in “innere Knoten” und in “Blattknoten” unterscheiden. Angewendet auf unsere beiden hierarchischen Warenklassifikationen bedeutet das: Der Wurzelknoten ist ein virtuelles Gebilde, das z.B. mit “SITC” bzw. “CN” bezeichnet werden könnte, die Blattknoten tragen Bezeichnungen, die auf die jeweils zu erfassenden Waren angewendet werden sollen. Die inneren Knoten dienen nur der Strukturierung des Systems bzw. der Navigation im Baum. So weit so gut: Ich habe diese naive Vorstellung von einer ordentlichen Baumstruktur gehabt, als ich mich daran gemacht habe, die Hierarchien der SITC bzw. der CN mit Hilfe eines XSL(T)-Skripts in OWL-2-Klassenhierarchien umzuwandeln.

Was ist mir aufgefallen?

  • Die Warenbezeichnungen, die ich bei den Blattknoten erwartet habe, können auch schon bei Knoten einer höheren Hierarchiestufe auftauchen. Die Hierarchie ist also nicht in allen Ästen des Baumes in voller Tiefe vorhanden. Das lässt sich zum Teil dadurch erklären, dass sich ein Oberbegriff oftmals nicht sehr sinnvoll in Unterbegriffe “aufspalten” läßt. Dann läßt man diese Aufspaltung schlicht und ergreifend weg. Nun ja, das ist vielleicht nicht schön, aber es lässt sich sicherlich verschmerzen.
  • Die SITC- bzw. CN-Bäume sind keineswegs zusammenhängend. Es gibt Lücken. Warencodes, die keine Verbindung zu ihren Vorgängern im Baum haben, habe ich vor allem in sog. correlation tables gefunden, d.h. in Tabellen, die eine Abbildung zwischen zwei oder mehr verschiedenen Klassifikationen beschreiben. Konkret ist mir das bei der Bildung von Warencodes aufgefallen, die für nicht vollständig klassifizierbare bzw. klassifizierte Waren stehen. In der CN z.B. geht man wie folgt vor: Wenn man grob weiss, zu welcher Gruppe bestimmte Waren gehören, aber feinere Kenntnisse fehlen, dann behält man die in der Hierarchie am höchsten stehenden Schlüssel bei und füllt die freien Stellen mit der Ziffer 9 auf. Es gibt z.B. einen Warencode 01999999, und der beschreibt sinngemäß “Live animals – not classified according to kind.” Eine etwas feinsinnige Erläuterung gibt die United Nations Commodity Trade Statistics Database: “Due to confidentiality, countries may not report some of its detailed trade. This trade will – however – be included at the higher commodity level and in the total trade value. For instance, trade data not reported for a specific 6-digit HS code will be included in the total trade and may be included in the 2-digit HS chapter. … Detailed data … will sum up to the respective totals due to the introduction of adjustment items with commodity code 9999 and 999999.” ( Allerdings fehlen im angeführten Beispielen wie an anderen vergleichbaren Stellen die beiden inneren Knoten 0199 und 019999. Das ist für den menschlichen Leser nicht schlimm, sehr wohl aber bei der Bildung einer Klassenhierarchie.

(Wird fortgesetzt)

< comsys:Berechenbarkeit folge="2" >

Adler1867: Karl Marx vollendet den ersten Band seines Hauptwerks: Das Kapital. Und das ist der erste Satz dieses Wälzers: “Der Reichtum der Gesellschaften, in welchen kapitalistische Produktionsweise herrscht, erscheint als eine ungeheure Warensammlung.” Klingt das nicht wie die unbedingte Aufforderung, sich mit Warenstatistiken zu beschäftigen?

Vier Jahre später, nach dem Krieg mit Frankreich, gründet sich das Deutsche Reich neu, aus dem König von Preußen wird Kaiser Wilhelm I. (Ein Reiterstandbild befindet sich im Kieler Schlosspark.)

Und nochmals zwei Jahre später ist es endlich soweit: Das Deutsche Reich legt seine erste Reichsstatistik vor. Es geht vor allem um Waren, um deren Import und Export, um Zölle auf Waren, um die Warenströme usw. (Weitere Themen sind z.B. die Bevölkerungsentwicklung  und der Verkehr auf den Deutschen Wasserstraßen.) Bis zum Jahr 1883 erscheinen insgesamt 63 Bände, die zusammen die sog. Alte Folge der Reichsstatistik bilden. Das Reich macht Inventur — wie reich ist das Reich?

Wenn Du Dich, liebe Leserin, vielleicht schon gefragt hast, wie ich auf das Thema “Wirtschaftsstatistik” gekommen bin, wo es mir doch sonst eher um technische Themen geht, dann ist hier ein Teil der Antwort. Im Zuge meiner Zusammenarbeit mit der ZBW hatte ich erfahren, dass die ZBW vor einiger Zeit ein Projekt durchgeführt hat, in dem die “Die Statistik des Deutschen Reichs (Alte Folge) aus den Jahren 1873-1883” digitalisiert wurde. Ich habe mir gedacht: Das ist ein Schatzkästlein, das da am Rande der Förde liegt, und da musst Du hineinschauen, um mehr über den Reichtum unserer kapitalistischen Gesellschaft zu erfahren. Die programmatische Aussage von Marx muss nicht so nackt und bloß im Raume stehen bleiben, nein, sie kann mit konkreten Zahlen unterfüttert werden.

Und wenn es dann außerdem noch gelingt, mit Hilfe semantischer Technologien einen Anschluss der Reichsstatistik an unsere heutigen Warenstatistiken zu finden, dann ist das ein wirklich spannendes Projekt. Das auch valide technische Inhalte hat. Bingo!

In diesem post möchte ich zwei Themen ansprechen: Was bedeutet “Digitalisierung”? Und: Was ist mir beim Lesen der Reichsstatistik aufgefallen?

Dass Digitalisierung mit dem Einscannen anfängt, aber nicht dabei aufhören muss, ist wohl eine Binsenweisheit für alle, die sich mit alten Büchern beschäftigen. Dass hat sich auch die ZBW gedacht, als sie angefangen hat, sich mit der Reichsstatistik zu beschäftigen. Der nächste Schritt nach dem Einscannen ist meist die Texterkennung, d.h. die Bilder, die beim Scannen entstehen, werden mit etwas hinterlegt, das z.B. den MIME type text/plain oder text/rtf tragen könnte. Oft versucht man, diese Texterkennung automatisch durchzuführen, man spricht dann von Optical Character Recognition (OCR). Bei der Reichsstatistik darf man davon ausgehen, dass OCR nicht zu guten Ergebnissen führen würde, und zwar aus mehreren Gründen:

  • Der unten widergegebene Schnipsel aus dem Band 63 zeigt, dass manche Buchstaben auf ungewöhnliche Art graphisch repräsentiert werden, auch wenn der Font selber als “modern” durchgehen könnte. Eine automatische Texterkennung würde damit also wahrscheinlich eine aufwendige Nachbearbeitung erfordern.
  • WaarenGute OCR-Verfahren verwenden Wörterbücher, um die Ergebnisse der graphischen Verfahren zur Texterkennung abzugleichen. Aber wie gut kann das funktionieren, wenn im zu erkennenden Text eine Rechtschreibung verwendet wird, die nicht mehr die unsere ist? Auch dafür nebenan ein Beispiel, und zwar für ein Wort, das in unserem Zusammenhang wichtig ist.
  • Und schließlich sind da noch viele, viele Tabellen in der Reichsstatistik. Diese Tabellen bilden – so kann man sagen – den Hauptinhalt der Reichsstatistik. Tabellen per OCR zu rekonstruieren ist sowieso schwierig. Wenn man zusätzlich davon ausgeht, dass die automatische Texterkennung problematisch ist, dann bleibt für die Digitalisierung nur … genau: das Abtippen.
  • Ich denke, aus heutiger Sicht gehört zur Digitalisierung außerdem noch die semantische Annotation. Praktisch bedeutet das, dass man in das Digitalisat – sichtbar oder unsichtbar – in einer formalen Syntax eine Menge Annotationen hineinschreibt, die Bezug auf ein kontrolliertes Vokabular nehmen. Dafür automatische “Digitalisierungsverfahren” zu finden, ist eine ungelöste Forschungsfrage.

In ihrem Digitalisierungsprojekt hat sich die ZBW insbesondere der Tabellen der Reichsstatistik angenommen und diese tatsächlich abtippen lassen. Tatsächlich sind die Tabellen sogar mehrfach abgetippt worden, und erst nach positivem Vergleich sind die gewonnenen Daten als valide angenommen worden. Die Tabellen liegen nun verschiedenen Formaten vor, u.a. als Excel-Tabellen und als HTML-Tabellen.

Was ist mir beim Lesen in der Reichsstatistik aufgefallen? Ich zähle ein paar Dinge auf, ohne einen Anspruch auf Vollständigkeit zu haben.

Die Autoren der 63 Bände der Reichsstatistik (Marx und Engels haben es übrigens nur zu 42 Bänden gebracht) gestehen gleich zu Anfang ein, dass “das Ganze dieser Anordnungen … keinen im eigentlichen Sinne systematischen Ausbau der Statistik des Deutschen Reiches [bildet]. Es umfasst nicht alle Gesichtspunkte und Bedürfnisse, welche sich aus den Zwecken und der Kompetenz des Reiches nach … der Reichsverfassung als Aufgabe der Reichsstatistik ergeben müssten.” (Band 1, Einleitung, S. 9).

Wozu die Statistik gut sein soll, stellt man nur indirekt fest: Man “ging in der Unterscheidung der Waarenartikel, und bezüglich der Trennung des Verkehres nach Grenzstrecken und Gebietstheilen, nach Land-, See- und Flussverkehr, nach der Art der Abfertigung u. dgl. so weit ins einzelne, dass den schwierigen und nicht ohne lebhaften Kampf geführten Verhandlungen über die wirthschaftliche und Tarifpolitik des Zollvereins wesentliche Grundlagen geboten wurden.” Was wohl nichts anderes sagen will: Die Wirtschaftspolitik und die Zollregeln brauchen detailliertes Datenmaterial, damit die “nicht ohne lebhaften Kampf geführten Verhandlungen” zu einem akzeptablen Ende kommen können.

Die reklamierte “ins einzelne gehende Unterscheidung der Waarenartikel” führt dazu, dass das Warenverzeichnis der Reichsstatistik 403 Positionen für die Aus- und Durchfuhr und für den Wasserverkehr und 457 Positionen für die Einfuhr umfasst. Diese Zahlen mögen dem unbefangenen Leser groß erscheinen. Wenn man aber weiß, dass die heute u.a. verwendete Standard International Trade Classification Rev. 4 (SITC-4) insgesamt 2.970 Produkte unterscheidet (Statistisches Bundesamt: Deutsche Übersetzung der Standard International Trade Classification, Revision 4, der Vereinten Nationen, Ausgabe 2006), dann muss man doch von einem eher übersichtlichen Warenverzeichnis ausgehen: Es gibt ca. 5½-mal so viele SITC-4-Warencodes wie Reichsstatistik-Warencodes! (Auf die SITC-4 werde ich in weiteren posts noch eingehen.)

Zur Erstellung des Warenverzeichnisses greift man auf ein Vorgängerverzeichnis zurück. Man moniert allerdings u.a., “dass die Anordnung der betreffenden Zusammenstellungen nicht die nöthige Uebersichtlichkeit gewährt”. Trotzdem unternimmt man kaum Anstrengungen, das Warenverzeichnis mit diversen Strukturelementen auszustatten, die das Auffinden spezieller Waren erleichtern könnten: Das Warenverzeichnis ist in seinem Kern eine flache Liste von Waren mit zugeordneten Warencodes, wobei die letzteren schlicht und ergreifend aus der fortlaufenden Nummerierung der Waren gewonnen werden. Lediglich neun in die Liste eingefügte Zwischenüberschriften sorgen für Struktur und Übersicht. Die SITC-4 dagegen baut eine fünfstellige Hierarchie auf.

Viele Begrifflichkeiten der Reichsstatistik sind problematisch: Da wird z.B. unter ein und dem gleichen Warencode von Abfällen und Halbzeug gesprochen. Nach meinem Verständnis sind Abfälle Dinge, die in irgendeine geeignete Deponie kommen, während Halbzeug in die Produktion neuer Produkte eingeht. (Beim recycling macht man heute manchmal Halbzeug aus Dingen, die früher Abfall waren.) Probleme bereiten solche Vermischungen, wenn man die Codes des einen Warenverzeichnisses auf die Codes des anderen abbilden will. Die SITC-4 z.B. trennt Abfälle und Halbzeug sorgfältig voneinander; es wird hier kaum möglich sein, eine Abbildung zwischen der Reichsstatistik und der SITC-4 zu finden.

Richtige Kapriolen werden geschlagen, wenn es um den “eisernen Kredit” geht. Was das ist? Ich habe es auch nachschlagen müssen. Es geht um eine spezielle Subvention für Wein bzw. den Weinhändler – was man bei diesem Begriff keinesfalls vermuten hätte. “Der fortlaufende (eiserne) Zollkredit besteht darin, dass … für ein Weinquantum, das dem Umfang des Lagers angemessen ist, die Verzollung sowie die Feststellung des Zollbetrags ausgesetzt bleiben …” (Verhandlungen der General-Konferenz in Zollvereins-Angelegenheiten, 1839, S. 95) Ich würde mich liebend gerne mit diesem Weinquantum näher auseinandersetzen …

Über einige weitere Eigentümlichkeiten der Reichsstatistik werde ich sicherlich noch in nachfolgenden posts berichten. Aber vielleicht hast Du, liebe Leserin, schon einen ersten Eindruck davon gewonnen, wie spannend es sein, sich mit dem “Reichtum der Gesellschaften, in welchen kapitalistische Produktionsweise herrscht”, etwas näher zu beschäftigen.