Freiformerkennung versucht im Gegensatz zur formularbasierten Erkennung, bestimmte Werte wie etwa eine Versicherungsnummer, irgendwo auf einem Dokument zu finden. Hilfreich dabei ist immer eine bestimmte Struktur des gesuchten Wertes, der dann meist über reguläre Ausdrücke gesucht wird. Darüber hinaus werden zusätzlich auch noch sogenannte Schlagwörter zur Suche genutzt, die oftmals in der ‚Nähe‘ der gesuchten Werte stehen (z.B. ‚Versicherungsnummer‘, ‚VersNr.‘, … vor einer Versicherungsnummer).
Diese Technik bieten die meisten der am Markt befindlichen Klassifikations-/Extraktionsprodukte an. Bei Maschinenschriften liefern auch alle mehr oder weniger ähnliche Ergebnisse.
Beim von uns eingesetzten Produkt Kofax Transformation Modules (KTM) sind die passenden Tools die sogenannten ‚Format Lokatoren‘. Siehe dazu auch die bisher erschienen Blogartikel über KTM (1).
Im Folgenden soll gezeigt werden, wie man auch handschriftliche Nummern, die eine bestimmte Struktur aufweisen, irgendwo auf einem Dokument finden kann.
In unserem Beispiel suchen wir auf den Dokumenten handschriftlich notierte Versicherungsnummern, die folgenden Aufbau haben: 1x-xxxxxx-xx. Dabei steht das x für eine Ziffer zwischen 0 und 9, Beispielnummer: 14-386723-89.
Beispieldokument:
Im KTM-Projekt muss das Dokument zunächst auf die richtige Dokumentenklasse klassifiziert werden (im Beispiel: InsuranceDocs). Dies kann mit irgendeiner der verfügbaren Klassifikationsmethoden erfolgen (siehe dazu: Klassifizierung mit KTM ).
Im KTM Projekt hat die Klasse ‚InsuranceDocs‘ noch das Feld ‚InsuranceNumber‘ und den Lokator ‚Numbers‘ (erweiterter Zonenlokator):
Hier zunächst die Grundidee für die ‚Freiformerkennung‘ der handschriftlichen Nummern:
- Ein erweiterter Zonenlokator liest den Text der gesamten Seite, indem die Zone des Lokators entsprechend groß definiert wird.
- Meiner Erfahrung nach liest die RecoStar-Engine Zahlen besser als die FineReader-Engine. Daher wird im erweiterten Zonenlokator RecoStar mit einem numerischen Profil [0-9-] eingesetzt.
- Das Ergebnis des erweiterten Zonenlokators ist eine Zeichenkette bestehend aus Ziffern und -.
- Im Skript der Dokumentenklasse ‚InsuranceDocs‘ wird innerhalb der Zeichenkette mit regulären Ausdrücken nach einer Versicherungsnummer gesucht.
- Optimalerweise lässt sich die gefundene Nummer noch gegen eine Bestandsdatenbank prüfen und wird dann dem Ergebnisfeld ‚InsuranceNumber‘ zugewiesen.
Aufbau des erweiterten Zonenlokators
Ziehen Sie die Zone über den Bereich der Beispielseite, in dem die handschriftlichen Nummern vorkommen können:
Weisen Sie der Zone eine RecoStar-Zonen-Engine mit folgenden Einstellungen zu:
Entfernen Sie den Haken bei ‚Registration failure makes zone invalid‘, da bei unstrukturierten Dokumenten die Registrierung fehlschlagen wird, und wir das Ergebnis auf jeden Fall erhalten wollen:
Der Test des erweiterten Zonenlokators liefert dann folgendes Ergebnis:
Das sieht zunächst chaotisch aus, aber in der vierten Zeile von unten, sieht man schon die gewünschte Versicherungsnummer 14-386723-89. Diese muss nun noch per Skripting aus der Ergebniszeichenkette extrahiert werden.
Extraktion der Versicherungsnummer per Skript
Wir nutzen beispielhaft das ‚Document_AfterProcess‘-Event im Skript der Dokumentenklasse ‚InsuranceDocs‘, um die Versicherungsnummer per regulärem Ausdruck aus der Ergebniszeichenkette des erweiterten Zonenlokators zu extrahieren.
Dazu muss zunächst die ‚Microsoft VBScript Regular Expressions 5.5‘-Bibliothek als Referenz eingebunden werden:
Diese Microsoft Bibliothek bietet die Möglichkeit in String-Variablen mit regulären Ausdrücken zu suchen (Microsoft VBScript Regular Expressions 5.5 Erläuterungen ).
Das eigentliche KTM-Skript sieht dann beispielsweise folgendermaßen aus:
1Option Explicit 2 3' Class script: InsuranceDocs 4 5Private Sub Document_AfterProcess(ByVal pXDoc As CASCADELib.CscXDocument) 6 Dim String_RecoStar As String 7 Dim myRegExp As RegExp 8 Dim myMatches As MatchCollection 9 Dim myMatch As Match 10 Dim InsNbr_Recostar As String 11 12 Set myRegExp = New RegExp 13 14 'get the first alternative from the advanced zone locator 15 String_RecoStar=Trim(pXDoc.Locators.ItemByName("Numbers").Alternatives(0).SubFields.ItemByName("UF_Zone0").Text) 16 17 myRegExp.IgnoreCase = True 18 myRegExp.Global = True 19 'define the regular expression for the insurance numbers 20 myRegExp.Pattern = "1(1|2|3|4|5|6|7|8|9)\s?\-\s?\d{6}\s?\-\s?\d{2}" 21 22 Set myMatches = myRegExp.Execute(String_RecoStar) 23 If myMatches.Count>0 Then 'if something was found: 24 'we just take the first result in this example... 25 InsNbr_Recostar=Replace(myMatches.Item(0)," ","") 'get rid of spaces 26 If DB_Check(InsNbr_Recostar)=True Then 'if possible validate the number against a database 27 'put the value into the InsuranceNumber field 28 pXDoc.Fields.ItemByName("InsuranceNumber").Text=InsNbr_Recostar 29 pXDoc.Fields.ItemByName("InsuranceNumber").Valid=True 30 End If 31 End If 32End Sub 33 34Function DB_Check(Number As String) As Boolean 35 DB_Check=True 'just return True in this example 36 'Implement the database validation of the extracted insurance number 37End Function
Die Verarbeitung des Beispieldokuments im KTM Project Builder sollte damit zu folgendem Ergebnis führen:
(1) Bisher erschienene Artikel über KTM:
KTM im Versicherungseinsatz: Heller, grauer und dunkler Posteingang
Dokumentenklassifizierung mit Kofax Transformation Modules (KTM)
Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke – Teil 2
Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke
Weitere Beiträge
von Jürgen Voss
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Jürgen Voss
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.