メインコンテンツへスキップ
開発者は、認識ソリューションで複数の Engine を組み合わせて使用できます。複数の Engine が同じ文字または単語に対して異なる認識候補を生成した場合、開発者はそれらの候補に対して投票を行い、最適な候補を選択できます。投票を有効にするため、ABBYY FineReader Engine には特別な Voting API が用意されており、文字または単語の認識に関するさまざまな仮説と、それぞれに対応する重み値にアクセスできます。投票に加えて、開発者は Voting API を使用して、独自のデータベースやアルゴリズムで認識結果を検証したり、テキストを修正したりすることもできます。たとえば、文字から単語を組み立てたり、生成されたすべての仮説を確認したりできます。
Voting API は、手書き文字/手書き活字の認識では使用できません。
WordRecognitionVariants オブジェクトは単語に対する仮説のコレクションを表し、CharacterRecognitionVariants オブジェクトは文字に対する仮説のコレクションを表します。これらのコレクションの要素は、それぞれ WordRecognitionVariant オブジェクトと CharacterRecognitionVariant オブジェクトです。 WordRecognitionVariant オブジェクトは、単語に対する単一の仮説を表し、仮説のテキスト、Model の種類、ストロークの平均幅、およびその仮説が辞書で見つかったかどうかに関する情報を含みます。このオブジェクトの GetCharParams メソッドを使用すると、1 文字のパラメーターにアクセスできます。 CharacterRecognitionVariant オブジェクトは、文字に対する単一の仮説を表し、文字の信頼度、文字がセリフ体フォントで書かれている確率、およびその文字が上付き文字か下付き文字かに関する情報を含みます。

単語または文字の認識仮説を取得する方法

単語または文字について、すべての認識仮説を確認するには、次の操作を行います。
  1. RecognizerParams オブジェクト の SaveWordRecognitionVariants プロパティと SaveCharacterRecognitionVariants プロパティを TRUE に設定します。これにより、FineReader Engine は認識結果に認識仮説を保存するようになります。
  2. RecognizerParams オブジェクト を PageProcessingParams オブジェクト (またはそれを含む DocumentProcessingParams オブジェクト) の subobject として、ABBYY FineReader Engine のいずれかの認識メソッドに渡します。
  3. 仮説の コレクション には、認識後に ICharParams::WordRecognitionVariantsICharParams::CharacterRecognitionVariants プロパティ、および IParagraph::GetWordRecognitionVariants メソッドからアクセスできます。
これらのメソッドは、印字できない文字 (スペース、改行など) や、認識されなかったものの編集中にテキストへ追加された文字に対しては 0 を返します。テキストが以前の ABBYY FineReader Engine のいずれかのバージョンで認識された場合も、0 が返されます。仮説の コレクション には、最良のものから最も低いものまで順位付けされた認識仮説が含まれます。RecognizerParams オブジェクト の SaveWordRecognitionVariants プロパティまたは SaveCharacterRecognitionVariants プロパティが FALSE に設定されている場合、対応する コレクション には 1 つの要素だけが含まれます。

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 の違い

文字が不確実に認識されており、確認が必要かどうかを調べるには、その文字に対応する PlainText オブジェクトまたは CharParams オブジェクトの IsSuspicious プロパティを使用します。この値は ErrorProbability に基づいて計算されます。 より細かく判定したい場合は、PlainText オブジェクトまたは CharParams オブジェクトの ErrorProbability プロパティを使用できます。このプロパティは、その文字が誤認識された推定確率 (0 ~ 100 の範囲) を返します。この値では、その文字が現れる文脈も考慮されます。たとえば、その文字を含む単語が辞書に存在するかどうかなどです。 認識された文字の文字信頼度 (PlainText オブジェクトの CharConfidence プロパティ) と、すべての認識候補の文字信頼度 (CharacterRecognitionVariant オブジェクトの CharConfidence プロパティ) も取得できます。信頼度は、文脈を考慮せず、1 文字の画像だけに基づいて精度を推定した値です。異なる文字どうしで信頼度の推定値を比較することはできません。信頼度を安全に使用できるのは、同じ画像 (文字) に対する複数の認識候補を比較する場合だけです。 これらのプロパティはいずれも、認識処理を経ずに取得されたシンボルには意味がありません。たとえば、ソース PDF ファイルから直接取得されたシンボルが該当します。

関連項目

CharacterRecognitionVariant WordRecognitionVariant