跳轉到主要內容
開發人員可以在其識別解決方案中結合多個 Engine。當多個 Engine 對某個字元或單字產生不同的識別變體時,開發人員可以透過對這些結果進行投票,選出最佳結果。為了啟用投票,ABBYY FineReader Engine 提供了專用的 Voting API,可存取字元或單字識別的不同假設及其對應的權重值。除了投票之外,開發人員也可以使用 Voting API,透過自己的資料庫和演算法檢查識別結果,並修正文字。例如,開發人員可以將字母組合成單字,或檢查所有產生的假設。
Voting API 不支援手寫/印刷體手寫文字識別。
WordRecognitionVariants 物件表示單字假設的集合,而 CharacterRecognitionVariants 物件表示字元假設的集合。這些集合中的元素分別是 WordRecognitionVariantCharacterRecognitionVariant 物件。 WordRecognitionVariant 物件表示單字的單一假設,並包含該假設的文字、模型型別、筆劃平均寬度,以及該假設是否已在字典中找到的資訊。此物件的 GetCharParams 方法可讓您存取單一字元的參數。 CharacterRecognitionVariant 物件表示字元的單一假設,並包含字元信心值、字元以襯線字型書寫的機率,以及該字元是否為上標或下標的資訊。

如何取得單字或字元的識別變體

如果您想查看某個單字或字元的所有識別假設,請執行下列操作:
  1. RecognizerParams 物件的 SaveWordRecognitionVariants 和 SaveCharacterRecognitionVariants 屬性設為 TRUE。這會指示 FineReader Engine 在識別結果中儲存識別變體。
  2. 將 RecognizerParams 物件作為 PageProcessingParams 物件的子物件 (或作為包含它的 DocumentProcessingParams 物件的一部分) ,傳遞給 ABBYY FineReader Engine 的其中一個識別方法。
  3. 識別完成後,可透過 ICharParams::WordRecognitionVariantsICharParams::CharacterRecognitionVariants 屬性,以及 IParagraph::GetWordRecognitionVariants 方法存取假設集合。
對於不可列印字元 (空格、換行等) ,以及未被識別但在編輯期間新增到文字中的字元,這些方法會回傳零。如果文字是由舊版 ABBYY FineReader Engine 識別,也會回傳零。假設集合中的識別變體會依品質從高到低排序。如果 RecognizerParams 物件的 SaveWordRecognitionVariants 或 SaveCharacterRecognitionVariants 屬性設為 FALSE,對應的集合將只包含一個元素。

Windows 範例

FREngine::IEnginePtr Engine;
FREngine::IFRDocumentPtr frDocument;
...
// 建立 DocumentProcessingParams 物件、設定參數,
// 並在識別時使用
FREngine::IDocumentProcessingParamsPtr dpp = Engine->CreateDocumentProcessingParams();
dpp->PageProcessingParams->RecognizerParams->SaveCharacterRecognitionVariants = VARIANT_TRUE;
dpp->PageProcessingParams->RecognizerParams->SaveWordRecognitionVariants = VARIANT_TRUE;
frDocument->Process( dpp );
// 逐一處理版面區塊
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));
 }
}
// 為文字區塊中的所有單字和字元產生假設的程序
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;
...
// 建立 DocumentProcessingParams 物件、設定參數,
// 並在識別時使用
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
dpp.PageProcessingParams.RecognizerParams.SaveCharacterRecognitionVariants = true;
dpp.PageProcessingParams.RecognizerParams.SaveWordRecognitionVariants = true;
document.Process( dpp );
// 逐一處理版面區塊
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]);
 }
}
// 為文字區塊中的所有單字和字元產生假設的程序
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];
    }
   }
  }
 }
}

CharConfidence、ErrorProbability 與 IsSuspicious 之間有何差異

若要判斷某個字元是否識別結果不可靠且需要驗證,請使用該字元在 PlainTextCharParams 物件中的 IsSuspicious 屬性。此屬性是根據 ErrorProbability 計算而得。 若要實作更細微的區分,您可以使用 PlainTextCharParams 物件中的 ErrorProbability 屬性,該屬性會回傳該字元被錯誤識別的估計機率 (範圍為 0 到 100) 。它也會考量字元所處的上下文,例如包含此字元的單字是否存在於字典中。 您也可以取得字元信心值,包括已識別字元的信心值 (PlainText 物件中的 CharConfidence 屬性) ,以及所有識別變體的信心值 (CharacterRecognitionVariant 物件中的 CharConfidence 屬性) 。信心值僅根據單一字元的影像提供準確度估計,不考慮上下文。不同字元的信心值估計彼此無法比較,因此,信心值唯一安全的用途是比較同一影像 (字元) 的多個識別變體。 對於未經識別而取得的符號,這些屬性都沒有意義,例如直接從來源 PDF 檔案擷取的符號。

另請參閱

CharacterRecognitionVariant WordRecognitionVariant