Los desarrolladores pueden combinar varios motores en sus soluciones de reconocimiento. Cuando varios motores generan distintas variantes de reconocimiento para un carácter o una palabra, el desarrollador puede seleccionar la mejor mediante votación entre las variantes. Para habilitar la votación, ABBYY FineReader Engine dispone de una API de votación especial que proporciona acceso a distintas hipótesis de reconocimiento de caracteres o palabras con sus valores de ponderación correspondientes. Además de la votación, el desarrollador puede usar la API de votación para comprobar los resultados del reconocimiento con sus propias bases de datos y algoritmos, así como para corregir texto. Por ejemplo, el desarrollador puede formar palabras a partir de letras o comprobar todas las hipótesis generadas.
La API de votación no está disponible para el reconocimiento de textos manuscritos o en letra de imprenta.
El objeto WordRecognitionVariants representa una colección de hipótesis para una palabra, y el objeto CharacterRecognitionVariants representa una colección de hipótesis para un carácter. Los elementos de estas colecciones son los objetos WordRecognitionVariant y CharacterRecognitionVariant, respectivamente.El objeto WordRecognitionVariant representa una única hipótesis para una palabra y contiene el texto de la hipótesis, el tipo de modelo, el ancho medio del trazo e información sobre si la hipótesis se ha encontrado en el diccionario. El método GetCharParams de este objeto proporciona acceso a los parámetros de un solo carácter.El objeto CharacterRecognitionVariant representa una única hipótesis para un carácter y contiene la confianza del carácter, la probabilidad de que un carácter esté escrito con una fuente con serif y la información sobre si el carácter es superíndice o subíndice.
Cómo obtener variantes de reconocimiento de una palabra o un carácter
Si desea conocer todas las hipótesis de reconocimiento de una palabra o un carácter, haga lo siguiente:
Establezca las propiedades SaveWordRecognitionVariants y SaveCharacterRecognitionVariants del objeto RecognizerParams en TRUE. Esto indica a FineReader Engine que guarde las variantes de reconocimiento en los resultados del reconocimiento.
Pase el objeto RecognizerParams como subobjeto del objeto PageProcessingParams (o del objeto DocumentProcessingParams, que lo contiene) a uno de los métodos de reconocimiento de ABBYY FineReader Engine.
Estos métodos devuelven cero para los caracteres no imprimibles (espacios, retornos de carro, etc.) y para los caracteres que no se reconocieron, pero se agregaron al texto durante la edición. También se devuelve cero si el texto se reconoció con una de las versiones anteriores de ABBYY FineReader Engine. Las colecciones de hipótesis contienen variantes de reconocimiento ordenadas de la mejor a la peor. Si la propiedad SaveWordRecognitionVariants o SaveCharacterRecognitionVariants del objeto RecognizerParams está establecida en FALSE, la colección correspondiente contendrá un solo elemento.
FREngine::IEnginePtr Engine;FREngine::IFRDocumentPtr frDocument;...// Cree el objeto DocumentProcessingParams, configure los parámetros// y úselo durante el reconocimientoFREngine::IDocumentProcessingParamsPtr dpp = Engine->CreateDocumentProcessingParams();dpp->PageProcessingParams->RecognizerParams->SaveCharacterRecognitionVariants = VARIANT_TRUE;dpp->PageProcessingParams->RecognizerParams->SaveWordRecognitionVariants = VARIANT_TRUE;frDocument->Process( dpp );// Recorra los bloques 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)); }}// Procedimiento para generar hipótesis para todas las palabras y los caracteres de un bloque 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;...// Cree el objeto DocumentProcessingParams, configure los parámetros// y úselo durante el reconocimientoFREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();dpp.PageProcessingParams.RecognizerParams.SaveCharacterRecognitionVariants = true;dpp.PageProcessingParams.RecognizerParams.SaveWordRecognitionVariants = true;document.Process( dpp );// Recorra los bloques 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]); }}// Procedimiento para generar hipótesis para todas las palabras y los caracteres de un bloque 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]; } } } }}
¿Cuál es la diferencia entre CharConfidence, ErrorProbability e IsSuspicious?
Para determinar si un carácter se reconoció de forma poco fiable y necesita verificación, use la propiedad IsSuspicious de los objetos PlainText o CharParams para el carácter en cuestión. Se calcula a partir de ErrorProbability.Para implementar distinciones más precisas, puede usar la propiedad ErrorProbability de los objetos PlainText o CharParams, que devuelve la probabilidad estimada (en un rango de 0 a 100) de que el carácter se haya reconocido incorrectamente. Tiene en cuenta el contexto en el que aparece el carácter, por ejemplo, si la palabra que contiene ese carácter se encuentra en el diccionario.También puede obtener la confianza del carácter, tanto para un carácter reconocido (la propiedad CharConfidence del objeto PlainText) como para todas las variantes de reconocimiento (la propiedad CharConfidence del objeto CharacterRecognitionVariant). La confianza proporciona una estimación de precisión basada únicamente en la imagen de un carácter, sin tener en cuenta el contexto. Las estimaciones de confianza para distintos caracteres no son comparables, y el único uso seguro de la confianza es comparar varias variantes de reconocimiento de la misma imagen (carácter).Ninguna de estas propiedades tiene sentido para los símbolos obtenidos sin reconocimiento, por ejemplo, los tomados directamente del archivo PDF de origen.