図1は、本発明の一実施の形態の帳票認識装置のブロック図、図2は、本発明の一実施の形態に用いられる第1の帳票例の説明図、図3は、本発明の一実施の形態に用いられる第2の帳票例の説明図である。
図1に示すように、リーダー1000は、帳票を光学的に読み取る。プロセッサ(CPU)1001は、帳票を解析して、文字認識を行う。メモリ1002は、見出し文言辞書1003、一般辞書1004を格納する。見出し文言辞書1003は、予め定められた見出し文言とそのイメージデータを格納する。一般辞書1004は、データ部分の文字認識のため、文字認識カテゴリー/文字フォント別の辞書を格納する。
CPU1001は、帳票の罫線と、罫線により構成される最小矩形を抽出する罫線抽出部1005と、抽出した最小矩形の並びを解析して、表構造う解析する解析部1006と、解析した表構造から、各最小矩形の属性を決定する属性決定部1007と、属性に従い、文字認識を行う文字認識部1008とを有する。尚、後述するように、これら各部は、CPU1001が行う処理をブロックで表現したものである。
図2は、解析される第1の帳票例を示す。この帳票は、振込依頼書である。図2の第1の帳票は、依頼人、依頼日、振込予定日、振込先(銀行名、支店名)、科目、口座番号、受取人名、金額、小計、合計を記入するものである。この帳票において、(数字)は、横方向に延びる横罫線を、〔数字〕は、縦方向に延びる縦罫線を、数字は、縦罫線及び横罫線で囲まれる最小矩形(以降、罫線項目と呼ぶ)を示す。従って、図2の帳票は、20の横罫線(1)〜(20)と、13の縦罫線〔1〕〜〔13〕と、176の罫線項目1〜176とで構成されている。
図3は、解析される第2の帳票例を示す。この帳票も、振込依頼書である。図3の第2の帳票は、依頼人、銀行名、支店名、科目、口座番号、受取人名、金額、小計、合計、適用、備考を記入するものである。この帳票においても、(数字)は、横方向に延びる横罫線を、〔数字〕は、縦方向に延びる縦罫線を、数字は、縦罫線及び横罫線で囲まれる最小矩形(以降、罫線項目と呼ぶ)を示す。従って、図3の帳票は、30の横罫線(1)〜(30)と、20の縦罫線〔1〕〜〔20〕と、171の罫線項目1〜171とで構成されている。この帳票は、表の部分が2つに分割されている。
本発明は、このような表構造を有する帳票の各罫線項目の種類等を自動解析するものである。
図4及び図5は、本発明の一実施の形態の全体フロー図、図6乃至図25は、その処理の説明図である。
(S1)CPU1001は、帳票のイメージデータから帳票上の横罫線と縦罫線と、横罫線と縦罫線に囲まれた最小矩形(罫線項目)を抽出する。図6(A)の示すように、イメージデータの黒ドットが連続する数を数え、一定数以上のドットが連続した場合に、横罫線又は縦罫線と判断する。図6(B)は、横罫線と縦罫線との例を示す。罫線は、物理的な座標として抽出され、縦及び横罫線を開始座標と終了座標で示す。罫線項目は、図6(C)に示すように、2本づつの縦罫線及び横罫線で囲まれる最小矩形を抽出したものである。この罫線項目も、開始座標と終了座標で示す。
次に、CPU1001は、イメージデータの帳票の斜度を算出し、斜度に合わせて罫線項目、横罫線、縦罫線の各開始座標及び終了座標を補正する。
(S2)CPU1001は、図7に示すように、各罫線項目を、接続する位置関係にあるもの同志が同じグループになるように、分類する。各罫線項目の座標を参照して、上下又は左右に接続する位置関係にあるもの同志を同じグループに分類する。図7に示すように、図2の第1の帳票は、3つのグループに分類される。図8は、接続関係の態様を示したものである。図8に示すように、罫線項目が接続しているかを判断するには、横方向又は縦方向に完全の接続している場合のみならず、罫線項目間の距離が、横方向又は縦方向で、所定の閾値の範囲内にあるものも、接続していると判断する。
(S3)次に、CPU1001は、グループを表の構成要素単位に分類する。罫線項目を分類したグループを、更にグループ毎に、表構造の構成単位に細分化する。図9に示すように、構成単位とは、グループの主となる表の部分、上側に突出した部分(上凸部)、下側に突出した部分(下凸部)からなる。このため、各罫線が、座標からどのグループ内に位置するか(どのグループを構成しているか)を判定する。そして、ぞれぞれのグループ単位に、2本づつの縦罫線及び横罫線で矩形(正方形、長方形)を構成できるものを探す。そして、罫線で構成される矩形の中で、最も大きいものをグループ内での最大矩形とする。グループ単位に、最大矩形に含まれない位置に存在する罫線項目を探索し、最大矩形の上側に位置するものを、上凸部、下側に位置するものを下凸部と分類する。そして、最大矩形に含まれる罫線項目を主表部に分類する。以降、この細分化した単位をグループと呼ぶ。
図9の帳票で、最大矩形を求めた場合、最大矩形は、横罫線a、横罫線b、縦罫線c、縦罫線dで囲まれる範囲となる。従って、主表部は、罫線項目3〜26、上凸部は、罫線項目1〜2、下凸部は、罫線項目27〜32となる。
(S4)CPU1001は、表の構成要素単位のグループを論理行に分類する。グループ単位に、構成する罫線項目を、行方向(帳票の横方向)に論理的接続を持つもの同志を纏めた論理行に、分類する。ここで言う論理的な接続とは、同幅接続という概念により接続する状態にあるものをいう。
同幅接続の関係にある罫線項目は、同一の論理行を構成すると判断する。同幅接続について、図10(A)乃至図10(D)により、説明する。
図10(A)に示すように、罫線項目が、同じ行幅で隣接し、且つ互いに罫線項目の構成線分を共有する場合、参照中の罫線項目が同一の論理行を構成すると判断する。図10(A)では、罫線項目Aと罫線項目Bでは、線分a4と線分b1とが同一の線分であり、線分の長さも同一であることから、2つの罫線項目は、接続状態にあると判断する。
図10(B)に示すように、罫線項目同志が近接し、同じ行幅を持つ場合、参照中の罫線項目が同一の論理行を構成すると判断する。図10(B)に示すように、罫線項目Aと罫線項目Bとの距離dが、所定の閾値以下で、線分a4と線分b2が同じ長さである場合、2つの罫線項目は、接続状態にあると判断する。
図10(C)に示すように、1つの罫線項目に対し、複数の罫線項目が同じ幅で隣接し、互いに罫線項目の構成線分を共有する場合、参照中の罫線項目が同一の論理行を構成すると判断する。図10(C)では、罫線項目Bの線分b2と罫線項目Cの線分c2との和が、罫線項目Aの線分a4の長さと同じであることから、3つの罫線項目は、接続状態にあると判断する。
図10(D)に示すように、各罫線項目が近接し、1つの罫線項目の行幅と、複数の罫線項目の行幅の和が同じ場合には、参照中の罫線項目が同一の論理行を構成すると判断する。図10(D)では、罫線項目Bと罫線項目Cとの距離d2が、閾値以下であり、且つ罫線項目Aと罫線項目B、Cとの距離d1が閾値以下である。罫線項目Bの線分b2と罫線項目Cの線分c2との和が、罫線項目Aの線分a4の長さにほぼ等しいことから、3つの罫線項目は、接続状態にあると判断する。
このようにして、各グループを論理行に分類する。図11に示すように、図2の帳票のグループ3は、11の論理行に分類される。
次に、行方向の入れ子構造部を解析する。複数の罫線項目から構成される矩形が論理的な意味をもつものを、入れ子構造という。図12(A)に示すように、「振込先」の項目に対して、「銀行名」及び「支店名」の項目は、関係するから、この部分を入れ子構造と定義する。図12(B)に示すように、図12(A)の場合には、罫線項目1(振込先)が、罫線項目2(銀行名)の親である。従って、罫線項目1と2に、親子関係を設定する。罫線項目2(銀行名)と罫線項目3(支店名)とは、兄弟関係(同レベル関係)である。従って、罫線項目2と3に、兄弟関係を設定する。
又、図3の第2の帳票例のように、レイアウトの都合上、表構成部を左右に分割している場合がある。これを、表の構造の論理的意味から判断すると、表構造を決定する上で、1つの表構造としてまとめる必要がある。このため、図13に示すように、左右に並んで位置するグループが複数存在する場合に、それぞれのグループを構成する論理行構造を判定する。それぞれの論理行によるグループの構造が同じ場合に、表構造を統合する。
更に、左右に分割されている表の一部が掠れ等により消失した場合に、その部分に罫線を作成する。前述の左右に分離された表を統合する場合に、一方の表のどれかの罫線が掠れ等で消失している場合がある。図14に示すように、罫線が消失している部分以外は、2つのグループの論理行構造が一致していることから、他方の論理行構造と一方の論理行構造とを合わせるように、罫線を新規に作成する。これにより、生成した罫線を含む罫線項目を生成する。このように、罫線を作成した後、前述の表構造の統合処理を行う。
(S5)次に、連続する同じ構造の論理行をブロック単位に纏める。1グループ内で上下に隣り合う論理行同志の構造を比較する。そして、同じ構造を持つ論理行同志を1ブロックに分類する。論理行の比較要素として、構成する罫線項目の数、論理行中の罫線項目の配置、論理行の高さと幅がある。これらを比較して、同じ構造を持つか判定する。
図15の帳票例では、1つのグループの7つの論理行が、3つのブロック1〜3に分類される。ブロック1は、論理行1で構成され、ブロック2は、論理行2〜6で構成され、ブロック3は、論理行7で構成される。
又、異なる構造のブロック間を同一のブロック構造に変換する。即ち、表の一部の罫線が掠れ等で消失している場合に、他の論理行構造から消失した罫線を新規に生成する。それに伴い罫線項目を生成する。
図16の表の例で説明すると、罫線が消失し、ブロック1〜5に分類されている。しかし、ブロック2とブロック4は、同一の構造を持つブロックである。従って、ブロック3に、罫線を作成する。これにより、ブロック2〜ブロック4は、同一の構造となる。これにより、ブロックを3つに統合する。
次に、消し線により分割された論理行を統合する。金融機関で扱う給与振込帳票等では、処理の対象としないことを明確にするため、消し線で取引部分を消去する場合がある。この場合、消し線は罫線として抽出されるため、解析結果は、不正確になる。従って、消し線を除いて、表構造の解析を行う必要がある。ブロックに分類された状態では、消し線で引かれた部分のブロックは、次の特徴がある。
第1に、上下に別のブロックが存在する。第2に、上側ブロックと下側ブロックは、同じ構造を持つ。この特徴を持つブロックが存在する場合に、当ブロック内で、消し線による罫線を除いたブロックを作成する。そして、このブロックが、上側ブロックと同一構造となる場合に、消し線が引かれたことにより、ブロック構造が変化したものと判断する。そして、消し線を消去し、これに伴って、罫線項目、論理行、及びブロックを再作成する。
図17に示すように、ブロック3とブロック5に消し線が存在すると、ブロックは7つに分類される。ここで、ブロック2とブロック4は、同じ構造であり、,ブロック3の消し線を消去すると、ブロック2と同じ構造となる。又、ブロック4〜6についても、同様である。従って、消し線を消去し、罫線項目、論理行を再作成する。それに伴い、ブロックも作成し直す。これにより、3ブロックに再分類される。
(S6)次に、論理列構造を判定する。表構造を持つものは、文言固定部と、文言可変部とからなる。文言固定部は、表の見出し部分などの帳票の固定部分である。文言可変部は、表のデータ部分などの帳票の可変部分である。論理列構造の判定は、文言固定部と文言可変部との論理列構造を判定する。即ち、上下に接続するブロックの間で、同じ列構造を持つかを判定する。そして、同じ列構造を持つ場合、それらブロックを論理列の単位で統合する。例えば、図18(A)の例では、論理列は、6つに分類される。
この場合、図18(B)に示すように、文言可変部のブロック2では、「あいう銀行」と「かきく支店」の2列の構造であるが、文言固定部のブロック1では、1列の構造となっている。この場合、ブロック1の1列(振込先)がブロック2の2列の見出しとなっているため、表構造としてみた場合には、ブロック2の2列を1列とみなす。
同様に、図18(C)に示すように、文言固定部のブロック1では、「銀行名」と「支店名」の2列の構造であるが、文言可変部のブロック2では、1列の構造となっている。この場合、ブロック1の2列(銀行名、支店名)がブロック2の1列の見出しとなっているため、表構造としてみた場合には、ブロック1の2列を1列とみなす。
次に、列方向の論理的な入れ子構造を抽出する。ブロック間での論理列構造の判定を行った結果、図18(B)及び図18(C)のように、一方のブロックが、複数列からなり、他方のブロックが一列の論理列構造を持つ場合、これらを入れ子構造として表現する。入れ子構造を構成する罫線項目は、纏めて1つの論理的な意味を持たせる。
図19(A)は、図18(B)の場合の入れ子構造を示す。図19(A)に示すように、罫線項目2と罫線項目3が兄弟関係(同じレベル)にある。両罫線項目をあわせて、罫線項目1に対しての列を構成する罫線項目とする。図19(B)は、図18(C)の場合の入れ子構造を示す。図19(B)に示すように、罫線項目1と罫線項目2が兄弟関係(同じレベル)にある。両罫線項目をあわせて、罫線項目3に対しての列を構成する罫線項目とする。
更に、1桁罫線項目部分、3桁罫線項目部分の入れ子構造を解析する。図20(A)及び図20(B)に示すように、帳票の表構造の中で、金額欄、手数料欄がある場合に、1桁の罫線項目又は3桁の罫線項目が連続する。1桁罫線項目は、1罫線項目内に1桁の数字が記入又は印刷されるものをいう。又、3桁罫線項目は、1罫線項目に3桁の数字が記入又は印刷されるものをいう。
これらは、合わせて、1つの意味を持つ。これらを論理的に1つの罫線項目に纏める。このため、予め1桁罫線項目又は3桁罫線項目の縦サイズと横サイズを定義しておく。これらサイズと一致する罫線項目が任意数並んだ場合には、これらを入れ子構造として、論理的に1つの罫線項目としてまとめる。
このような結果を利用して、文字認識処理では、連続する罫線項目を1つの文字列として扱うことができる。例えば、図20(A)のa部分の罫線項目内を文字認識した結果、b部分の結果を得た場合に、罫線項目が入れ子構造となっていることから、文字認識結果をc部分で示したように結合して、1つの文字列として取り扱う。図20(B)に示す、3桁罫線項目の場合も同様である。
次に、特殊な構造を持つ矩形の入れ子構造を解析する。帳票上の主表以外の箇所には、特別な構造を持つものが多い。これらについては、構造毎に入れ子構造解析処理を行う。図21(A)では、罫線項目1に対し、罫線項目2が親子の関係にある。罫線項目2に対し、罫線項目4が親子の関係にある。罫線項目3に対し、罫線項目5が親子の関係にある。罫線項目2に対し、罫線項目3が兄弟の関係にある。罫線項目4に対し、罫線項目5が兄弟の関係にある。図21(B)では、罫線項目1に対し、罫線項目2が親子の関係にある。罫線項目2に対し、罫線項目4が親子の関係にある。罫線項目3に対し、罫線項目5が親子の関係にある。罫線項目2に対し、罫線項目3が兄弟の関係にある。罫線項目4に対し、罫線項目5が兄弟の関係にある。前述した行方向及び列方向の入れ子構造の解析処理と同様にして、入れ子構造を解析する。
(S7)次に、表構造部のブロックに属性を付与する。帳票には、見出し部と、見出し部分に対応するデータ部とが存在する。又、帳票によっては、データを纏める部分(例えば、データ部の金額合計欄等)が存在する。ここでは、表構造部を構成するブロックに、属性を付与して、各ブロックに意味を持たせる。即ち、図22に示すように、表のデータを記入又は印刷する部分をボディ部と定義し、表を構成するブロック中で最も論理行数が多いブロックに、ボディ部属性を付与する。表の見出しを記入又は印刷する部分をヘッダ部と定義し、ボディ部の上側に位置するブロックに、ヘッダ部属性を付与する。表のデータ部分を取りまとめるデータ(例えば、合計欄等)を記入又は印刷する部分をフッタ部と定義し、ボディ部の下側に位置するブロックにフッタ部属性を付与する。
(S8)次に、見出しを構成する罫線項目に、見出しフラグを設定する。表構造の形式から以下に示すルールに従って、見出しにあたる罫線項目に見出しフラグを設定する。見出しフラグを設定する罫線項目は、図23に示すように、次の通りである。
・ヘッダブロックを構成する罫線項目
・ボディブロックの最上位論理行を構成する罫線項目
・フッタブロックを構成する罫線項目の内、最も右に位置するものを除いた罫線項目
・下凸部の論理行を構成する罫線項目の内、最も右に位置するものを除いた罫線項目
・表以外の矩形の論理行を構成する罫線項目の場合、入れ子構造の罫線項目の内、最も右下に位置するものを除いた罫線項目
この見出し部を抽出しておくと、使用される文字を制限でき、その文字(文言)に特化した文字認識処理を行うことができる。従って、高精度に見出し部分の文言を認識することができる。
(S9)次に、見出しの種類を決定する。見出しフラグが設定された罫線項目内に存在する文字列の文字認識を行う。図25に示すように、この見出し部の文字認識で使用する認識辞書には、見出し文言辞書1003(図1参照)が使用される。見出し文言辞書1003は、見出しとして存在する文言(振込先等)と、そのイメージとが登録されたものである。従って、一般の文字認識辞書を使用した場合よりも高い精度での文字認識が可能となる。
この認識結果から得られた見出し名称をキーとして、図24に示す見出しテーブルを参照する。図24に示すように、見出しテーブルには、見出し名称に対応する属性情報(文字認識カテゴリ、文字フォント等)が登録されている。そして、その見出し名称に一致するレコード(属性情報)を抽出する。
(S10)次に、見出しに対応する罫線領域の認識属性を決定する。このため、見出しが見つかった罫線項目を含む論理列情報を参照し、その見出しに対応するデータ部分の罫線項目を見つける。即ち、論理列を構成する罫線項目のうち、見出し以外の罫線項目に対して、文字認識カテゴリ、文字フォント等の認識特性を、見出しの罫線項目から複写する。
(S11)次に、見出し以外の領域の文字認識を行う。見出しの罫線項目以外の罫線項目内に存在する文字列を、一般の文字認識辞書1004(図1参照)を使用して、文字認識する。この時、文字認識辞書1004は、漢字、数字等の各認識カテゴリに対し、別々に設けられている。従って、前述したデータ部分の認識属性に従い、一般辞書から認識辞書を選択して、文字認識する。このため、データ部分も高い精度で文字認識できる。
更に、得られた認識結果を認識結果通知領域に設定する。これにより、データ部分のデータ名称、データ数、文字認識結果が得られる。
このようにして、各罫線項目の行と列の関係を判定し、見出し部とそれに対応するデータ部とに分類する。そして、見出し部分を見出し認識辞書を用いて文字認識して、見出し名称を得る。論理列の構造の関係から見出し部分に対応したデータ部分のデータ名称が判明する。このため、帳票の各項目のフォーマットを予め定義しておく必要がない。
更に、見出し名称から認識属性を見出しテーブルにより得る。これに従い、データ部分を文字認識する。このため、帳票の表構造を解析することができ、データ部分の文字認識結果を精度を高めることができる。
次に、前述のステップS1〜S11の各処理について、詳細に説明する。ここで、図26は、各処理に使用されるテーブルの関係図である。図26に示すように、横罫線テーブル1105は、抽出した横罫線の開始座標と終了座標を格納する。縦罫線テーブル1106は、抽出した縦罫線の開始座標と終了座標を格納する。罫線項目情報テーブル1104は、抽出した罫線項目(最小矩形)の開始座標、終了座標と、属するグループ番号、ブロック番号等を格納する。グループ情報テーブル1100は、分類された各グループの先頭罫線項目アドレス、先頭ブロック番号等を格納する。
ブロック情報テーブル1101は、抽出された各ブロックの先頭罫線項目アドレス、先頭論理行アドレス等を格納する。論理行情報テーブル1102は、抽出された各論理行の先頭罫線項目アドレス、ブロック番号等を格納する。論理列情報テーブル1103は、抽出された各論理列の先頭罫線項目アドレス等を格納する。
(a)罫線抽出処理の説明
図27は、横罫線情報テーブルの説明図、図28は、縦罫線情報テーブルの説明図、図29は、罫線項目テーブルの説明図である。
横罫線の抽出は、周知のように、一定数以上の黒画素が横方向に連続する黒画素群を抽出する。そして、図27に示すように、各抽出した横罫線に番号を付し、その開始座標及び終了座標を、横罫線情報テーブル1005に格納する。
縦罫線の抽出も、周知のように、一定数以上の黒画素が縦方向に連続する黒画素群を抽出する。そして、図28に示すように、各抽出した縦罫線に番号を付し、その開始座標及び終了座標を、縦罫線情報テーブル1006に格納する。
最小矩形(罫線項目)の抽出も、周知のように、2つの横罫線と2つの縦罫線に囲まれた最小矩形を抽出する。そして、各抽出した罫線項目に番号を付す。図29に示すように、罫線項目情報テーブル1104は、各罫線項目の開始座標SC、終了座標EC、上側横罫線番号ULN、下側横罫線番号LLN、左側縦罫線番号LVN、右側縦罫線番号RVNを格納する。尚、罫線項目情報テーブル1104は、グループ番号GN、ブロック番号BN、行番号LN、列番号RO、上側罫線項目URN、下側罫線項目LRN、左側罫線項目ERN、右側罫線項目RRN、入れ子情報INの各欄を有する。これらの各欄は、後の処理により利用される。
次に、斜度補正について、説明する。図30は、斜度算出処理フロー図である。
(S20)横罫線情報テーブル1105の各横罫線を参照する。そして、全横罫線を参照したかを判定する。
(S21)参照した横罫線の斜度を算出する。斜度θは、終了Y座標をYe、開始Y座標をYs、終了X座標をXe、開始X座標をXsとすると、次の式(1)で計算される。
tanθ=(YeーYs)/(XeーXs) (1)
そして、ステップS20に戻る。
(S22)ステップS20で、全横罫線を参照した場合には、斜度の平均値を計算する。斜度の平均値は、(斜度値の合計)/(横罫線の本数)により計算される。そして、終了する。
次に、座標補正処理について、説明する。図31は、座標補正処理フロー図である。
(S25)罫線項目テーブル1104の各罫線項目を参照する。罫線項目テーブル1104の全罫線項目を参照したかを判定する。全罫線項目を参照した場合には、ステップS27に進む。
(S26)罫線項目の左上座標(開始座標)Xs、Ysを、斜度tanθに応じて補正する。補正後の座標X、Yは、次式(2)、(3)で示される。
X=Xs+Ys×tanθ (2)
Y=YsーXs×tanθ (3)
そして、罫線項目の右下座標(終了座標)Xe、Yeを、斜度tanθに応じて補正する。補正後の座標X、Yは、次式(4)、(5)で示される。
X=Xe+Ye×tanθ (3)
Y=YeーXe×tanθ (4)
そして、ステップS25に戻る。
(S27)次に、横罫線座標を補正するため、横罫線テーブル1105を参照する。横罫線テーブル1105の全横罫線を参照したかを判定する。全横罫線を参照した場合には、ステップS29に進む。
(S28)横罫線の左側座標(開始座標)Xs、Ysを、斜度tanθに応じて補正する。補正後の座標X、Yは、前述の式(2)、(3)で示される。
そして、横罫線の右側座標(終了座標)Xe、Yeを、斜度tanθに応じて補正する。補正後の座標X、Yは、前述の式(4)、(5)で示される。
そして、ステップS27に戻る。
(S29)次に、縦罫線座標を補正するため、縦罫線テーブル1106を参照する。縦罫線テーブル1106の全縦罫線を参照したかを判定する。全縦罫線を参照した場合には、終了する。
(S30)縦罫線の左側座標(開始座標)Xs、Ysを、斜度tanθに応じて補正する。補正後の座標X、Yは、前述の式(2)、(3)で示される。
そして、縦罫線の右側座標(終了座標)Xe、Yeを、斜度tanθに応じて補正する。補正後の座標X、Yは、前述の式(4)、(5)で示される。
そして、ステップS29に戻る。
このようにして、横罫線、縦罫線、罫線項目(最小矩形)を抽出する。そして、帳票の斜行による座標の誤差を補正するため、横罫線座標から斜度を計算する。斜度は平均値のため、正確に斜度を求めることができる。更に、斜度により、罫線項目、横罫線、縦罫線の座標を補正する。
(b)グループ分類処理の説明
図32は、グループ処理フロー図、図33は、グループ処理後のテーブル更新の説明図である。
(S31)罫線項目テーブル1104から罫線項目を参照する。全罫線項目を参照したかを判定する。全罫線項目を参照した場合には、終了する。
(S32)罫線項目テーブル1104から他の罫線項目を抽出する。全部の他罫線項目を参照したかを判定する。全罫線項目を参照した場合には、ステップS35に進む。
(S33)全罫線項目が参照済でない場合には、抽出した2つの罫線項目が接続関係にあるかを判定する。図8で説明したように、2つの罫線項目の位置関係が、接続関係にあるかを判定する。接続関係にない場合は、ステップS32に戻る。
(S34)2つの罫線項目が接続関係にある場合には、1の罫線項目が属するグループ情報テーブル1100に、他の罫線項目を反映する。図33に示すように、グループ情報テーブル1100は、グループ番号GN、開始座標SC、終了座標EC、罫線項目数RIN、ブロック数BLN、論理行数LR、先頭罫線項目アドレスHLA、先頭論理行情報アドレスHRA、先頭ブロックアドレスHBAをからなる。グループ情報テーブル1100のグループ矩形座標SC、ECと、罫線項目数RINを更新する。更に、罫線項目テーブル1104に、グループ番号を設定する。そして、ステップS32に戻る。
(S35)全罫線項目を参照したと判定すると、1の接続罫線に、接続する罫線項目はあるかを判定する。接続する罫線項目がある時は、ステップS31に戻る。接続する罫線項目がない場合には、グループ情報テーブル1100に、新規にグループ情報を作成する。そして、ステップS31に戻る。
図2の帳票例では、図33のグループ情報テーブル1100に示すように、2つのグループに、分類される。
このようにして、罫線項目を表部とそれ以外を分離するため、各罫線項目をグループに分類する。
(c)構成要素分類処理の説明
図34及び図35は、構成要素分類処理フロー図、図36及び図37は、分類処理後のテーブル説明図である。
(S40)グループ情報テーブル1100からグループ情報を抽出する。全グループ情報を参照したかを判断する。全グループ情報を参照したと判定すると、終了する。
(S41)横罫線テーブル1105から、そのグループの横罫線を抽出する。そのグループの横罫線を全て参照したかを判定する。そのグループの横罫線を全て参照したと判定すると、ステップS43に進む。
(S42)横罫線を比較して、そのグループの左右に達する横罫線で、最小のY座標と最大のY座標を持つ横罫線を抽出する。ステップS41に戻る。
(S43)縦罫線テーブル1106から、縦罫線情報を抽出する。縦罫線を全て参照したかを判定する。縦罫線を全て参照したと判定すると、ステップS45(図35)に進む。
(S44)最小のY座標と最大のY座標を持つ横罫線の左右端と交点を持つ縦罫線を2本抽出する。ステップS43に戻る。
(S45)罫線項目テーブル1104から、グループを構成する罫線項目を参照する。グループを構成する全罫線項目を参照したかを判定する。そのグループの全罫線項目を参照した場合には、図34のステップS40に戻る。
(S46)ステップS42とステップS44により、そのグループの最大矩形を構成する2本の横罫線と2本の縦罫線が抽出された。そこで、罫線項目が、この最大矩形の中にあるかを判定する。即ち、罫線項目が、抽出された横罫線と縦罫線で囲まれる範囲(外接矩形)内に位置するかを判定する。
(S47)罫線項目が、範囲内にある場合は、罫線項目を当該グループに所属させる。更に、グループ情報と当罫線項目の開始座標が一致する場合は、グループ情報の先頭罫線項目アドレスHLAを、当罫線項目に設定する。そして、ステップS45に戻る。
(S48)当該罫線項目が、範囲内にない場合には、当該罫線項目の開始Y座標と、外接矩形開始Y座標とを比較する。罫線項目の開始Y座標が、外接矩形の開始Y座標より大きい場合には、その罫線項目は、上凸グループに分類する。尚、上凸グループが作成済なら、上凸グループの罫線項目と接続しているかを判定する。当該罫線項目が、上凸グループの罫線項目と接続している場合には、当該罫線項目をそのグループに追加する。
下凸グループも同様であり、罫線項目の開始Y座標が、外接矩形の開始Y座標より小さい場合には、その罫線項目は、下凸グループに分類する。尚、下凸グループが作成済なら、下凸グループの罫線項目と接続しているかを判定する。当該罫線項目が、下凸グループの罫線項目と接続している場合には、当該罫線項目をそのグループに追加する。そして、ステップS45に戻る。
このようにして、各グループを、主表部と、上凸部、下凸部の表の構成要素に分類する。図2の帳票例では、2グループに分類された帳票が、4グループに分類される。即ち、図37のグループ情報テーブル1100に示すように、グループは、4つとなる。そして、図36の罫線項目テーブル1104に示すように、罫線項目も4つのグループに分類される。即ち、グループ番号は4つとなる。
(d)論理行分類処理の説明
図38は、論理行分類処理フロー図、図39は、図38の入れ子解析処理フロー図、図39及び図40は、論理行抽出後のテーブル説明図である。
(S50)グループ情報テーブル1100からグループ情報を抽出する。全部のグループ情報を参照したかを判定する。全てのグループ情報を参照すると、終了する。
(S51)横罫線テーブル1105から、そのグループの左右端に交点を持つ横罫線を2本づつ抽出する。全横罫線を抽出したかを判定する。そのグループの全横罫線を抽出した時は、ステップS50に戻る。
(S52)全横罫線を参照していない場合には、罫線項目テーブル1104からそのグループを構成し、2本の横罫線に位置する罫線項目を抽出する。全罫線項目を抽出したかを判定する。そのグループの全罫線項目を参照した時は、ステップS51に戻る。
(S53)2本の横罫線の内、下に位置する横罫線座標が罫線項目の下Y座標に一致するかを判定する。
(S54)一致しない場合には、図12(A)及び図12(B)に示したように、入れ子構造の可能性がある。このため、後述する図39に示す入れ子構造の解析処理を行う。
(S55)論理行に分類するため、論理行テーブル1102を作成する。論理行テーブル作成済の場合には、当該罫線項目を追加する。論理行テーブルが作成されていない場合には、新規に論理行テーブルを作成する。
このようにして、各グループにおいて、罫線項目を、論理行に分類する。
次に、図39により、入れ子構造解析処理について、説明する。
(S56)罫線項目テーブルから罫線項目を2つづつ抽出する。例えば、1回目は、1番目と2番目、2回目は、2番目と3番目とする。
(S57)罫線項目の開始Y座標と、論理行の上側横罫線のY座標が一致し、罫線項目の終了Y座標か、論理行の下側横罫線のY座標が一致するかを判定する。一致する場合には、終了する。
(S58)一致しない場合には、2つの罫線項目の開始X座標を比較する。2つの罫線項目の開始X座標が一致する場合には、ステップS59に進む。2つの罫線項目の開始X座標が一致する場合には、図12(A)に示すように、2つの罫線項目に親子関係を設定する。そして、ステップS56に戻る。
(S59)X座標が一致しない場合には、2つの罫線項目の開始Y座標を比較する。2つの罫線項目の開始Y座標が一致しない場合には、ステップS56に戻る。2つの罫線項目の開始Y座標が一致する場合には、図12(A)に示すように、2つの罫線項目に兄弟関係を設定する。そして、ステップS56に戻る。
図41に示すように、論理行テーブル1102が作成される。論理行テーブルは、各論理行の番号LN、開始座標SC、終了座標EC、グループ番号GN、ブロック番号BN、罫線項目数RIN、論理列数LL、上側横罫線番号ULN、下側横罫線番号LLN、左側縦罫線番号ERN、右側縦罫線番号RRN、先頭罫線項目アドレスHLAからなる。図2の帳票の例では、図41に示すように、論理行テーブル1102が作成される。
更に、グループ情報テーブル1100は、論理行数LRと先頭論理行アドレスHLAが追加される。図40に示すように、罫線項目テーブル1104の入れ子情報INは、入れ子フラグINF、階層番号KN、子罫線項目番号CRN、罫線項目間リンク番号RLNからなる。入れ子フラグINFは、罫線項目が入れ子構造を構成する場合に、「ON」となる。図2の帳票例では、罫線項目10、11、12が入れ子構造を構成するため、「ON」である。
階層番号KNは、入れ子構造の階層の深さ(親子関係数)を示す。図2の帳票例では、親となる罫線項目10は、「0」、子となる罫線項目11、12は、「1」を設定する。子罫線項目数CRNは、当罫線項目が親子の関係の場合には、親の罫線項目に、子となる罫線項目番号を設定する。図2の帳票例では、親の罫線項目10に、子の罫線項目番号11を設定する。
罫線項目間リンク番号RLNは、罫線項目が兄弟関係にある場合に、兄弟関係にある罫線項目の通し番号を示す。図2の帳票例では、罫線項目11、12が、兄弟関係にあるため、罫線項目11に「0」を、罫線項目12に「1」を設定する。
このようにして、各罫線項目を論理行に分類する。この論理行は、同じ構造をしている行を見つけるのに役立つ。
次に、図3の帳票例2のように、表が分離されている場合の表の統合処理について、説明する。
図42は、表の統合処理フロー図、図43及び図44は、帳票例2のグループ統合前のテーブル説明図、図45及び図46は、帳票例2のグループ統合後のテーブル説明図である。
(S60)グループ情報テーブル1100から、同じ開始Y座標と終了Y座標を持つ2つのグループを抽出する。
(S61)2つのグループを構成する論理行情報を1つづつ抽出する。全部の論理行を参照したかを判定する。全部の論理行を参照した場合には、ステップS63に進む。
(S62)抽出した論理行情報から、開始Y座標と終了Y座標が一致する論理行数をカウントする。そして、ステップS61に戻る。
(S63)一致した論理行数の全論理行数に対する割合を計算する。そして、その割合と所定の閾値とを比較する。その割合が、閾値以下の場合は、2つのグールプは別の表と判断して、終了する。
(S64)その割合が、閾値以上の場合には、2つのグループは、1つの表であると判定する。そして、2つのグループに、異なる構造の論理行はあるかを判定する。異なる構造の論理行がある場合には、図47で説明する罫線作成処理を行う。
(S65)2つのグループを1つのグループに統合する。そして、終了する。
図3の帳票例で説明する。図3の帳票例では、罫線項目テーブル1104は、図43のように設定される。論理行テーブル1102及びグループ情報テーブル1100は、図44に設定される。即ち、グループは、4つに分類される。前述した統合処理により、グループ2と4が統合される。即ち、図45に示すように、論理行テーブル1102において、グループ4の論理行は削除される。グループテーブル1100においても、グループ4は削除される。同様に、論理行テーブル1102、グループ情報テーブル1100において、グループ2の罫線項目数に、グループ4の罫線項目数を加算される。罫線項目テーブル104において、グループ4の罫線項目のグループ番号は、グループ2に変更される。更に、横罫線テーブル1105において、グループ2の論理行を構成する横罫線の終了X座標を、グループ4の終了X座標まで延長する。
このようにして、グループの論理行構造が同じか、類似しないるかを判定して、表の統合を行う。
次に、図42の罫線作成処理について、説明する。図47は、罫線作成処理フロー図、図48は、罫線作成の説明図、図49及び図50は、罫線作成後のテーブル説明図である。
(S66)2つのグループから論理行情報を抽出する。全論理行を参照したかを判定する。全論理行を参照した場合には、終了する。
(S67)2つの論理行を高さは、一致するかを判定する。一致する場合は、罫線作成処理不要のため、ステップS66に戻る。一致していない場合には、次の行の論理行情報を抽出する。そして、1のグループの次の行Bと行Aの高さとの和が、他のグループの行Cの高さとが一致するかを判定する。図48に示すように、グループ2の論理行A、Bと、グループ4の論理行Cが対応するものとする。この場合に、グループ4の論理行Cにおいて、掠れにより罫線が消失している。この場合に、グループ2の次の行Bと行Aの高さとの和が、グループ4のの行Cの高さとが一致する。一致しない場合は、ステップS66に戻る。
(S68)一致する場合には、行Cの中で、行Aと行Bの境界線と同じY座標を持つ横罫線を生成する。そして、1つの行を2つの行に分割する。そして、ステップS66に戻る。
このようにして、掠れ等で消失した罫線を、表構造から検出する。そして、罫線を作成する。図49に示すように、罫線項目情報テーブル1104において、罫線項目158と罫線項目159の下側横罫線番号を新規に作成した横罫線番号に変更する。終了Y座標を横罫線の座標に変更する。罫線項目160と罫線項目161を新たに作成する。図50の論理行テーブル1102において、行Cを上下に2分割する。下側論理行を論理行テーブルに追加する。グループテーブル1100において、グループ4の論理行数を+1する。
(e)ブロック分類処理の説明
図51は、ブロック分類処理フロー図、図52及び図53はブロック分類後のテーブル説明図である。
(S70)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S71)そのグループを構成する論理行情報を2行ずつ抽出する。例えば、1回目は1行目と2行目、2回目は2行目と3行目を抽出する。全ての論理行を抽出したかを判定する。そのグループの全ての論理行を抽出した場合には、ステップS70に戻る。
(S72)抽出した2つの論理行の構造を比較する。この比較は、次の項目を比較する。構成する罫線項目数は同じか。論理行の中で、罫線項目の配置は一致するか。論理行の高さ、幅は同じか。
(S73)論理行構造が一致しない場合には、両論理行は別のブロックを構成すると判断する。このため、両論理行をリンクしないブロック情報を作成する。そして、ステップS70に戻る。
(S74)論理行構造が一致する場合には、両論理行は同一のブロックを構成すると判断する。このため、両論理行をリンクするブロック情報を作成する。そして、ステップS70に戻る。
このようにして、グループ単位に、行構造が同一である論理行を1つのブロックに分類する。図53に示すように、ブロック情報テーブル1101は、ブロック番号BN、開始座標SC、終了座標EC、グループ番号GN、罫線項目数RIN、論理行数LN、論理列数RO、先頭論理行アドレスHRA、先頭論理列アドレスHRA、上側横罫線番号ULN、下側横罫線番号LLN、左側縦罫線番号LVN、右側縦罫線番号RVNからなる。
ブロック情報テーブル1101に、各ブロックの開始座標SC、終了座標EC、グループ番号GN、罫線項目数RIN、論理行数LN、先頭論理行アドレスHRA、上側横罫線番号ULN、下側横罫線番号LLN、左側縦罫線番号LVN、右側縦罫線番号RVNを設定する。
そして、図52に示すように、罫線項目テーブル1104に、各罫線項目のブロック番号BNを設定する。論理行テーブル1102に、各論理行のブロック番号BNを設定する。図53に示すように、グループテーブル1100に、各グループのブロック数BLN、先頭ブロック番号アドレスを設定する。
次に、ブロック分類において、異なるブロックに分類されたブロックを統合する処理について、説明する。図54は、罫線回復処理の説明図、図55は、罫線回復処理フロー図、図56及び図57は、罫線回復前のテーブル説明図、図58乃至図60は、罫線回復後のテーブル説明図である。
図54に示すように、図2の帳票例1において、罫線項目63と罫線項目64の部分が掠れにより、罫線が消失しているものとする。この部分は、上下の論理行と構造が異なるため、ブロックBに分類される。又、ブロックBは、論理行が1行の構造であるため、罫線項目の抽出順序は、他の行と異なっている。以下、図55により、処理を説明する。
(S75)グループ情報テーブル1100からグループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、処理を終了する。
(S76)ブロック情報テーブル1101からそのグループのブロック情報を抽出する。全ブロック情報を抽出したかを調べる。全ブロックを抽出した場合には、ステップS79に進む。
(S77)ブロック情報テーブル1101から次のブロック情報を抽出する。全ブロック情報を抽出したかを調べる。全ブロックを抽出した場合には、ステップS76に戻る。
(S78)2つのブロック情報を構成する論理行の構造を比較する。即ち、ブロックを構成する論理行を構成する罫線項目の数は同じかを判定する。論理行の中で罫線項目の配置は一致するかを判定する。論理行の高さ、幅は同じかを判定する。一致する場合には、ブロック数をカウントする。そして、一致するブロック情報同志に、マーキングする。そして、ステップS77に戻る。
(S79)ブロック情報テーブル1101から一致数が最も多いブロックを基準ブロックとし、一致数が最も多くないブロックを抽出する。図54で説明すると、基準ブロックは、ブロックAが抽出され、一致数が最も多くないブロックとして、ブロックBが抽出される。全ブロック情報を抽出したかを調べる。全ブロックを抽出した場合には、ステップS75に戻る。
(S80)基準ブロックAとブロックBの論理行での罫線項目の配置を比較する。即ち、罫線項目の座標を論理行開始X座標、Y座標からの相対座標に変換して、比較する。そして、罫線項目の配置が異なった場合に、ブロックAの罫線項目の高さh1とブロックBの罫線項目の高さh2とを比較する。この比較において、h1<h2である場合には、罫線項目の罫線の消失と判断する。このため、ブロックBの罫線項目を、ブロックAの罫線項目の高さと一致するように、仮分割して、ブロックBについて、論理行情報を仮作成する。そして、ブロックAの論理行と仮作成したブロックBの論理行が一致する時に、グループ情報、ブロックBのブロック情報と論理行情報、罫線項目情報と横罫線情報を編集する。そして、ステップS79に戻る。
これを、前述の図54の例で説明する。罫線回復前のテーブルは、図56及び図57の如くである。即ち、図56の罫線項目テーブル1104に示すように、罫線項目59〜罫線項目66は、ブロック3に分類されている。罫線項目47、48は、ブロック2に分類されている。
罫線回復後は、図58に示すように、罫線項目テーブル1104において、罫線項目63と64の終了座標を、横罫線12の座標値に変更する。罫線項目177と178を新規に作成する。上側が横罫線11、下側が横罫線12の罫線項目と、上側が横罫線11、下側が横罫線13の罫線項目とのブロック番号を、ブロック2に変更する。その罫線項目の論理行番号をブロック2内の通し番号に変更する。下側が横罫線13の罫線項目の下側横罫線番号を「12」に変更する。同一グループ内の罫線番号が、論理行順になるように、テーブル1104をソートする。同一論理行番号の罫線項目をX座標順になるようにテーブルをソートする。グループ3、ブロック4以降の罫線項目のブロック番号をブロック2に変更し、論理行番号をブロック2内の通し番号に変更する。
図59の論理行テーブル1102において、グループ3、ブロック3の論理行情報を横罫線11、12に囲まれる範囲に変更する。グループ3、ブロック3の論理行情報のブロック番号を、ブロック2に変更する。論理行番号をブロック2内の通し番号(4)に変更する。グループ3、ブロック2の罫線項目数を「14」に、下側横罫線番号を「12」に変更する。グループ3、ブロック2の論理行番号を新規に作成する。グループ3、ブロック4以降の論理行情報のブロック番号を、ブロック2に変更する。論理行番号をブロック2内の通し番号に変更する。
図59のブロック情報テーブル1101において、グループ3、ブロック2の罫線項目数を「140」に、論理行数を「10」に、下側横罫線番号を「19」に変更する。グループ3のブロック3とブロック4を、テーブルから削除する。
図60のグループ情報テーブル1100において、グループ2のブロック数を「2」に、罫線項目数を「147」に変更する。横罫線テーブル1105において、横罫線12の終了Y座標を、横罫線11と同じ座標値に変更する。横罫線13を削除する。
このようにして、隣接する異なるブロック間において、論理行の構造を比較する。これにより、基準ブロックと構造の似ているブロックを探し、似ているブロックを基準ブロックの論理行構造になるように、罫線を付加する。これにより、掠れた罫線を回復する。
次に、帳票の罫線項目に消し線が記入されて、異なるブロックに分類されたものを、同一のブロックに統合する処理について、説明する。図61は、論理行統合処理の説明図、図62は論理行統合処理フロー図、図63及び図64は、ろた行統合前のテーブル説明図、図65乃至図67は、論理行統合後のテーブル説明図である。
図61は、帳票の罫線項目に消し線が記入された例を示し、罫線項目59と罫線項目73との間に、横罫線が消し線として記入されている。元の帳票では、罫線項目59と罫線項目73とが合わせて1つの罫線項目であった。消し線により、1つの罫線項目が、2つに分割されている。2つに分割された行を1つの行に統合する。又、記入内容の訂正を行うため、引かれた訂正線により、罫線項目が部分的に分割された場合にも、統合処理により解析が可能となる。
図62の処理フローにより、説明する。
(S81)図55の罫線回復処理のステップS75〜ステップS79の処理を実行して、基準ブロックと一致数が異なるブロックを抽出する。この参照中のブロックは、基準ブロックかを判定する。参照されたブロックが基準ブロックの場合には、ステップS79(図55)に戻る。
(S82)論理行テーブル1102から、参照ブロックの論理行情報を抽出する。参照ブロックの先頭論理行の高さに、その下の論理行の高さを1行づつ加算する。加算した高さが、基準ブロックの高さに、一致するまで、論理行を参照する。一致しなければ、ステップS79(図55)に戻る。
(S83)一致した場合には、参照した論理行を構成する罫線項目の内、上下に接続する罫線項目を全て統合する。即ち、同じY座標を持ち、且つ共有するY座標がある罫線項目を統合する。更に、統合した罫線項目で構成される論理行を仮作成する。そして、その作成した論理行と基準ブロックの論理行の構造を比較する。論理行構造が一致する場合に、グループ情報、ブロック情報、論理行情報、罫線項目情報を編集する。そして、ステップS79(図55)に戻る。
このようにして、基準ブロックと、基準ブロックと構造の異なる他のブロックを抽出し、他のブロックの高さと基準ブロックの高さから、消し線の存在を検出する。そして、消し線の存在を検出すると、上下に位置する罫線項目を統合し、論理行を仮作成する。仮作成した論理行の構造と基準ブロックの論理行の構造を比較して、確認する。このため、消し線、訂正線を除去することができる。
図61のように、消し線が引かれた場合には、罫線項目テーブル1104は、図63のように、作成される。論理行情報テーブル1102、ブロック情報テーブル1101、グループ情報テーブル1100の各々は、図64に示すように、作成される。
図61の消し線が除去され、ブロックA、B、Cが、ブロックAに統合されると、図65に示すように、罫線項目テーブル1104では、罫線項目59から罫線項目72までの終了座標を横罫線13の座標値に、下側横罫線番号を「13」に変更する。罫線項目59から罫線項目72までのブロック番号を、ブロック2に変更する。罫線項目59から罫線項目72までの論理行番号を、ブロック2内での通し番号に変更する。罫線項目73から罫線項目86までを削除する。罫線項目101以降のブロック番号をブロック2に、論理行番号をブロック2内の通し番号に変更する。
図66に示すように、論理行情報テーブル1102において、グループ3、ブロック3の論理行終了Y座標を、横罫線13のY座標に変更し、下側横罫線番号を「13」に変更する。グループ3、ブロック3のブロック番号を、ブロック2に変更し、論理行番号を、ブロック2内の通し番号(4)に変更する。グループ3、ブロック4以降のブロック番号をブロック2に変更し、論理行番号をブロック2内の通し番号に変更する。
図66に示すように、ブロック情報テーブル1101において、グループ3、ブロック2の罫線項目数を「140」に、論理行数を「10」に、下側横罫線番号を「19」に変更する。グループ3のブロック3とブロック4とをテーブルから削除する。
図67に示すように、グループ情報テーブル1100において、グループ2の罫線項目数を「147」に、ブロック数を「2」に、論理行数を「11」に変更する。横罫線テーブル1105において、横罫線12を削除する。
(f)論理列判定処理の説明
図68は、論理列判定処理フロー図、図69乃至図71は、論理列判定後のテーブル説明図である。論理列の判定処理について、図68により説明する。
(S90)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S91)ブロック情報テーブル1101から、抽出したグループの2つのブロックのブロック情報を抽出する。抽出したグループの全てのブロック情報を抽出したかを判定する。全てのブロック情報を抽出した場合には、ステップS90に戻る。
(S92)罫線項目テーブル1104から、抽出した各ブロックの先頭の論理行を構成する罫線項目情報を順次抽出する。抽出した論理行の全ての罫線項目情報を参照したかを判定する。全ての罫線項目情報を参照した場合には、後述するステップS97で、入れ子情報を設定したかを判定する。入れ子情報を設定していない場合には、抽出した2つのブロック間の論理列が終了するので、ステップS91に戻る。入れ子情報を設定した場合には、グループ情報、ブロック情報、論理行情報を更新する。更に、参照中ブロックの2行以下の論理行についても、1行目と同様に、各情報を更新する。そして、ステップS91に戻る。
(S93)2つの論理行の罫線項目が、同じ幅かを判定する。同じ幅でない場合には、幅の狭い論理行側で、次の罫線項目を抽出する。そして、幅の狭い論理行側で、現罫線項目と次の罫線項目との幅を加算する。幅の広い論理行の罫線項目と、その加算値を比較して、同じ幅となるかを判定する。同じ幅となるまで、罫線項目の抽出を繰り返す。
(S94)このようにして、第1のブロックの先頭論理行の罫線項目と、第2のブロックの先頭論理行の罫線項目との間の列方向の対応関係が判明した。
次に、抽出した罫線項目数をカウントする。
(S95)入れ子構造を検出するため、抽出した罫線項目の数が「1」かを判定する。
(S96)罫線項目数が「1」である場合には、入れ子構造でない。このため、抽出した罫線項目に、左側からの通し番号を、論理列番号として設定する。
(S97)罫線項目数が「1」でない場合には、入れ子構造である。このため、入れ子構造の罫線項目に、同じ通し番号を、論理列番号として設定する。そして、入れ子構造を構成する罫線項目に、入れ子情報を設定する。
(S98)論理列情報を作成し、同じ論理列内の罫線項目間にリンクを設定する。この時、同じグループで異なるブロック、論理行間で同じ列番号が設定されたものの間に、リンクを設定する。そして、ステップS92に戻る。
このようにして、上下に接続するブロックの間で、同じ列構造を持つかを判定する。そして、同じ列構造を持つ場合、それらブロックを論理列の単位で統合する。
図2の帳票例で説明する。図69に示すように、罫線項目情報テーブル1104では、罫線項目の列番号欄ROに、論理列番号が設定される。例えば、ブロック1の罫線項目10、11、12には、列番号が「1」と設定される。異なるブロック2において、この罫線番号と同じ幅の罫線項目は、「17」と「18」である。従って、ブロック2の罫線項目17、18には、同じ列番号「1」が設定される。
次に、入れ子構造を構成する罫線項目に入れ子情報INを設定する。図69では、罫線項目17、18に、入れ子情報を設定する。同様に、同じ論理列を構成する罫線項目(例えば、罫線項目31、32)にも、入れ子情報を設定する。更に、同じ論理列を構成する罫線項目間に、アドレスリンクHAAを設定する。
この場合に、入れ子情報INは、入れ子フラグINF、階層番号KN、子罫線項目番号CRN、罫線項目間リンク通し番号RLNからなる。罫線項目17、18の例では、罫線項目17、18が入れ子構造のため、入れ子フラグINFがオンとなる。2つの罫線項目17、18間に親子関係がないため、階層番号KNに、「0」を設定する。2つの罫線項目17、18間に親子関係がないため、子罫線項目番号CRNに、「0」を設定する。罫線項目17、18が兄弟関係のため、罫線項目17の罫線項目間リンク番号RLNに、「0」を、罫線項目18の罫線項目間リンク番号RLNに、「1」を設定する。
図70に示すように、論理行情報テーブル1102において、論理行2の論理列数LLを、「5」に変更する。図70に示す論理列情報テーブル1103は、新規に作成する。この論理列情報テーブル1103は、論理列番号RO、開始座標SC、終了座標EC、グループ番号GN、ブロック番号BN、罫線項目数RIN、上側横罫線番号ULN、下側横罫線番号LLN、左側縦罫線番号ELN、右側縦罫線番号RRN、先頭罫線項目アドレスHLAからなる。前述の列方向の関係に応じて、これらを作成する。
更に、図71に示すように、ブロック情報テーブル1101は、グループ3、ブロック2の論理列数が、「5」に変更される。そして、各ブロックの先頭論理列アドレスHAAが設定される。
このようにして、各グループにおいて、ブロック間の罫線項目の列方向の関係が判定される。そして、これに従い、列方向の関係を記述するテーブルが更新される。
次に、図20(A)及び図20(B)で説明した1桁及び3桁罫線の入れ子解析処理について、説明する。図72は、1桁、3桁罫線の入れ子解析処理フロー図、図73は入れ子解析後のテーブル説明図である。
(S100)論理行テーブル1102から論理行情報を抽出する。全論理行情報を抽出したかを判定する。全論理行情報を抽出した場合には、終了する。
(S101)論理行情報からリンクする罫線項目を抽出する。全罫線項目を抽出したかを判定する。全罫線項目を抽出した場合には、ステップS100に戻る。
(S102)抽出した罫線項目のサイズが、1桁罫線項目のサイズに該当するかを判定する。該当する場合には、ステップS104に進む。該当しない場合には、ステップS103に進む。
(S103)抽出した罫線項目のサイズが、3桁罫線項目のサイズに該当するかを判定する。該当する場合には、ステップS104に進む。該当しない場合には、ステップS101に戻る。
(S104)参照中の論理行の中で、次の罫線項目を抽出する。現罫線項目と次の罫線項目との大きさを比較する。誤差範囲内で一致するかを判定する。一致する場合には、ステップS105に進む。一致しない場合には、ステップS101に戻る。
(S105)現罫線番号のリンク先罫線番号に、次の罫線番号を設定する。そして、ステップS101に戻る。
図73には、図2の帳票例における罫線項目テーブル1104の更新後の状態を示す。図2において、1桁罫線項目は、罫線項目22〜30、36〜44等である。上述の処理により、これらの罫線項目22〜30が、1桁罫線項目と判定される。そして、罫線項目テーブル1104において、網掛け状態にして示すように、1桁罫線項目22〜30のリンク先罫線項目番号ANに、リンクする罫線番号が設定される。尚、前述の入れ子処理により、罫線番号22〜30は、入れ子構造と判定され、入れ子情報INが設定されている。
このようにして、予め1桁罫線項目又は3桁罫線項目の縦サイズと横サイズを定義しておく。これらサイズと一致する罫線項目が任意数並んだ場合には、これらを入れ子構造として、論理的に1つの罫線項目としてまとめる。このような結果を利用して、文字認識処理では、連続する罫線項目を1つの文字列として扱うことができる。
次に、図21(A)及び図21(B)に示した特殊な構造を持つ矩形の入れ子構造を解析する処理について、説明する。図74は、主表以外の入れ子解析処理フロー図、図75及び図76は、入れ子解析後のテーブル説明図である。
(S110)グループ情報テーブル1100から、グループ情報を抽出する。全グループ情報を抽出したかを判定する。全グループ情報を抽出した場合には、終了する。
(S111)抽出したグループの構造を判定する。グループは、1ブロック且つ1行かを判定する。グループが、1ブロック且つ1行である場合には、ステップS114に進む。グループが、1ブロック且つ1行でない場合には、グループが1列かを判定する。グループが1列でない場合には、ステップS110に戻る。グループが1列である場合には、グループが複数ブロックの構造かを判定する。グループが複数ブロックの構造でない場合には、ステップS110に戻る。グループが複数ブロックの構造である場合には、ステップS112に進む。
(S112)そのグループを構成する罫線項目を抽出する。全罫線項目情報を参照したかを判定する。全罫線項目情報を参照した場合には、ステップS110に戻る。
(S113)そのグループにおいて、現参照罫線項目の次の罫線項目を順次抽出する。そして、現罫線項目と次の罫線項目の左側縦罫線番号を比較する。両罫線項目の左側縦罫線番号が一致する場合には、罫線項目間に入れ子情報(親子関係)を設定する。次に、現罫線項目と次の罫線項目の上側横罫線番号を比較する。両罫線項目の上側横罫線番号が一致する場合には、罫線項目間に入れ子情報(兄弟関係)を設定する。これにより、図21(B)に示す例の入れ子構造が検出される。そして、ステップS112に戻る。
(S114)グループが、1ブロック且つ1行である場合には、そのグループを構成する罫線項目を抽出する。全罫線項目情報を参照したかを判定する。全罫線項目情報を参照した場合には、ステップS110に戻る。
(S115)そのグループにおいて、現参照罫線項目の次の罫線項目を順次抽出する。そして、現罫線項目と次の罫線項目の上側横罫線番号を比較する。両罫線項目の上側横罫線番号が一致する場合には、罫線項目間に入れ子情報(親子関係)を設定する。次に、現罫線項目と次の罫線項目の左側縦罫線番号を比較する。両罫線項目の左側縦罫線番号が一致する場合には、罫線項目間に入れ子情報(兄弟関係)を設定する。これにより、図21(A)に示す例の入れ子構造が検出される。そして、ステップS114に戻る。
このようにして、帳票上の主表以外の箇所を、構造毎に入れ子構造解析処理を行う。図21(A)では、罫線項目1に対し、罫線項目2が親子の関係にある。罫線項目2に対し、罫線項目4が親子の関係にある。罫線項目3に対し、罫線項目5が親子の関係にある。罫線項目2に対し、罫線項目3が兄弟の関係にある。罫線項目4に対し、罫線項目5が兄弟の関係にある。図21(B)では、罫線項目1に対し、罫線項目2が親子の関係にある。罫線項目2に対し、罫線項目4が親子の関係にある。罫線項目3に対し、罫線項目5が親子の関係にある。罫線項目2に対し、罫線項目3が兄弟の関係にある。罫線項目4に対し、罫線項目5が兄弟の関係にある。
図2の帳票例において、各テーブルを説明する。図75に示すように、罫線項目テーブル1104では、罫線項目1〜5に、入れ子フラグINFを設定される。罫線番号2、3に対しては、入れ子階層番号KNが「1」に設定され、罫線番号4、5に対しては、入れ子階層番号KNが「2」に設定される。子階層番号CRNは、罫線番号1に「2」が、設定され、罫線番号2に「4」が設定され、罫線番号3に「5」が設定される。罫線項目間リンク通し番号RLNは、罫線番号3と5に対し、「1」が設定される。
図75に示すように、論理行情報テーブル1102では、グループ1、ブロック1の論理行1に、論理列数「1」が設定される。図76に示すように、論理列情報テーブル1103では、論理列2、3が削除され、論理列番号1の罫線項目数が「5」に変更される。図76に示すように、ブロック情報テーブル1101では、グループ1、ブロック1の論理列数が「1」に変更される。
このようにして、主表以外の部分の入れ子構造を解析する。
(g)属性付与処理の説明
図77は、属性処理フロー図、図78は、属性付与後のテーブル説明図である。
(S120)グループ情報テーブル1100からグループ情報を抽出する。全グループ情報を抽出したかを判定する。全グループ情報を抽出した場合には、終了する。
(S121)そのグループは、複数ブロックで構成されるかを判定する。複数ブロックで構成されていない場合には、ステップS120に戻る。
(S122)グループ情報のブロック情報アドレスからブロック情報を抽出し、各ブロックにブロック属性BZを付与する。即ち、第1番目のブロックに、ヘッダブロック属性を付与し、第2番目のブロックに、ボディブロック属性を付与し、第3番目以降のブロックに、フッタブロック属性を付与する。そして、ステップS120に戻る。
このようにして、表構造部を構成するブロックに、属性を付与して、各ブロックに意味を持たせる。図78に示すように、ブロック情報テーブル1101において、グループ3の第1番目のブロック1に、ヘッダブロック属性「1」を付与し、第2番目のブロック2に、ボディブロック属性「2」を付与し、第3番目のブロック3に、フッタブロック属性「3」を付与する。
(h)見出しフラグ設定処理の説明
次に、見出しを構成する罫線項目に、見出しフラグを設定する見出しフラグ設定処理について、説明する。
図79は、フラグ設定処理フロー図、図80は、フラグ設定後のテーブル説明図である。
(S130)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S131)グループ情報からアドレス指示されているブロック情報を抽出する。グループ内の全ブロック情報を抽出したかを判定する。グループ内の全ブロック情報を抽出した場合には、ステップS130に戻る。
(S132)抽出したブロックは、ヘッダブロックかを判定する。ヘッダブロックである場合には、当該ブロックの論理行情報を1レコードづつ抽出する。論理行内の罫線項目情報を1レコードづつ抽出して、見出しフラグをオンする。これにより、ヘッダブロックを構成する罫線項目全てに、見出しフラグを設定する。そして、ステップS131に戻る。
(S133)抽出したブロックは、フッタブロックかを判定する。フッタブロックでない場合には、ステップS134に進む。フッタブロックである場合には、当該ブロックの論理行情報を1レコードづつ抽出する。論理行内の罫線項目情報を1レコードづつ抽出して、見出しフラグをオンする。これにより、フッタブロックを構成する罫線項目全てに、見出しフラグを設定する。そして、ステップS131に戻る。
(S134)抽出したブロックは、ボディブロックかを判定する。ボディブロックでない場合には、ステップS131に戻る。ボディブロックである場合には、当該ブロックの先頭論理行情報を1レコードづつ抽出する。抽出した先頭論理行内の罫線項目情報を1レコードづつ抽出して、見出しフラグをオンする。これにより、ボディブロックの先頭論理行を構成する罫線項目全てに、見出しフラグを設定する。そして、該当ブロックの先頭論理列情報を抽出する。抽出した先頭論理列内の罫線項目情報を1レコードづつ抽出して、見出しフラグをオンする。これにより、先頭論理列の罫線項目に、見出しフラグを設定する。そして、ステップS131に戻る。
この見出し部を抽出しておくと、使用される文字を制限でき、その文字(文言)に特化した文字認識処理を行うことができる。従って、高精度に見出し部分の文言を認識することができる。図80に示すように、罫線項目テーブル1102において、図79のルールに従い、見出しと推定される罫線項目に、見出しフラグMFが設定される。
(i)見出し部分の文字認識処理の説明
次に、見出しの種類を決定するため、見出しフラグが設定された罫線項目内に存在する文字列の文字認識を行う。
図81は、見出し認識処理フロー図、図82は、見出し認識後のテーブル説明図である。
(S140)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S141)グループ情報からアドレス指示されているブロック情報を抽出する。グループ内の全ブロック情報を抽出したかを判定する。グループ内の全ブロック情報を抽出した場合には、ステップS140に戻る。
(S142)ブロック情報はボディブロックかを判定する。ボディブロックである場合には、データ部分のため、ステップS141に戻る。
(S143)ボディブロックでない場合には、見出し部分の可能性がある。このため、ブロック情報からアドレス指示されている論理行情報を抽出する。全ての論理行情報を抽出したかを判定する。全ての論理行を抽出した場合には、ステップS141に戻る。
(S144)論理行情報からアドレス指示されている罫線項目情報を抽出する。
(S145)そして、罫線項目情報の見出しフラグがオンかを判定する。見出しフラグがオンでない場合には、ステップS144に戻る。
(S146)罫線項目内の文字列データ部分のイメージを切り出す。そして、切り出したイメージを、見出し文言辞書1003(図25参照)を使用して、文字認識する。図25に示したように、見出し文言辞書1003は、見出しとして存在する文言(振込先等)と、そのイメージとが登録されたものである。従って、一般の文字認識辞書を使用した場合よりも高い精度での文字認識が可能となる。
(S147)一致した辞書レコードの見出し名称を抽出する。見出しテーブル(図24参照)から見出し名称が一致するレコードを抽出する。即ち、認識結果から得られた見出し名称をキーとして、図24に示す見出しテーブルを参照する。図24に示したように、見出しテーブルには、見出し名称に対応する属性情報(文字認識カテゴリ、文字フォント等)が登録されている。そして、その見出し名称に一致するレコード(属性情報)を抽出する。そして、その罫線項目情報に、属性(文字認識カテゴリCC、文字フォントCF)を設定する。そして、ステップS144に戻る。
このようにして、見出し部分を、限定された文字認識辞書を用いて、文字認識する。図82に示すように、図2に示す帳票例1の場合に、罫線項目テーブル1104の見出しフラグがオンである罫線項目に、文字認識カテゴリCC、文字フォントCFが設定される。
(j)データ部分の属性設定処理の説明
次に、データ部分の属性を決定するため、見出しフラグが設定されていない罫線項目の属性を決定する。
図83は、属性設定処理フロー図、図84は、属性設定後のテーブル説明図である。
(S150)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S151)グループ情報からアドレス指示されているブロック情報を抽出する。グループ内の全ブロック情報を抽出したかを判定する。グループ内の全ブロック情報を抽出した場合には、ステップS150に戻る。
(S152)ブロック情報からアドレス指示されている論理列情報を抽出する。全ての論理列情報を抽出したかを判定する。全ての論理列を抽出した場合には、ステップS151に戻る。
(S153)論理列情報からアドレス指示されている罫線項目情報を抽出する。そして、罫線項目情報の見出しフラグがオンかを判定する。見出しフラグがオンでない場合には、ステップS155に進む。
(S154)見出しフラグがオンされている場合には、その罫線項目の文字認識カテゴリ、文字フォントを保存する。そして、ステップS153に戻る。
(S155)見出しフラグがオンでない場合には、データ部分の罫線項目である。罫線項目情報は、入れ子情報かを判定する。入れ子情報である場合には、ステップS156に進む。入れ子情報でない場合には、ステップS154で保存した文字認識カテゴリ、文字フォントを参照中の罫線項目に設定する。これにより、データ部分に、同一論理列の見出し部分の属性が設定される。そして、ステップS153に戻る。
(S156)入れ子情報である場合には、参照中の罫線項目と同一レベル(階層番号リンク通し番号)の罫線項目から、ステップS154で保存した文字認識カテゴリ、文字フォントを参照中の罫線項目に設定する。そして、ステップS153に戻る。
このようにして、論理列を構成する罫線項目のうち、見出し以外の罫線項目に対して、文字認識カテゴリ、文字フォント等の認識特性を、見出しの罫線項目から複写する。図84に示すように、図2の帳票例の場合には、罫線項目情報テーブル1104のデータ部分の罫線項目3、5、7等に、同一論理列の罫線項目の文字認識カテゴリCC、文字フォントCFが設定される。このため、論理列情報により、データ部分のデータ名属性が決定される。
(k)データ部分の文字認識処理の説明
次に、データ部分の文字を認識するため、見出しフラグが設定されていない罫線項目の文字認識を行う。
図85は、文字認識処理フロー図、図86は、文字認識結果の説明図である。
(S160)図86に示す文字認識結果通知領域管理部1200をメモリに設定する。管理部1200は、認識結果見出し数と、認識結果見出し領域アドレスとからなる。
(S161)グループ情報テーブル1100から、グループ情報を抽出する。全てのグループ情報を抽出したかを判定する。全てのグループ情報を抽出した場合には、終了する。
(S162)グループ情報からアドレス指示されているブロック情報を抽出する。グループ内の全ブロック情報を抽出したかを判定する。グループ内の全ブロック情報を抽出した場合には、ステップS161に戻る。
(S163)ブロック情報からアドレス指示されている論理列情報を抽出する。全ての論理列情報を抽出したかを判定する。全ての論理列を抽出した場合には、ステップS162に戻る。
(S164)論理列情報からアドレス指示されている罫線項目情報を抽出する。
(S165)罫線項目情報の見出しフラグがオンかを判定する。見出しフラグがオンである場合には、ステップS164に戻る。
(S166)見出しフラグがオンでない場合には、その罫線項目内に存在する文字列を、一般の文字認識辞書1004(図1参照)を使用して、文字認識する。この時、文字認識辞書1004は、漢字、数字等の各認識カテゴリに対し、別々に設けられている。従って、前述したデータ部分の認識属性に従い、一般辞書から認識辞書を選択して、文字認識する。このため、データ部分も高い精度で文字認識できる。
更に、図86に示す認識結果見出し領域1201を設定する。領域1201は、見出し名称と、認識結果データ数、認識結果レコード長、認識結果データアドレスから成る。そして、認識結果データ領域1202を設定する。即ち、認識結果データアドレスの示す領域に、認識結果を設定する。
このようにして、得られた認識結果を認識結果通知領域に設定する。これにより、データ部分のデータ名称、データ数、文字認識結果が得られる。
このようにして、各罫線項目の行と列の関係を判定し、見出し部とそれに対応するデータ部とに分類する。そして、見出し部分を見出し認識辞書を用いて文字認識して、見出し名称を得る。論理列の構造の関係から見出し部分に対応したデータ部分のデータ名称が判明する。このため、帳票の各項目のフォーマットを予め定義しておく必要がない。
更に、見出し名称から認識属性を見出しテーブルにより得る。これに従い、データ部分を文字認識する。このため、帳票の表構造を解析することができ、データ部分の文字認識結果を精度を高めることができる。
上述の実施の形態では、各帳票の記入又は印刷文字として、漢字、英字、数字を例に説明したが、数字又は英字のみであって良い。又、罫線項目の属性として、そのデータ名称、文字認識カテゴリ、文字フォントを検出しているが、データ名称のみであっても良い。
以上、本発明の実施の形態により説明したが、本発明の主旨の範囲内で種々の変形が可能であり、これらを本発明の範囲から排除するものではない。