Zum Hauptinhalt springen
Entwickler können mehrere Engines in ihren Erkennungslösungen kombinieren. Wenn mehrere Engines unterschiedliche Erkennungsvarianten für ein Zeichen oder Wort erzeugen, kann der Entwickler durch Abstimmung zwischen den Varianten die beste auswählen. Zu diesem Zweck bietet ABBYY FineReader Engine eine spezielle Voting API, die Zugriff auf verschiedene Hypothesen der Zeichen- oder Worterkennung mit den zugehörigen Gewichtungswerten ermöglicht. Darüber hinaus kann der Entwickler die Voting API verwenden, um Erkennungsergebnisse mithilfe eigener Datenbanken und Algorithmen zu prüfen und Text zu korrigieren. So kann der Entwickler beispielsweise Wörter aus Buchstaben zusammensetzen oder alle erzeugten Hypothesen prüfen.
Die Voting API ist für die Erkennung handschriftlicher oder in Druckschrift verfasster Texte nicht verfügbar.
Das Objekt WordRecognitionVariants stellt eine Sammlung von Hypothesen für ein Wort dar, und das Objekt CharacterRecognitionVariants stellt eine Sammlung von Hypothesen für ein Zeichen dar. Die Elemente dieser Sammlungen sind jeweils die Objekte WordRecognitionVariant und CharacterRecognitionVariant. Das Objekt WordRecognitionVariant stellt eine einzelne Hypothese für ein Wort dar und enthält den Text der Hypothese, den Typ des Modells, die durchschnittliche Strichbreite und Informationen darüber, ob die Hypothese im Wörterbuch gefunden wurde. Die Methode GetCharParams dieses Objekts ermöglicht den Zugriff auf die Parameter eines einzelnen Zeichens. Das Objekt CharacterRecognitionVariant stellt eine einzelne Hypothese für ein Zeichen dar und enthält den Konfidenzwert des Zeichens, die Wahrscheinlichkeit, dass ein Zeichen in einer Serifenschrift geschrieben ist, sowie Informationen darüber, ob das Zeichen hochgestellt oder tiefgestellt ist.

So rufen Sie Erkennungsvarianten für ein Wort oder Zeichen ab

Wenn Sie alle Erkennungshypothesen für ein Wort oder Zeichen ermitteln möchten, gehen Sie wie folgt vor:
  1. Setzen Sie die Eigenschaften SaveWordRecognitionVariants und SaveCharacterRecognitionVariants des Objekts RecognizerParams auf TRUE. Dadurch wird FineReader Engine angewiesen, Erkennungsvarianten in den Erkennungsergebnissen zu speichern.
  2. Übergeben Sie das Objekt RecognizerParams als Unterobjekt des Objekts PageProcessingParams (oder des Objekts DocumentProcessingParams, das dieses enthält) an eine der Erkennungsmethoden von ABBYY FineReader Engine.
  3. Auf die Sammlung der Hypothesen kann nach der Erkennung über die Eigenschaften ICharParams::WordRecognitionVariants, ICharParams::CharacterRecognitionVariants und die Methode IParagraph::GetWordRecognitionVariants zugegriffen werden.
Diese Methoden geben für nicht druckbare Zeichen (Leerzeichen, Wagenrückläufe usw.) sowie für Zeichen, die nicht erkannt, aber bei der Bearbeitung zum Text hinzugefügt wurden, null zurück. Null wird auch zurückgegeben, wenn der Text mit einer der früheren Versionen von ABBYY FineReader Engine erkannt wurde. Die Sammlung der Hypothesen enthält Erkennungsvarianten in der Reihenfolge von der besten bis zur schlechtesten. Wenn die Eigenschaft SaveWordRecognitionVariants oder SaveCharacterRecognitionVariants des Objekts RecognizerParams auf FALSE gesetzt ist, enthält die entsprechende Sammlung nur ein Element.

Windows-Beispiele

FREngine::IEnginePtr Engine;
FREngine::IFRDocumentPtr frDocument;
...
// Erstellen Sie das DocumentProcessingParams-Objekt, konfigurieren Sie die Parameter
// und verwenden Sie es bei der Erkennung
FREngine::IDocumentProcessingParamsPtr dpp = Engine->CreateDocumentProcessingParams();
dpp->PageProcessingParams->RecognizerParams->SaveCharacterRecognitionVariants = VARIANT_TRUE;
dpp->PageProcessingParams->RecognizerParams->SaveWordRecognitionVariants = VARIANT_TRUE;
frDocument->Process( dpp );
// Layout-Blöcke durchlaufen
FREngine::ILayoutPtr layout = frDocument->Pages->Item(0)->Layout;
for (int i = 0; i < layout->Blocks->Count; i++) {
 if (layout->Blocks->Item(i)->Type == FREngine::BT_Text) {
  getVariants (layout->Blocks->Item(i));
 }
}
// Prozedur zur Generierung von Hypothesen für alle Wörter und Zeichen eines Textblocks
void getVariants(FREngine::IBlockPtr& block)
{
 FREngine::ICharParamsPtr charParams = Engine->CreateCharParams();
 FREngine::IParagraphsPtr paragraphs = block->GetAsTextBlock()->Text->Paragraphs;
 for (int i = 0; i < paragraphs->Count; i++) {
  for (int j = 0; j < paragraphs->Item(i)->Length; j++) {
   paragraphs->Item(i)->GetCharParams(j, charParams);
   FREngine::ICharacterRecognitionVariantsPtr charVariants = charParams->CharacterRecognitionVariants;
   FREngine::IWordRecognitionVariantsPtr wordVariants = charParams->WordRecognitionVariants;
   if (wordVariants != 0) {
    for (int k = 0; k < wordVariants->Count; k++) {
     FREngine::IWordRecognitionVariantPtr wordVariant = wordVariants->Item(k);
    }
   }
   if (charVariants != 0) {
    for ( int k = 0; k < charVariants->Count; k++) {
     FREngine::ICharacterRecognitionVariantPtr charVariant = charVariants->Item(k);
    }
   }
  }
 }
}
FREngine.IEngine engine;
FREngine.IFRDocument document;
...
// Erstellen Sie das DocumentProcessingParams-Objekt, konfigurieren Sie die Parameter
// und verwenden Sie es bei der Erkennung
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
dpp.PageProcessingParams.RecognizerParams.SaveCharacterRecognitionVariants = true;
dpp.PageProcessingParams.RecognizerParams.SaveWordRecognitionVariants = true;
document.Process( dpp );
// Layout-Blöcke durchlaufen
FREngine.ILayout layout = document.Pages[0].Layout;
for (int i = 0; i < layout.Blocks.Count; i++) {
 if (layout.Blocks[i].Type == FREngine.BlockTypeEnum.BT_Text) {
  getVariants (layout.Blocks[i]);
 }
}
// Prozedur zur Generierung von Hypothesen für alle Wörter und Zeichen eines Textblocks
void getVariants(FREngine.IBlock block)
{
 FREngine.ICharParams charParams = engine.CreateCharParams();
 FREngine.IParagraphs paragraphs = block.GetAsTextBlock().Text.Paragraphs;
 for (int i = 0; i < paragraphs.Count; i++) {
  for (int j = 0; j < paragraphs[i].Length; j++) {
   paragraphs[i].GetCharParams(j, charParams);
   FREngine.ICharacterRecognitionVariants charVariants = charParams.CharacterRecognitionVariants;
   FREngine.IWordRecognitionVariants wordVariants = charParams.WordRecognitionVariants;
   if (wordVariants != null) {
    for (int k = 0; k < wordVariants.Count; k++) {
     FREngine.IWordRecognitionVariant wordVariant = wordVariants[k];
    }
   }
   if (charVariants != null) {
    for ( int k = 0; k < charVariants.Count; k++) {
     FREngine.ICharacterRecognitionVariant charVariant = charVariants[k];
    }
   }
  }
 }
}

Was ist der Unterschied zwischen CharConfidence, ErrorProbability und IsSuspicious

Um festzustellen, ob ein Zeichen unzuverlässig erkannt wurde und überprüft werden muss, verwenden Sie für das betreffende Zeichen die Eigenschaft IsSuspicious des PlainText- oder CharParams-Objekts. Sie wird auf Grundlage von ErrorProbability berechnet. Wenn Sie differenziertere Abstufungen benötigen, können Sie die Eigenschaft ErrorProbability des PlainText- oder CharParams-Objekts verwenden. Sie gibt die geschätzte Wahrscheinlichkeit zurück (im Bereich von 0 bis 100), dass das Zeichen falsch erkannt wurde. Dabei wird der Kontext berücksichtigt, in dem das Zeichen vorkommt, zum Beispiel, ob das Wort mit diesem Zeichen im Wörterbuch enthalten ist. Sie können auch den Konfidenzwert eines Zeichens abrufen, sowohl für ein erkanntes Zeichen (die Eigenschaft CharConfidence des PlainText-Objekts) als auch für alle Erkennungsvarianten (die Eigenschaft CharConfidence des CharacterRecognitionVariant-Objekts). Der Konfidenzwert liefert eine Genauigkeitsschätzung, die nur auf dem Bild eines einzelnen Zeichens basiert, ohne den Kontext zu berücksichtigen. Konfidenzschätzungen für verschiedene Zeichen sind nicht miteinander vergleichbar. Sinnvoll lässt sich der Konfidenzwert nur verwenden, um mehrere Erkennungsvarianten desselben Bildes (Zeichens) zu vergleichen. Keine dieser Eigenschaften ist für Symbole sinnvoll, die ohne Erkennung übernommen wurden, zum Beispiel solche, die direkt aus der PDF-Quelldatei stammen.

Siehe auch

CharacterRecognitionVariant WordRecognitionVariant