Os desenvolvedores podem combinar vários motores em suas soluções de reconhecimento. Quando vários motores geram diferentes variantes de reconhecimento para um caractere ou uma palavra, o desenvolvedor pode selecionar a melhor variante por meio de votação entre elas. Para habilitar a votação, o ABBYY FineReader Engine oferece uma API de votação especial que fornece acesso a diferentes hipóteses de reconhecimento de caracteres ou palavras, com os respectivos valores de peso. Além da votação, o desenvolvedor pode usar a API de votação para verificar resultados de reconhecimento usando seus próprios bancos de dados e algoritmos e para corrigir texto. Por exemplo, o desenvolvedor pode formar palavras a partir de letras ou verificar todas as hipóteses geradas.
A API de votação não está disponível para o reconhecimento de textos manuscritos ou em letra de forma.
O objeto WordRecognitionVariants representa uma coleção de hipóteses para uma palavra, e o objeto CharacterRecognitionVariants representa uma coleção de hipóteses para um caractere. Os elementos dessas coleções são os objetos WordRecognitionVariant e CharacterRecognitionVariant, respectivamente.O objeto WordRecognitionVariant representa uma única hipótese para uma palavra e contém o texto da hipótese, o tipo de modelo, a largura média de um traço e informações sobre se a hipótese foi encontrada no dicionário. O método GetCharParams desse objeto fornece acesso aos parâmetros de um único caractere.O objeto CharacterRecognitionVariant representa uma única hipótese para um caractere e contém o nível de confiança do caractere, a probabilidade de que ele tenha sido escrito com uma fonte com serifa e informações sobre se o caractere está em sobrescrito ou subscrito.
Como recuperar variantes de reconhecimento de uma palavra ou caractere
Se você quiser descobrir todas as hipóteses de reconhecimento de uma palavra ou caractere, faça o seguinte:
Defina as propriedades SaveWordRecognitionVariants e SaveCharacterRecognitionVariants do objeto RecognizerParams como TRUE. Isso fará com que o FineReader Engine salve as variantes de reconhecimento nos resultados do reconhecimento.
Passe o objeto RecognizerParams como subobjeto do objeto PageProcessingParams (ou do objeto DocumentProcessingParams, que o contém) para um dos métodos de reconhecimento do ABBYY FineReader Engine.
Esses métodos retornam zero para caracteres não imprimíveis (espaços, retornos de carro etc.) e caracteres que não foram reconhecidos, mas foram adicionados ao texto durante a edição. Zero também é retornado se o texto tiver sido reconhecido por uma das versões anteriores do ABBYY FineReader Engine. As coleções de hipóteses contêm variantes de reconhecimento classificadas da melhor para a pior. Se a propriedade SaveWordRecognitionVariants ou SaveCharacterRecognitionVariants do objeto RecognizerParams estiver definida como FALSE, a coleção correspondente conterá apenas um elemento.
FREngine::IEnginePtr Engine;FREngine::IFRDocumentPtr frDocument;...// Crie o objeto DocumentProcessingParams, configure os parâmetros// e use-o durante o reconhecimentoFREngine::IDocumentProcessingParamsPtr dpp = Engine->CreateDocumentProcessingParams();dpp->PageProcessingParams->RecognizerParams->SaveCharacterRecognitionVariants = VARIANT_TRUE;dpp->PageProcessingParams->RecognizerParams->SaveWordRecognitionVariants = VARIANT_TRUE;frDocument->Process( dpp );// Percorra os blocos de layoutFREngine::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)); }}// Procedimento de geração de hipóteses para todas as palavras e caracteres de um bloco de textovoid 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); } } } }}
Código C#
FREngine.IEngine engine;FREngine.IFRDocument document;...// Crie o objeto DocumentProcessingParams, configure os parâmetros// e use-o durante o reconhecimentoFREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();dpp.PageProcessingParams.RecognizerParams.SaveCharacterRecognitionVariants = true;dpp.PageProcessingParams.RecognizerParams.SaveWordRecognitionVariants = true;document.Process( dpp );// Percorra os blocos de layoutFREngine.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]); }}// Procedimento de geração de hipóteses para todas as palavras e caracteres de um bloco de textovoid 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]; } } } }}
Qual é a diferença entre CharConfidence, ErrorProbability e IsSuspicious
Para determinar se um caractere foi reconhecido de forma pouco confiável e precisa ser verificado, use a propriedade IsSuspicious dos objetos PlainText ou CharParams para o caractere em questão. Ela é calculada com base em ErrorProbability.Para fazer distinções mais detalhadas, você pode usar a propriedade ErrorProbability dos objetos PlainText ou CharParams, que retorna a probabilidade estimada (em uma faixa de 0 a 100) de que o caractere tenha sido reconhecido incorretamente. Ela leva em conta o contexto em que o caractere aparece, por exemplo, se a palavra que contém esse caractere é encontrada no dicionário.Você também pode obter a confiança do caractere, tanto para um caractere reconhecido (a propriedade CharConfidence do objeto PlainText) quanto para todas as variantes de reconhecimento (a propriedade CharConfidence do objeto CharacterRecognitionVariant). A confiança fornece uma estimativa de precisão baseada apenas na imagem de um único caractere, sem considerar o contexto. As estimativas de confiança de caracteres diferentes não são comparáveis, e o único uso seguro da confiança é comparar várias variantes de reconhecimento da mesma imagem (caractere).Nenhuma dessas propriedades faz sentido para símbolos obtidos sem reconhecimento, por exemplo, os extraídos diretamente do arquivo PDF de origem.