跳转到主要内容
开发者可以在其识别解决方案中组合多个引擎。当多个引擎对某个字符或单词生成不同的识别变体时,开发者可以通过对这些候选结果进行投票来选出最佳结果。为启用投票,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