> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 高品質または低品質の認識結果に対する日付検索

> SearchOfDate.fsp FlexiLayout サンプルで Date、Character String、Object Collection 要素を組み合わせて、低品質の画像上の日付を特定します。

このセクションでは、低品質の画像上の日付フィールドを検索する FlexiLayout を作成する、代表的ないくつかの方法について説明します。このような画像は非常によく見られ、多くの場合、不適切なスキャン設定に起因するさまざまなスキャン不良を含んでいます。たとえば、明るさの設定が適切でないと、画像が明るすぎたり暗すぎたりすることがあります。その結果、画像内の一部の情報が失われたり、画像の一部にノイズが生じたりすることがあります。

<div id="when-the-date-element-cannot-detect-a-date">
  ## Date 要素で日付を検出できない場合
</div>

FlexiLayout Studio には、日付を検出するための特別な **Date** 要素があります。ただし、FlexiLayout を作成する際に、この要素だけでは不十分な場合があります。これは、ドキュメント上の日付が **Date** 要素で使用可能なフォーマットのいずれにも一致しない場合に起こります。

たとえば、FlexiLayout Studio では、日付フィールド内の月を指定する際に、次の言語を使用できます: English、Czech、Danish、Dutch、Estonian、Finnish、French、German、Greek、Hungarian、Italian、Latvian、Lithuanian、Norwegian、Polish、Portuguese、Russian、Spanish、Swedish、Turkish。

月が一覧にない言語で単語として記載されている場合、その日付は使用可能なフォーマットのいずれにも該当しないため、**Date** 要素では検出できません。

また、画像に除去できない要素がある場合にも、日付検索エラーが発生することがあります。たとえば、日付に下線が引かれていて日付と下線の間に目に見える隙間がない場合、取り消し線が引かれている場合、または黒い区切り線 (フレーム、コーム) 付きの character cells に記入されている場合です。

さらに、検索領域内の斑点ノイズや、日付がタイプ入力ではなく手書きで記入されていることも、日付検索に **Date** 要素を使用できない原因になります。

<div id="the-searchofdatefsp-sample-project">
  ## SearchOfDate.fsp sample プロジェクト
</div>

日付フィールドを検索する方法については、sample プロジェクト `SearchOfDate.fsp` (フォルダー `%public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Date`) で詳しく説明されています。

このプロジェクトには 5 つのページがあります。

| ページ   | 説明                                |
| :---- | :-------------------------------- |
| ページ 1 | 日付フォーマットは **Date** 要素を使用して記述できます。 |
| ページ 2 | 日付内の月はフランス語で記載されています。             |
| ページ 3 | 日付には下線が引かれています。                   |
| ページ 4 | 日付フィールドにはノイズがあります。                |
| ページ 5 | 日付は手書きで記入されています。                  |

目的は、**Date** 要素でサポートされていない日付フォーマットの画像も含め、すべての画像から日付を見つけることです。

<div id="search-for-supported-date-formats-with-the-date-element">
  ## Date 要素でサポートされている日付フォーマットを検索する
</div>

日付フィールドを記述するすべての要素は、**DateGroup** 要素にまとめられています。まず、このグループには日付フィールドの名前を検索する要素があります。sample プロジェクトでは、これは **DateHeader** という名前の **Static Text** 型の要素で、唯一の値は **Date:** です。

<Note>
  **Relations** セクションですべての要素の検索条件を設定するのは難しくないため、ここでは説明しません。詳細はプロジェクト内で直接確認できます。
</Note>

このグループには、**DateField** という名前の **Date** 要素も含まれています。この要素は、**Date** 要素でサポートされているフォーマットの日付フィールドを検索します。

プロジェクトを見ると、**Date** 要素で日付を検出できるのは最初のページだけです。

<div id="search-for-other-date-formats-with-a-character-string-element">
  ## Character String 要素を使用して別の日付フォーマットを検索する
</div>

他のページ上の日付を検索するために、このプロジェクトでは **DateAsString** という名前の **Character String** 要素を使用します。この要素では、画像に現れる可能性が高いすべての文字を表すためにアルファベットを使用します。

<Note>
  データfield内の内容が構造化されていて、**Date** 要素でサポートされていないフォーマットを持つ場合は、アルファベットを指定する代わりに、正規表現でそのフォーマットを記述することをお勧めします。

  ただし、正規表現では field と記述された構造が 100% 一致していることが前提となるため、処理対象の画像の品質が高いことを確実に把握しておく必要があります (これに対してアルファベットでは、要素のプロパティで指定した一定割合のエラーを許容できます) 。したがって、認識精度を保証できない場合は、アルファベットの方がより柔軟な手段です。

  日付内の月が 事前認識 言語と同じ言語の単語で記載されることがわかっている場合は、日付フィールドを 3 つのセクション (日、月、年度) に分け、**Static Text** 型の要素を使用して月の field を個別に検索することをお勧めします。

  このような Static Text 要素では、月の考えられるすべての表記バリエーション (たとえば、その言語における月の正式名称と省略形) を記述する必要があります。その後、日と年度の fields は、**Character String** 要素を使って月の右側と左側から見つけることができます。
</Note>

<Frame>
  <img src="https://mintcdn.com/abbyy/lqYknuOmCa79141v/images/flexi-capture/fls/edit_alph.gif?fit=max&auto=format&n=lqYknuOmCa79141v&q=85&s=6a285e2e59f7f19a0125c3e150e88979" alt="DateAsString Character String 要素で許可される文字を指定するために ABBYY FlexiLayout Studio で使用されるアルファベットエディターのスクリーンショット。" width="536" height="350" data-path="images/flexi-capture/fls/edit_alph.gif" />
</Frame>

FlexiLayout matching を最適化するために、**DateAsString** 要素の Advanced pre-search relations field には次の条件が設定されています。

```text theme={null}
if (DateField.IsNull == FALSE) then Dontfind();
```

次と同じです:

```text theme={null}
if not DateField.IsNull then Dontfind();
```

この条件は、**Date** 要素で日付を検出できない場合にのみ、文字列として日付を検索することを意味します。

プロジェクトが示すように、**DateAsString** 要素は、**Date** 要素では検出できなかった残りのプロジェクトページ上の日付を見つけます。

<div id="capture-partially-recognized-dates-with-an-object-collection-element">
  ## Object Collection 要素で部分的に認識された日付を抽出する
</div>

ただし、4 ページ目では、検出された文字列には日付フィールドの一部しか含まれていません。日付フィールドの事前認識結果を確認すると (ツールバーの **Show Raw Objects** をクリック) 、部分的にしか検出されなかった理由が明らかになります。検索領域には text objects だけでなく、Picture や Punctuation mark など、ほかの型のオブジェクトも含まれています。

このような状況は低品質の画像ではよく見られ、事前認識の段階で text objects が常に認識されるとは限りません。

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/prop_search_elements.gif?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=824530b896543e43de095ddbc6a7fe18" alt="ABBYY FlexiLayout Studio における事前認識の生オブジェクトのスクリーンショット。日付フィールドの検索領域に text、picture、punctuation mark のオブジェクトが含まれていることを示しています。" width="431" height="455" data-path="images/flexi-capture/fls/prop_search_elements.gif" />
</Frame>

日付フィールドに関連するすべてのオブジェクトを見つけるため、このプロジェクトでは **DateAsObjectCollection** という名前の **Object Collection** 要素を使用します。事前認識中に日付フィールドで検出されたすべてのオブジェクト型を、その要素のプロパティで指定します。

FlexiLayout のマッチングを最適化するため、**DateAsObjectCollection** 要素と **DateAsString** 要素の Advanced pre-search relations field には、次の条件が指定されています。

```text theme={null}
if (DateField.IsNull == FALSE) then Dontfind();
```

<Note>
  条件 `if (DateAsString.IsNull == FALSE) then Dontfind()` は、**DateAsObjectCollection** 要素の Advanced properties には追加できません。これは、例が示すように、検出された文字列に日付の一部しか含まれない場合があるためです。
</Note>

<div id="define-the-date-block-region-from-alternativedategroup">
  ## AlternativeDateGroup から Date ブロックの領域を定義する
</div>

この段階で、日付フィールドの検索条件を記述する要素セットは完成しています。**DateField**、**DateAsString**、**DateAsObjectCollection** の各要素で構成される Group 要素 `SearchElements.DateGroup.AlternativeDateGroup` は、プロジェクトツリーで **Date** ブロックのソース要素として指定されています。

**DateAsString** 要素と **DateAsObjectCollection** 要素のプロパティを記述するために `Dontfind()` メソッドが使用されているため、検出されたブロックの実際の領域は、**Date** 要素の 仮説 によって見つかった領域か、**DateAsObjectCollection** 要素と **DateAsString** 要素の領域を結合したものの、いずれかに一致します。

後者の場合、**DateAsString** 要素の領域は **DateAsObjectCollection** 要素の領域の一部であることが想定されるため、結果の領域は **DateAsObjectCollection** 要素の領域になります。

<Note>
  この場合は状況が比較的単純なので、Group 要素 `SearchElements.DateGroup.AlternativeDateGroup` をソース要素として指定できます。グループの領域は、検出されたサブ要素の領域を組み合わせたものになります。

  `Dontfind()` メソッドを使用すると、一部のサブ要素の検索を省略できます。そのため、Group 要素 `SearchElements.DateGroup.AlternativeDateGroup` の領域は、そのサブ要素の領域に一致します。ここで示した例では、`Dontfind()` メソッドは FlexiLayout matching の最適化に役立つだけでなく、ブロックの記述も簡潔にします。
</Note>

または、Expression セクションで次のコードを使用できます。

```text theme={null}
Rect OutputRect;
let dateGroup = SearchElements.DateGroup.AlternativeDateGroup;
if (dateGroup.DateField.IsNull == FALSE) then
outputRect = dateGroup.DateField.Rect;
else
outputRect = dateGroup.DateAsObjectCollection.Rect;
OutputRegion = outputRect;
```

Expression を使用すると、利用できるオプションが増えます。たとえば、**DateAsString** 要素の region が、実際に **DateAsObjectCollection** の region の一部であるかどうかを確認できます。

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/search_date.png?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=49c5578cea473c4c03cec2281be1f73f" alt="SearchOfDate.fsp Project の AlternativeDateGroup 要素から Date ブロックの出力 region を定義する FlexiLayout language コードを示した、ABBYY FlexiLayout Studio の Expression セクションのスクリーンショット。" width="532" height="498" data-path="images/flexi-capture/fls/search_date.png" />
</Frame>

<Note>
  文字列形式を定義せず、またこの例のように **Object Collection** 要素も使用しないで日付フィールドを探すために **Character String** 要素を使用した場合でも、日付フィールドの 検索領域 を明確に定義できれば、良好な結果が得られることがあります。

  ただし、検索領域 内に複数の文字列がある場合は、正規表現 またはより限定的なアルファベットを使って文字列形式を記述する必要があります。そうしないと、最終的な仮説が期待どおりにならない可能性があります。

  **Character String** 要素では、誤った仮説を除外するために、文字列内の文字数、単語末尾の数、スペースの長さを制限できます。**Object Collection** 要素を使用する場合、仮説には、画像上で 検索領域 内にあり、object サイズの制約を満たすすべての objects が含まれます。
</Note>
