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:
Option Explicit
' Class script: InsuranceDocs
Private Sub Document_AfterProcess(ByVal pXDoc As CASCADELib.CscXDocument)
Dim String_RecoStar As String
Dim myRegExp As RegExp
Dim myMatches As MatchCollection
Dim myMatch As Match
Dim InsNbr_Recostar As String
Set myRegExp = New RegExp
'get the first alternative from the advanced zone locator
String_RecoStar=Trim(pXDoc.Locators.ItemByName("Numbers").Alternatives(0).SubFields.ItemByName("UF_Zone0").Text)
myRegExp.IgnoreCase = True
myRegExp.Global = True
'define the regular expression for the insurance numbers
myRegExp.Pattern = "1(1|2|3|4|5|6|7|8|9)\s?\-\s?\d{6}\s?\-\s?\d{2}"
Set myMatches = myRegExp.Execute(String_RecoStar)
If myMatches.Count>0 Then 'if something was found:
'we just take the first result in this example...
InsNbr_Recostar=Replace(myMatches.Item(0)," ","") 'get rid of spaces
If DB_Check(InsNbr_Recostar)=True Then 'if possible validate the number against a database
'put the value into the InsuranceNumber field
pXDoc.Fields.ItemByName("InsuranceNumber").Text=InsNbr_Recostar
pXDoc.Fields.ItemByName("InsuranceNumber").Valid=True
End If
End If
End Sub
Function DB_Check(Number As String) As Boolean
DB_Check=True 'just return True in this example
'Implement the database validation of the extracted insurance number
End 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