以下、図面を参照しながら、本発明を実施するための形態(実施形態)について説明する。なお、本発明は本実施形態に限定されない。
(概要)
まず、図1を参照しながら、データ構造抽出装置10が扱う帳票ファイルについて説明する。
帳票ファイルは1以上のシートからなり、シートは、符号101、符号102に示すように項目名と、その項目名に対応する項目値とを示した表(帳票)を含む。帳票内の各項目名同士、あるいは、項目名と項目値との間には包含関係が存在する場合がある。例えば、符号101に示す帳票において項目名14は項目値14−1〜項目値14−4を包含し(縦方向の包含)、項目名19は項目名14〜項目名17に対応する各項目値を包含する(横方向の包含)。また、符号102に示す帳票において項目名22は項目名20および項目名21に対応する各項目値を包含し(縦方向の包含)、また、項目名23は項目名22、項目名20および項目名21に対応する各項目値を包含する(横方向の包含)。つまり、帳票には縦方向の包含関係と横方向の包含関係が混在する場合がある。
データ構造抽出装置10は、このように帳票に縦方向または横方向の論理関係が混在する場合であっても、帳票の論理構造を解釈し、項目名および項目値のノードからなる木構造データを抽出する。例えば、データ構造抽出装置10は、符号101に示す帳票から符号103に示す木構造データを抽出し、符号102に示す帳票から符号104に示す木構造データを抽出する。
ところで、所定の要件を満たした記載方法によって帳票の項目名および項目値が記載されていない場合、データ構造抽出装置10は正確な論理構造の解釈を行えないことがある。そのため、本実施形態において、データ構造抽出装置10は、帳票に所定の要件を満たさない記載方法によって記載された箇所がある場合、当該箇所を要件が満たされるように補正したうえで論理構造を解釈し木構造データを抽出する。
(構成)
図2を用いてデータ構造抽出装置10の構成を説明する。データ構造抽出装置10は、データ構造抽出部11と、記憶部12と、罫線枠補正部20とを備える。
データ構造抽出部11は、端末(例えば、パーソナルコンピュータ、スマートフォン等)等から帳票ファイルの入力を受け付けると、帳票構造ルール121(詳細は後記)を参照して、この帳票ファイルの木構造データを抽出し、帳票データベース(帳票構造情報記憶部)122に登録する。
記憶部12は、帳票構造ルール121と、帳票データベース122とを備える。帳票構造ルール121は、データ構造抽出部11が、帳票ファイルから木構造データを抽出する際に参照する種々のルールを記憶する。この帳票構造ルール121は、例えば、図16−1の(a)に示すノード生成ルール、メタ情報生成ルール、隣接エッジ生成ルール、包含エッジ生成ルール、ノードクラスタ生成ルール、木構造生成ルールや、(b)に示す隣接エッジチェックルール、包含エッジチェックルール、木構造条件ルール、表型・列挙型推定ルール、木構造選定ルール等を含む。これらのルールの詳細は後記する。
帳票データベース122は、データ構造抽出部11が抽出した木構造データを含む帳票構成情報(図6参照)を記憶する。
罫線枠補正部20は、帳票に所定の要件を満たさない記載方法によって記載された箇所がある場合、当該箇所が要件を満たすように補正したうえで帳票をデータ構造抽出部11に受け渡す。そして、データ構造抽出部11は、罫線枠補正部20によって補正された帳票を基に木構造データの抽出等を行う。
(データ構造抽出部)
次に、図3−1を用いてデータ構造抽出装置10のデータ構造抽出部11を詳細に説明する。データ構造抽出部11は、グラフ生成部13と、ノードクラスタ部138と、木構造推定部14と、帳票構造構築部143とを備える。なお、記憶部12の項目名データベース123は、装備する場合と装備しない場合があり、装備する場合については後記する。
グラフ生成部13は、帳票ファイルの項目名および項目値を示すノードのノード情報を生成する。また、このノード情報には、ノード間の隣接関係を示す情報(隣接エッジ)および包含関係を示す情報(包含エッジ)を含める。さらに、グラフ生成部13は、帳票ファイルから、当該帳票ファイルの属性情報であるプロパティ情報を取得する。
ノードクラスタ部138は、ノード情報に示される各ノードの隣接エッジの連結性に基づいてノードをノードクラスタに分類する。
木構造推定部14は、ノードクラスタに分類されたノード群から部分木パターンを生成する。そして、木構造推定部14は生成した部分木パターン群をノードの重複がないように組み合わせることにより、帳票ファイルの木構造データを生成する。
帳票構造構築部143は、木構造推定部14から出力された帳票ファイルの木構造データと、グラフ生成部13から出力された当該帳票ファイルのプロパティ情報とを統合し、帳票データベース122に登録する。
(グラフ生成部)
グラフ生成部13は、操作インタフェース識別部131と、帳票書式情報取得部132と、ノード生成部133と、プロパティ情報取得部134と、隣接エッジ生成部135と、包含エッジ生成部136とを備える。項目名登録部137は、装備する場合と装備しない場合があり、装備する場合については後記する。
操作インタフェース識別部131は、帳票ファイルの種類を特定し、帳票ファイルを操作するための操作インタフェースを決定する。そして、操作インタフェース識別部131は、決定した操作インタフェースを示す情報(操作インタフェース情報)を帳票書式情報取得部132へ出力する。操作インタフェースは、帳票ファイルの情報を取得するためのインタフェースであり、例えば、API(Application Programming Interface)、COM(Component Object Model)、OLE(Object Linking and Embedding)等である。また、操作インタフェース識別部131は、帳票ファイルのファイル情報(例えば、帳票ファイルのアプリケーションの種類、作成日、追加日、サイズ、ファイル属性等のプロパティ情報)をプロパティ情報取得部134へ出力する。
帳票書式情報取得部132は、帳票の操作インタフェースを利用して、帳票ファイルの各シート(ページ)のドキュメント情報、書式情報を取得する。ドキュメント情報は、例えば、帳票に関するプロパティ情報、タイトル、様式番号、作成者、作成日、ページ数、文字数、分類、キーワード等である。また、書式情報は、例えば、帳票を構成する書式に関するプロパティ情報、文字情報(例えば、文字列、文字の型等)、罫線情報(例えば、罫線の開始および終了位置、罫線の種類、罫線の太さ等)、セル情報等である。なお、書式とは、例えば、帳票上の文字列、罫線の種類、罫線の太さ、罫線が囲う範囲、ノードの結合情報、ノードの色情報等であり、セル情報とは、例えば、帳票ファイルのシートを構成するセルの高さ・幅・左上座標・右下座標、セルの結合状態、セルの塗りつぶしの色等である。
ノード生成部133は、帳票構造ルール121に従い、帳票の項目名または項目値を示すノードを生成する。ノード生成部133は、例えば、帳票書式情報取得部132で得た帳票の書式情報に基づき、帳票のシート上の罫線で囲われている部分をノードとして抽出する。そして、ノード生成部133は生成したノードに関する情報(ノード情報)を隣接エッジ生成部135へ出力する。また、ノード生成部133は、シート上の罫線で囲われていない部分の情報をメタデータ(非ノード情報)として抽出し、プロパティ情報取得部134へ出力する。
プロパティ情報取得部134は、帳票のプロパティ情報(帳票のファイル情報、ドキュメント情報、非ノード情報)を、帳票構造構築部143へ出力する。
隣接エッジ生成部135は、帳票の書式情報およびノード情報を参照して、当該帳票のノード間の隣接関係を示す隣接エッジを生成する。隣接エッジ生成部135は、生成した隣接エッジを当該ノードのノード情報に追加する。
包含エッジ生成部136は、ノード情報に示される各ノードの隣接エッジおよび帳票の書式情報を参照して、各ノードの位置およびサイズから、ノード間の縦方向または横方向の包含関係を示す包含エッジを生成する。包含エッジ生成部136は、生成した包含エッジを当該ノードのノード情報に追加する。
(木構造推定部)
木構造推定部14は、部分木パターン生成部140と、木構造データ構築部141と、木構造選定部142とを備える。項目名割当部139は装備する場合と装備しない場合があり、装備する場合については後記する。
部分木パターン生成部140は、ノードクラスタに分類されたノード群について部分木パターンを生成する。具体的には、部分木パターン生成部140は、ノードクラスタに分類されたノード群について帳票上の木構造の特性を満たすように隣接エッジを修正し、各ノードが項目名か項目値かの項目属性の設定を行うことにより部分木パターンを生成する。
また、部分木パターン生成部140は、上記の隣接エッジの修正において、ノード群のノードそれぞれの項目属性および配置位置に基づき、ノード群の示す帳票構造が、項目名と項目値とが一対一の関係である列挙型か、項目名と項目値とが一対多の関係である表型かを推定し、その推定結果に基づき、ノード群の隣接エッジを修正する。そして、生成した部分木パターンを、木構造データ構築部141へ出力する。なお、この部分木パターンの生成の詳細は後記する。
木構造データ構築部141は、部分木パターンをノードの重複がないように組み合わせることにより帳票の木構造データを生成する。生成した木構造データは木構造選定部142へ出力する。なお、木構造データは、例えば、図1の符号103,104に示すように、帳票の論理構造{項目名,…,項目名,項目値}を木構造に変換して表したものである。
木構造選定部142は、1つの帳票について複数の木構造データが生成されたとき、帳票構造ルール121に従い、木構造データの選択を行う。選択した木構造データは帳票構造構築部143へ出力する。
このようなデータ構造抽出装置10によれば、帳票の中に縦横の論理構造が混在している場合であっても、木構造データを精度よく抽出することができる。
(罫線枠補正部)
罫線枠補正部20は、取得部21と、補正部22と、補正ルール入力部27とを備える。また、補正部22は、罫線枠の結合を行う結合部23と、罫線枠の分割を行う分割部24と、罫線枠の削除を行う削除部25と、罫線枠の追加を行う追加部26とを備える。取得部21は、グラフ生成部13から、隣接エッジ生成部135によって隣接エッジが追加されたノード情報および書式情報から、罫線枠情報を取得する。また、取得部21は、必要に応じてグラフ生成部13からメタデータを罫線枠情報に含めて取得する。
罫線枠情報は、各ノードのノード情報、および各ノードに対応する罫線で構成された矩形に関する情報である。取得部21が罫線枠情報を取得する方法は、グラフ生成部13から取得する方法に限られない。例えば、取得部21は、罫線枠情報を、帳票ファイルを参照しアプリ標準のオブジェクト構造から取得するようにしてもよいし、帳票を画像として読み取り、画像情報から取得するようにしてもよい。また、罫線枠情報には、例えば矩形の座標位置、幅、高さ、枠内の塗りつぶし色、枠内の文字列、四辺の罫線の種類および太さが含まれる。また、罫線枠で囲われていない文字列については、内部的に四方に罫線枠を保持しておくようにしてもよい。取得部21は、帳票から罫線枠を抽出し、罫線枠ごとの罫線枠情報として、罫線の種類または太さ、枠内の文字列、および枠内の塗りつぶし色を少なくとも取得する。
補正ルール記憶部28は、補正が行われる条件および条件が満たされた場合に行われる補正処理すなわちアクションを組み合わせた補正ルールを記憶している。補正ルール記憶部28は、補正ルールとして、例えば罫線枠の結合処理と結合処理が行われる条件である罫線枠結合条件とを組み合わせた結合ルール、罫線枠の分割処理と分割処理が行われる条件である罫線枠分割条件とを組み合わせた分割ルール、罫線枠の削除処理と削除処理が行われる条件である罫線枠削除条件とを組み合わせた削除ルール、罫線枠の追加処理と追加処理が行われる条件である罫線枠追加条件とを組み合わせた追加ルールを記憶している。
罫線枠結合条件、罫線枠分割条件および罫線枠削除条件は、例えば、罫線の種類が予め設定された特定の種類であること、罫線の太さが予め設定された特定の太さの範囲に含まれること、枠内の文字列が予め設定された特定の文字列であること、枠内の塗りつぶし色が予め設定された特定の色であること等のいずれか1つ、または複数を組み合わせたものである。
補正部22の各部は、補正ルールを参照し、条件を満たす罫線枠に対して、各条件に対応するアクションを行う。結合部23は、複数の罫線枠の罫線枠情報が予め設定された罫線枠結合条件を満たしている場合、該複数の罫線枠を結合する。また、分割部24は、結合部23による処理が実行された後、罫線枠の罫線枠情報が予め設定された罫線枠分割条件を満たしている場合、該罫線枠を分割する。また、削除部25は、分割部24による処理が実行された後、罫線枠の罫線枠情報が予め設定された罫線枠削除条件を満たしている場合、該罫線枠を削除する。
また、追加部26は、削除部25による処理が実行された後、領域の領域情報が予め設定された罫線枠追加条件を満たしている場合、該領域に罫線を追加する。このとき、取得部21は、メタデータ等を基に、帳票から文字列が記載された領域を抽出し、領域ごとの領域情報として、領域の上下左右いずれかの方向の罫線の有無、文字列および領域の塗りつぶし色を少なくとも取得し、また領域の上下左右いずれかの方向に罫線が存在する場合は該罫線の種類または太さを取得しておく。
なお、補正部22の各部は、ノード情報を変更することで罫線枠の補正を行う。補正ルール記憶部28は、補正ルール入力部27から手動または自動で入力される。また、補正部22によって補正されたノード情報は、グラフ生成部13、ノードクラスタ部138または木構造推定部14等に受け渡される。
ここで、図3−2を用いて、罫線枠補正部20によって補正が行われる罫線枠の例について説明する。図3−2は、補正される罫線枠の一例を示す図である。まず、図3−2の(a)に示すように、削除部25は、罫線枠の文字列が「※」で始まる場合、罫線枠を削除する。また、図3−2の(b)に示すように、分割部24は、罫線枠の枠内の文字列にチェックボックスを表す文字および該チェックボックスの項目名を表す文字列の両方が含まれる場合、該罫線枠を該チェックボックスに対応する罫線枠および該項目名に対応する罫線枠に分割する。
また、図3−2の(c)のように、分割部24は、罫線枠内の文字列が所定の文字列AおよびBである場合、それぞれの文字列ごとに罫線枠を分割する。また、図3−2の(d)に示すように、結合部23は、第1の罫線枠の、第1の罫線枠に隣接する第2の罫線枠との間の罫線の種類が点線である場合、第1の罫線枠と第2の罫線枠とを結合する。また、図3−2の(e)に示すように、削除部25は、罫線枠の枠内の文字列が空かつ塗りつぶし色が灰色である場合、該罫線枠を削除する。
(処理手順)
次に、図4−1を用いて、データ構造抽出装置10の処理手順を説明する。データ構造抽出装置10のデータ構造抽出部11において帳票ファイルの入力を受け付けると(S1)、グラフ生成部13は、帳票ファイルの項目名および項目値を示すノードのグラフを生成する(S2)。つまり、グラフ生成部13は、帳票を構成する各ノードについて、各ノード間の隣接関係および包含関係を示すノード情報を生成する。また、グラフ生成部13は、帳票のプロパティ情報の取得も行う。
罫線枠補正部20は、グラフ生成部13によって生成されたノード情報を変更することで、罫線枠の補正を行う(S3)。そして、罫線枠補正部20によって補正されたノード情報は、ノードクラスタ部138に受け渡される。
次に、ノードクラスタ部138は、罫線枠補正部20によって補正された各ノードのノード情報に示される隣接エッジの連結性に基づいて各ノードをノードクラスタに分類する(S4)。そして、木構造推定部14は、ノードクラスタに分類されたノード群ごとに部分木パターンを生成し、生成した部分木パターンを組み合わせて木構造データを生成する(S5:木構造推定)。その後、帳票構造構築部143は、S5で生成された木構造データと、グラフ生成部13において取得した帳票のプロパティ情報とを統合し、帳票データベース122に登録する(S6:帳票構造構築)。
このようにすることでデータ構造抽出装置10は、帳票ファイルから帳票の木構造データを生成することができる。また、データ構造抽出部11は、帳票の木構造データと、当該帳票のプロパティ情報とを統合した情報を帳票データベース122に登録することができる。
(グラフ生成)
次に、図4−2を用いて、図4−1のS2のグラフ生成処理を詳細に説明する。まず、グラフ生成部13の操作インタフェース識別部131は、帳票ファイルの操作インタフェースの識別を行い(S131)、帳票書式情報取得部132は、帳票ファイルの書式情報の取得を行い(S132)、ノード生成部133は、帳票ファイルを構成するノード情報の生成を行う(S133:ノード生成)。また、プロパティ情報取得部134は、帳票のファイル情報、ドキュメント情報、非ノード情報を当該帳票のプロパティ情報として集約し、帳票構造構築部143へ出力する(S134:プロパティ情報取得)。その後、隣接エッジ生成部135は、帳票の書式情報およびノード情報を参照して、当該帳票のノード間の隣接関係を示す隣接エッジを生成し、生成した隣接エッジを当該ノードのノード情報に追加する(S135:隣接エッジ生成)。その後、包含エッジ生成部136は、ノード情報に示される各ノードの隣接エッジおよび帳票の書式情報を参照して、各ノードの包含エッジを生成し、生成した包含エッジを当該ノードのノード情報に追加する(S136:包含エッジ生成)。
このようにすることでグラフ生成部13は、帳票を構成する各ノードについて、各ノード間の隣接関係および包含関係を示すノード情報を生成することができる。
(罫線枠補正)
次に、図4−3を用いて、図4−1のS3の罫線枠補正処理を詳細に説明する。罫線枠補正部20の取得部21は、グラフ生成部13から罫線枠情報を取得する(S21)。なお、追加部26による罫線枠追加処理を行う場合、取得部21はグラフ生成部13から罫線で囲われていない部分の情報であるメタデータを罫線枠情報に含めて取得する。また、補正部22は、補正ルール記憶部28から補正ルールを読み込む(S22)。
そして、結合部23は、罫線枠情報が罫線枠結合条件を満たす場合、当該罫線枠情報に対応する罫線枠を結合する(S23)。そして、分割部24は、罫線枠情報が罫線枠分割条件を満たす場合、当該罫線枠情報に対応する罫線枠を分割する(S24)。そして、削除部25は、罫線枠情報が罫線枠削除条件を満たす場合、当該罫線枠情報に対応する罫線枠を削除する(S25)。そして、追加部26は、メタデータが罫線枠追加条件を満たす場合、当該メタデータに対応する部分に罫線枠を追加する(S26)。そして、罫線枠補正部20は補正を行ったノード情報を出力する(ステップS27)。
このように、罫線枠補正部20によって所定の条件を満たす罫線枠の補正が行われることで、木構造推定部14等で項目名間および項目名−項目値間の論理関係を正確に推定できるようになる。また、補正部22の各部の処理の具体的な例については後述する。
(木構造推定)
次に、図4−4を用いて、図4−1のS5の木構造推定処理を詳細に説明する。木構造推定部14の部分木パターン生成部140は、S4でノードクラスタに分類されたノード群について部分木パターンを生成する(S140)。そして、木構造推定部14は、S140で生成された部分木パターンを組み合わせて木構造データを構築する(S141)。その後、木構造選定部142は、S141で構築された木構造データが複数あれば、これらの中から木構造データを1つ選定する(S142)。
このようにすることで木構造推定部14は、帳票の各ノード間の隣接関係および包含関係を反映した木構造データを生成することができる。
(操作インタフェース識別)
次に、図5−1を用いて、図4−2のS131の操作インタフェースの識別処理の一例を説明する。なお、以下の説明において、指定先への出力時のデータの記述言語は、例えば、CSV(Comma-Separated Values)、JSON(JavaScript(登録商標) Object Notation)、XML(eXtensible Markup Language)等を用いる。また、指定先への出力はフォルダごとに出力してもよいし、ZIP、CAB形式等のデータ圧縮を行った上で出力してもよい。
まず、操作インタフェース識別部131は、帳票ファイルのファイル情報を読み込むと(S1311)、帳票ファイルの種類を識別する(S1312)。例えば、操作インタフェース識別部131は、ファイル情報に含まれる帳票ファイルのプロパティ情報や拡張子、アプリケーションが固有に持つマジックナンバーから当該帳票ファイルで用いられるアプリケーションの種類を特定する。また、操作インタフェース識別部131は、読み込んだファイル情報をプロパティ情報取得部134へ出力する。そして、操作インタフェース識別部131は、S1312で特定した帳票ファイルの種類に合わせて操作インタフェースを決定する(S1313)。ここで、操作インタフェースが決定できれば(S1314でYes)、操作インタフェース識別部131は、操作インタフェース情報を指定先(ここでは帳票書式情報取得部132)へ出力し(S1315)、操作インタフェースが決定できなければ(S1314でNo)、例えば、エラーメッセージとして「帳票として情報を登録しない」旨をユーザに返す(S1316)。
このようにすることで、操作インタフェース識別部131は帳票ファイルの操作インタフェースを決定することができる。
(帳票書式情報取得)
次に、図5−2を用いて、図4−2のS132の帳票書式情報取得処理の一例を説明する。帳票書式情報取得部132は、帳票ファイルの操作インタフェース情報を読み込み(S1321)、帳票ファイルを読み込むと(S1322)、帳票ファイルからページ(シート)ごとの書式情報を取得し(S1323)、また、帳票ファイルからドキュメント情報を取得する(S1324)。そして、帳票書式情報取得部132は、取得した書式情報、ドキュメント情報に罫線情報があれば(S1325でYes)、取得した書式情報、ドキュメント情報を指定先に出力する(S1326)。例えば、書式情報についてはノード生成部133に出力し、ドキュメント情報についてはプロパティ情報取得部134へ出力する。なお、帳票書式情報取得部132は、取得した書式情報、ドキュメント情報に罫線情報がなければ(S1325でNo)、例えば、エラーメッセージとして「帳票として情報を登録しない」旨をユーザに返す(S1327)。
このようにすることで帳票書式情報取得部132は、帳票ファイルから書式情報およびドキュメント情報を取得することができる。
(ノード生成)
次に、図5−3、図5−4および図16−2を用いて、図4−2のS133のノード生成処理の一例を説明する。ノード生成部133は、書式情報を読み込み(S1331)、また、帳票構造ルール121を読み込み(S1332)、帳票構造ルール121のノード生成ルール(図16−1参照)に従い、書式情報からノード情報を取得する(S1333)。ノード情報は、例えば、図5−4に示すように、罫線で囲まれた文字列(例えば、「担当者」)、罫線で囲まれたセルの左上座標(px1,py1)および右下座標(px2,py2)、塗りつぶし色(例えば、白)、罫線の種類(例えば、実線)、罫線のサイズ(例えば、1pt)等である。この他、罫線で囲まれたセルの高さや幅の情報も含んでいてもよい。
ノード生成部133は上記のようにして書式情報からノード情報を取得すると、ノード情報を隣接エッジ生成部135に出力する(S1334:ノード情報を出力)。一方書式情報に含まれる情報のうちノード情報以外の情報(非ノード情報)はプロパティ情報取得部134に出力する(S1335:非ノード情報を出力)。
書式情報に含まれる情報が、ノード情報(ノードの情報)か、非ノード情報(非ノードの情報)かは、以下のようにして判断する。例えば、ノード生成部133は、帳票構造ルール121に従い、図16−2に示す帳票のうち、帳票の罫線で囲まれた「氏名」等をノードとし、罫線で囲まれていない「様式A−1」等を非ノードとする。なお、ノード生成部133は、罫線で囲まれており、かつ、同じ背景色で塗りつぶされた領域をノードとしてもよいし、実線の罫線で囲まれた領域をノードとしてもよい。さらに、ノード生成部133は、予め非ノードとする文字列を決めておき、その文字列を含む領域を非ノードとしてもよいし、予め非ノードと判断する領域(例えば、帳票の上部または下部)を決めておき、その領域で文字列が配置されている領域を非ノードとしてもよい。そして、ノード生成部133は、ノードと判断した部分についてノード情報として取得し、非ノードと判断した部分について非ノード情報として取得する。
このようにすることで、ノード生成部133は帳票ファイルの木構造データの生成に必要なノード(ノード情報)を抽出することができる。また、ノード生成部133は、帳票ファイルの属性情報を非ノード情報として抽出することができる。
(プロパティ情報取得)
次に、図5−5を用いて、図4−2のS134のプロパティ情報取得処理の一例を説明する。プロパティ情報取得部134は、ファイル情報を読み込み(S1341)、ドキュメント情報を読み込み(S1342)、非ノード情報を読み込み(S1343)、帳票構造ルール121を読み込む(S1344)。そして、プロパティ情報取得部134は、読み込んだ帳票構造ルール121に従って非ノード情報から帳票メタ情報を生成する(S1345)。帳票メタ情報とは、帳票のタイトル、日付、様式等の帳票に付随する情報である。
例えば、プロパティ情報取得部134は、帳票構造ルール121のメタ情報生成ルール(図16−1の(a)参照)に従い、非ノード情報の文字列の区切り記号(例えば、「:」や「/」等)や文字列の内容を基に帳票メタ情報を生成する。例えば、「氏名:xxx」という非ノード情報があれば、「氏名」という帳票メタ情報を生成する。また、プロパティ情報取得部134は、非ノード情報に含まれる文字列(例えば、「様式」、「氏名」)や特殊文字(例えば、「〒」、「TEL」)、データ型、フォーマット等が分かっていればそのデータ型やフォーマット等を基に、帳票メタ情報を生成してもよい。例えば、日付や社員番号等のデータ型が予めわかっていれば、プロパティ情報取得部134はそのデータ型により、「日付」や「社員番号」という帳票メタ情報を生成する。
S1345の後、プロパティ情報取得部134は、各属性情報(つまり、ファイル情報、ドキュメント情報および帳票メタ情報)をプロパティ情報として集約し(S1346)、帳票構造構築部143に出力する(S1347:プロパティ情報出力)。
このようにすることでプロパティ情報取得部134は、帳票ファイルのプロパティ情報を取得することができる。
なお、S1347においてプロパティ情報は、例えば、図6に示すように、ファイル情報、ドキュメント情報および帳票メタ情報が関連付けられた状態で帳票構造構築部143へ出力される。その後、帳票構造構築部143は、このプロパティ情報に、木構造推定部14により生成された木構造データ(符号601,602)を統合して、帳票データベース122に出力する。
(隣接エッジ生成)
次に、図7−1および図7−2を用いて、図4−2のS135の隣接エッジ生成処理の一例を説明する。隣接エッジ生成部135は、図4−2のS133で生成されたノード情報を読み込み(S1351)、帳票構造ルール121を読み込む(S1352)。そして、隣接エッジ生成部135は、帳票構造ルール121に従い、各ノード間の隣接エッジを求め(S1353)、隣接関係をチェックする(S1354)。その後、隣接エッジ生成部135は、ノード情報にS1353で生成した隣接エッジ(隣接エッジ情報)を追加し(S1355)、隣接エッジ生成部135は隣接エッジ情報が追加されたノード情報を包含エッジ生成部136に出力する(S1356)。
例えば、隣接エッジ生成部135は、まず、各ノードのノード情報を参照して、ノードごとに、当該ノードの上、下、左、右方向の隣接ノードを示した情報(隣接ベクトル)を生成する。なお、当該ノードに隣接ノードがある場合には、隣接ベクトルに隣接ノードのインデックス情報を保持させる。隣接ノードがない場合には、隣接ベクトルにその旨(例えば、「0」)を記載する。例えば、図7−2に示す「担当者」ノードの上、下、左に隣接ノードはないが、右に「名前」ノードと「所属」ノードが隣接する場合、隣接エッジ生成部135は、その旨を示す隣接エッジ情報を、「担当者」ノードのノード情報に追加する。
このようにすることで隣接エッジ生成部135は、各ノードの隣接関係を示す隣接エッジを生成することができる。
(各ノード間の隣接エッジを求める処理)
次に、図7−3および図16−3を用いて、図7−1のS1353の各ノード間の隣接エッジを求める処理の一例を説明する。隣接エッジ生成部135は、図7−1のS1351で読み込んだノード情報を参照して、未探索のノードX,Yを定義すると(S13532)、ノードXとノードYが、隣接関係に関する帳票構造ルール121(図16−1の(a)の隣接エッジ生成ルール)を満たすか否かを判定する(S13533)。S13533において、隣接エッジ生成部135が、ノードXとノードYについて隣接関係に関する帳票構造ルール121を満たすと判定したとき(S13533でYes)、ノードX,Yに対して隣接方向に隣接エッジを張る(S13534)。そして、隣接エッジ生成部135は、全てのノード間の隣接関係をチェックしたと判定すると(S13535でYes)、隣接エッジ情報を出力する(S13536)。一方、S13533において、隣接エッジ生成部135がノードXとノードYについて隣接関係に関する帳票構造ルール121を満たさないと判定したとき(S13533でNo)、S13534をスキップしてS13535へ進む。一方、隣接エッジ生成部135は、まだノード間の隣接関係をチェックしていないものがあると判定すると(S13535でNo)、S13532へ戻る。
なお、上記の隣接エッジ生成ルールは、例えば、図16−3に示すノードXとノードYについて、(1)ノードXのy座標範囲がノードYのy座標の範囲を包含し、かつ、(2)ノードXのx座標の終点がノードYのx座標の始点と一致するときノードXとノードYについて隣接関係があるとみなす、というルールである。つまり、図16−3に示すノードXとノードYについて、ノードXの左上座標をX(x1,y1)、右下座標をX(x2,y2)とし、ノードYの左上座標をY(x1,y1)、右下座標をY(x2,y2)とするときに、(1)X(*,y1)≦Y(*,y1)かつX(*,y2)≧Y(*,y2)であり、(2)X(x2,*)=Y(x1,*)であるとき、隣接エッジ生成部135は、ノードXとノードYについて隣接関係があるとみなす。
なお、上記は右方向(横方向)の隣接エッジ生成ルールであるが、下方向(縦方向)の隣接エッジ生成ルールについても同様に定義される。このように隣接エッジ生成部135がノードの右方向、下方向の隣接エッジを生成することで、対となる(当該ノードに隣接する)ノードの左、上方向の隣接エッジも取得できる。
このようにすることで隣接エッジ生成部135はノード間の位置関係に基づき隣接エッジを生成することができる。
(隣接関係をチェックする処理)
次に、図7−4および図16−4を用いて、図7−1のS1354の各ノード間の隣接関係をチェックする処理の一例を説明する。隣接エッジ生成部135は、S13536で出力された隣接エッジ情報を読み込み(S13541)、未確認のノードXについて隣接方向kを定義する(S13542)。なお、隣接方向kは、横方向、縦方向のいずれかを示し、例えば、横方向であればk=0とし、縦方向であればk=1とする。次に、隣接エッジ生成部135は、ノードXのk方向の隣接エッジが帳票構造ルール121(図16−1の(b)の隣接エッジチェックルール)を満たし(S13543でNo)、全ノード、全隣接方向を確認済みであれば(S13545でYes)、隣接エッジ情報を出力する(S13546)。一方、ノードXのk方向の隣接エッジが帳票構造ルール121(図16−1の(b)の隣接エッジチェックルール)を満たさなければ(S13543でYes)、当該隣接エッジを削除し(S13544)、S13545へ進む。また、S13545でいずれかのノードまたはいずれかの隣接方向を確認していなければ(S13545でNo)、S13541へ戻る。
なお、上記の隣接エッジチェックルールは、例えば、図16−4に示すノードXについて、(1)ノードXの右側に位置する全ノードのy座標がノードXのy座標の範囲内あり(1つでも満たさないノードがあれば不成立)、かつ、(2)ノードXの左にあるノードは1つ以下であるとき、ノードXに関する隣接エッジの修正は必要ないとみなす、というルールである。例えば、図16−4の符号1601に示すようにノードXの右側に位置するノードがノードYのみであり、このノードYのy座標がノードXのy座標に包含されていれば、隣接エッジ生成部135は、前記した(1)の条件を満たすと判断する。一方、符号1602に示すようにノードXの右側に位置するノードがノードY,Zであり、ノードYのy座標がノードXのy座標に包含されていなければ、前記した(1)の条件を満たさないと判断する。また、符号1603に示すようにノードXの左側に位置するノードがノードWのみであれば、隣接エッジ生成部135は、前記した(2)の条件を満たすと判断する。一方、符号1604に示すように、ノードXの左側に位置するノードがノードW,Vの2つであるとき、隣接エッジ生成部135は、前記した(2)の条件は満たさないと判断する。
なお、上記は右方向(横方向)の隣接エッジチェックルールであるが、下方向(縦方向)の隣接エッジチェックルールについても同様に定義される。
このようにすることで隣接エッジ生成部135は生成した隣接エッジについて帳票上の隣接関係として不適切な隣接関係を含む場合、これを修正することができる。
(包含エッジ生成)
次に、図8および図16−5を用いて、図4−2のS136の包含エッジ生成処理の一例を説明する。包含エッジ生成部136は、図4−2のS135で生成された隣接エッジ情報を含むノード情報を読み込み(S1361)、また、帳票構造ルール121を読み込む(S1362)。そして、包含エッジ生成部136は、未探索のノードX,Y、隣接方向kを定義すると(S1363)、任意のノードXと他のノードYとk方向(縦/横)について、包含関係に関する帳票構造ルール121(図16−1の(a)の包含エッジ生成ルール)を満たすか否かを判定する(S1364)。ここで、包含エッジ生成部136が任意のノードXと他のノードYとk方向(縦/横)について、包含関係に関する帳票構造ルール121を満たしていれば(S1364でYes)、ノードX,Y間に包含エッジを張る(S1365)。一方、包含エッジ生成部136が任意のノードXと他のノードYとk方向(縦/横)について、包含関係に関する帳票構造ルール121(図16−1の(a)の包含エッジ生成ルール)を満たしていなければ(S1364でNo)、S1365をスキップしてS1366へ進む。S1366で、全てのノード間の包含関係を確認済みであれば(S1366でYes)、ノード情報に包含エッジ情報を追加し(S1367)、当該ノード情報をノードクラスタ部138に出力する(S1368)。一方、まだいずれかのノード間の包含関係を確認済みでなければ(S1366でNo)、S1363へ戻る。
なお、上記の包含エッジ生成ルールは、例えば、(1)ノードXの右方向に隣接するノードが2つ以上ある。(2)ノードXの右方向に隣接するノードのy座標が全てノードXのy座標の範囲にある。(3)ノードXの右方向に隣接するノードのy座標のいずれか1つがノードXの始点のy座標と重なり、かつノードXの右方向に隣接するノードのy座標のいずれか1つがノードXの終点のy座標と重なる。という3つの条件を全て満たすとき、ノードXと、このノードXの右方向に隣接するノード(および当該ノードに隣接する一連のノード)について包含関係がある、とみなすルールである。
この包含エッジ生成ルールによれば、例えば、図16−5の符号161に示すノードXと、ノードXの右方向に隣接するノード(ノードY,Z,U)および当該ノードの右方向に隣接する一連のノード(ノードW,V,T)について、包含エッジ生成部136は包含関係があるとみなす。すなわち、上記の例でいうと、包含エッジ生成部136は、ノードX、ノードY,Z,U,W,V,Tに包含関係がある、とみなす。
なお、例えば、図16−5の符号161に示すノード群のうちノードUが欠けた状態のとき(符号162参照)、上記の(1)および(2)の条件を満たすが、上記の(3)に示す「ノードXの右方向に隣接するノードのy座標のいずれか1つがノードXの終点のy座標と重なる」という条件を満たさないので、包含エッジ生成部136は、ノードX、ノードY,Z,W,V,Tには包含関係がないとみなす。
なお、上記は右方向(横方向)の包含エッジ生成ルールであるが、下方向(縦方向)の包含エッジ生成ルールについても同様に定義される。例えば、下方向(縦方向)の包含エッジ生成ルールは、(1)ノードXの下方向に隣接するノードが2つ以上ある。(2)ノードXの下方向に隣接するノードのx座標が全てノードXのx座標の範囲にある。(3)ノードXの右方向に隣接するノードのx座標のいずれか1つがノードXの始点のx座標と重なり、かつノードXの右方向に隣接するノードのx座標のいずれか1つがノードXの終点のx座標と重なる。という3つの条件を全て満たすとき、ノードXと、このノードXにの下方向に隣接するノード(および当該ノードに隣接する一連のノード)について包含関係がある、とみなすルールである。
このようにすることで包含エッジ生成部136は、各ノードの包含関係を示す包含エッジを生成することができる。
(ノードクラスタに分類する処理)
次に、図10−1、図10−2および図10−3を用いて、図4−1のS4のノードクラスタに分類する処理の一例を説明する。ノードクラスタ部138は、図4−1のS2のグラフ生成処理で生成されたノード情報を読み込み(S1381)、帳票構造ルール121を読み込む(S1382)。そして、ノードクラスタ部138は帳票構造ルール121(図16−1の(a)に示すノードクラスタ生成ルール)に従い、任意のノードXを始点として他のノードYのクラスタリングを行う(S1383)。その後、ノードクラスタ部138はクラスタリングされていないノードがあるか否かを確認し(S1384)、クラスタリングされていないノードがあれば(S1384でYes)、クラスタリングされていないノードをノードXとして選択し(S1385)、S1383に戻る。一方、ノードクラスタリングされていないノードがなければ(S1384でNo)、ノードクラスタ部138はノードクラスタを木構造推定部14に出力する(S1386)。
なお、上記のノードクラスタ生成ルールは、例えば、あるノードの隣接エッジについて、当該ノードに連結しているノード群をノードクラスタとみなす、というルールである。また上記のルールに、例えば、当該ノードに連結しているノード群のうち、所定の罫線(例えば、太線や赤色の罫線)で分断されたノードについては別のノードクラスタとみなすというルールや、所定の塗りつぶし色(例えば、灰色)のノードは同じノードクラスタとみなすというルールを組み合わせてもよい。
ノードクラスタ部138は、このようなノードクラスタ生成ルールに従い、ノードクラスタへの分類を行うことで、例えば、図10−2に示すように、同じ帳票ファイルのシート内の表について物理的に離れているものをノードクラスタ1,2に分けることができる。その結果、木構造推定部14は、同じシート内の帳票(表)のうち、物理的に離れているものについてそれぞれ別個の木構造データを生成することができる。
(任意のノードXを始点とした他のノードYのクラスタリング処理)
なお、図10−1のS1383の処理は、例えば、図10−3に示す処理手順により行われる。まず、ノードクラスタ部138は、ノードXのノード情報を読み込むと(S13831)、ノードXを始点として他のノードYを探索し(S13832)、ノードYを発見できなかったとき(S13833でNo)、ノードYがクラスタリング済みか否かを判定し(S13834)、ノードYがクラスタリング済みでなければ(S13834でNo)、ノードYをノードXと同じクラスタ(ノードクラスタ)に分類し、ノードYに分類済みのフラグをたてる(S13835)。その後、S13836へ進む。S13833でノードYを発見できたとき(S13833でYes)、S13839へ進む。またノードYがクラスタリング済みであれば(S13834でYes)、S13836へ進む。
S13836において、ノードクラスタ部138は、全ノードを探索したとき(SS13836でYes)、ノードXに分類済みフラグをたて(S13837)、ノードクラスタを出力する(S13838)。一方、まだ探索していないノードがあるとき(S13836でNo)、未探索のノードをノードYとして定義し(S13839)、S13832へ戻る。
このようにすることで、ノードクラスタ部138は、各ノードをノードクラスタに分類することができる。
(部分木パターン生成処理)
次に、図12−1〜図12−5、図16−6および図16−7を用いて、図4−4のS140の部分木パターン生成処理の一例を説明する。部分木パターン生成部140は、図4−1のS4で分類されたノードクラスタのノード情報を読み込み(S1401)、帳票構造ルール121を読み込む(S1402)。そして、部分木パターン生成部140は、ノードクラスタ内の包含ノードの集合を取得し、探索済包含ノード集合に{φ}を設定する(S1403)。なお、包含ノードとは、ノード間の包含関係において他のノードを包含する側のノードであり、例えば、図16−5の符号161に示すノード群のうちノードXが包含ノードに相当する。
次に、包含エッジ生成部136は包含ノードの階層毎にC(X,k)をレベル分けする。また最大階層をmとし、n(包含ノードの階層)に「0」を設定する(S1404)。
なお、上記のC(X,k)は、包含ノードであるノードXがk方向に包含するノードの集合を示す。例えば、ノードXが縦方向に包含するノード集合はC(X,1)であり、横方向に包含するノード集合はC(X,0)である。また、上記の階層は、包含ノードが入れ子構造になっている場合の階層を示し、入れ子になる包含ノードがない場合は「1」であり、ある場合は「その入れ子構造の数+1」である。例えば、図12−2に示すノードクラスタは入れ子になる包含ノードが1つなので、階層は「2」である。
次に、部分木パターン生成部140はレベルnのC(X,k)について部分木パターンを取得し(S1405)、探索済包含ノード集合にレベルnの包含ノードを追加する(S1406)。そして、部分木パターン生成部140はnの値をインクリメントして(S1407)、n>m、かつ、未探索の包含ノードが存在しない場合(S1408でYes)、包含ノード集合の部分木パターンを木構造データ構築部141に出力する(S1409)。一方、n>mではない、または、未探索の包含ノードが存在する場合(S1408でNo)、S1405へ戻る。
このようにすることで部分木パターン生成部140は、ノードクラスタ内で包含ノードが入れ子構造になっている場合でも、階層ごとの部分木パターンを取得することができる。
(部分木パターン取得処理)
次に、図12−3を用いて、図12−1のS1405の部分木パターンの取得処理の一例を説明する。部分木パターン生成部140は、レベルnのC(X,k)を読み込み(S14051)、帳票構造ルール121を読み込む(S14052)。そして、部分木パターン生成部140は、C(X,k)の部分木パターンに{φ}を設定し(S14053)、nが1以上であれば(S14054でYes)、C(X,k)に含まれる直近階層の包含ノード(ノードX´)について、C(X´,k)をダミーノードとみなす(S14055)。例えば、部分木パターン生成部140は、図12−2に示すノード群のうち、符号1201に示すノード群を、図12−3の吹き出し1202に示すように1つのノード(ダミーノード)とみなす。なお、S14054でnが1以上でなければ(S14054でNo)、S14059へ進む。
次に、部分木パターン生成部140は、C(X,k)について木構造変換処理を行い(S14056)、部分木パターンが取得できれば(S14057でYes)、C(X,k)の部分木パターンに当該部分木パターンを追加する(S14058)。一方、S14057で部分木パターンが取得できなければ(S14057でNo)、S14059へ進む。
次に、部分木パターン生成部140は、C(X,k)に含まれる包含ノードがないとみなし(S14059)、S14056と同様にC(X,k)について木構造変換処理を行い(S14060)、部分木パターンが取得できれば(S14061でYes)、C(X,k)の部分木パターンに当該部分木パターンを追加する(S14062)。そして、部分木パターン生成部140は、C(X,k)の部分木パターンを出力する(S14063)。一方、部分木パターンが取得できなければ(S14061でNo)、S14062をスキップして、S14063へ進む。
このようにすることで部分木パターン生成部140は、ノードクラスタ内で包含ノードが入れ子構造になっている場合に、階層ごとの部分木パターンと、ノードクラスタ全体の部分木パターンとの両方の部分木パターンを取得できる。
(C(X,k)についての木構造変換処理)
次に、図12−4を用いて、図12−3のS14056およびS14060におけるC(X,k)についての木構造変換処理の一例を説明する。部分木パターン生成部140は、C(X,k)を読み込み(S140601)、木構造生成に関する帳票構造ルール121を読み込む(S140602)。そして、部分木パターン生成部140は、木構造生成に関する帳票構造ルール121(図16−1の(a)の木構造生成ルール)に従い、各ノードの隣接エッジの修正と項目属性の設定を行う(S140603)。
なお、上記の木構造生成ルールは、例えば、以下の(1)〜(4)に示す4つの条件からなる。すなわち、(1)包含ノードを除いて下位(この場合、右側)に隣接エッジは1本のみである。包含ノードを除いて下位(この場合、右側)に隣接エッジが2本以上ある場合、部分木パターン生成部140は、その隣接エッジをカットする。例えば、部分木パターン生成部140は、図16−6の(1)に示すノードaとノードb,cを接続する隣接エッジをカットする。
(2)包含ノードの下位のノードはすべて包含ノードを上位に持つ。(1)の後、包含ノードを除いて上位(この場合、左側)の隣接エッジを持たないノードがある場合、部分木パターン生成部140は、k方向に包含ノード(ノードX)と隣接エッジを張る。例えば、部分木パターン生成部140は、図16−6の(2)に示すノードXとノードb,cを接続する隣接エッジを張る。
(3)下位の隣接エッジがある場合の項目属性は「項目名」、ないノードの項目属性は「項目値」である。(2)の後、部分木パターン生成部140は、下位の隣接エッジがないノードの項目属性を「項目値」に設定する。例えば、部分木パターン生成部140は、図16−6の(3)に示すノードa,d,e,fの項目属性を「項目値」に設定する。
(4)隣接エッジが1本のノードが2つ以上連結されている部分を含む場合、表型または列挙型または隣接エッジを張るべきでない(木構造不適合)。(1)〜(3)の後、隣接エッジが1本のノードが2つ以上連結されている部分を含む場合、表型・列挙型推定ルール(詳細は後記)に従い、包含ノードを含むノード群について表型か列挙型かの推定(判断)を行う。例えば、部分木パターン生成部140は、図16−6の(4)の符号1610に示す隣接エッジが1本のノードが2つ以上連結されている一連のノード群を発見した場合、符号1610に示すノード群について表型・列挙型推定ルール(詳細は後記)による表型か列挙型かの推定(判断)対象とする。
図12−4のS140603の後、部分木パターン生成部140は、S140603により設定された項目属性が「項目値」のノードから未探索のノードZを選択し(S140604)、ノードZからノードXまでを辿る(S140605)。このときのノードZからノードXまでの経路をroute(X,Z)とする。そして、部分木パターン生成部140は、表型・列挙型推定ルール(図16−1の(b)参照)に従い、表型・列挙型となる経路(route(X,Z))があるか否かを判定(推定)し(S140606)、表型・列挙型となる経路(route(X,Z))があれば(S140606のYes)、表型・列挙型推定に関する帳票構造ルール121(表型・列挙型推定ルール)に従って、表型・列挙型の設定を行う(S140607)。そして、S140609へ進む。一方、表型・列挙型となる経路(route(X,Z))がなければ(S140606のNo)、表型・列挙型となる経路(route(X,Z))上のノードZ以外の項目属性を「項目名」に設定し(S140608)、S140609へ進む。
なお、上記の表型・列挙型推定ルールは、例えば、以下の(1)〜(4)に示す4つの条件からなる。(1)ノードXが包含するノードが格子状の連結関係を持つ。例えば、部分木パターン生成部140は、図16−7の(1)に示すようにノードXが包含するノードが格子状の連結関係を持つとき、これらのノードを、表型・列挙型推定対象とする。
(2)(1)の条件を満たす場合において、ノードXに隣接しないノードに「項目名」のノードが存在するならば「列挙型」か「木構造不適合」と判断する。例えば、部分木パターン生成部140は、図16−7の(2)に示すようにノードXに隣接しないノードに「項目名」のノードが存在するとき、「列挙型」か「木構造不適合」と推定する。
(3)(1)の条件を満たすが、(2)の条件を満たさない場合において、ノードXが包含する各ノードの端点が隣接する他のノードのいずれかの端点と重なるならば「表型」と推定する。例えば、部分木パターン生成部140は、図16−7の(3)に示すようにノードXが包含する各ノードの端点が隣接する他のノードのいずれかの端点と重なっていれば「表型」と推定する。
(4)(1)および(2)の条件を満たす場合において、ノードXを除いたノードから末端のノードまでのノードの個数が偶数であれば「列挙型」と推定し、奇数であれば「木構造不適合」と推定する。例えば、部分木パターン生成部140は、図16−7の(4)に示すようにノードXを除いたノードから末端のノードまでのノードの個数が偶数(4個)であれば「列挙型」と判断し、奇数(3個)であれば「木構造不適合」と判断する。つまり、図16−7の(4)に示すように「列挙型」であれば、「項目名」と「項目値」とがペアの構造となるが、「項目名」に対しペアとなる「項目値」がない場合、帳票の木構造として不自然であるので、部分木パターン生成部140は、このようなノード群については「木構造不適合」と推定する。上記のようにして、部分木パターン生成部140はノード群が表型か列挙型かそもそも木構造として不適合かの推定を行う。
そして、部分木パターン生成部140は、上記の表型・列挙型推定ルールに従い、表型と推定したノード群については表型の項目属性の割当と隣接エッジの修正を行い(図12−5の(a)参照)、列挙型と推定したノード群については列挙型の項目属性の割当と隣接エッジの修正を行う(図12−5の(b)参照)。
図12−4のS140607の後、部分木パターン生成部140は、S140607においてC(X,k)を表型または列挙型に変換できた場合(S140609でYes)、S140604で選択したノードZを探索済みとする(S140610)。そして、項目属性が「項目値」のノード全てを探索済みであれば(S140611でYes)、部分木パターン生成部140は、C(X,k)の部分木パターンを出力し(S140612)、項目属性が「項目値」のノードに探索していないノードがあれば(S140611でNo)、S140604に戻る。
一方、S140609において、部分木パターン生成部140は、C(X,k)を表型または列挙型に変換できなかった場合(S140609でNo)、C(X,k)について木構造条件を満たさないと判断する(S140613)。この場合、部分木パターンの出力は行わない。
このようにすることで部分木パターン生成部140は、包含ノードに包含されるノード群(C(X,k))について、表型か列挙型かを考慮しつつ、各ノードの隣接エッジの修正と項目属性の設定を行う。また、部分木パターン生成部140は、木構造条件(帳票としての木構造の特性)を満たさないノード群については、部分木パターンとして出力しない。その結果、部分木パターン生成部140は、精度の高い部分木パターンを生成することができる。
(木構造データ構築処理)
次に、図13を用いて、図4−4のS141の木構造データ構築処理を説明する。木構造データ構築部141は、S140で生成された各包含ノードの部分木パターンを読み込み(S1411)、ノードクラスタのノード情報を読み込み(S1412)、帳票構造ルール121を読み込む(S1413)。そして、木構造データ構築部141は、木構造データの集合に{φ}を設定した後(S1414)、ノードの重複がないような部分木パターンの組み合わせを求める(S1415)。その後、木構造データ構築部141は、部分木パターンの組み合わせ群から、未確認の部分木パターンの組み合わせを選ぶ(S1416)。つまり、後記するS1419の処理を行っていない部分木パターンの組み合わせを選ぶ。その後、木構造データ構築部141は、S1412で読み込んだノードクラスタのノード情報を参照して、S1416で選んだ部分木パターンの組み合わせについて、不足しているノードを追加する(S1417)。
次に、木構造データ構築部141は、S1417までの処理により生成された部分木パターンの組み合わせ(およびそれに追加されたノード)の包含エッジ、隣接エッジを参照しながら木構造を生成する(S1418)。
そして、木構造データ構築部141は、S1418で生成された木構造について、木構造の条件に関する帳票構造ルール121(図16−1の(b)の木構造条件ルール)に従い、木構造の条件を満たすか否かを判断し(S1419)、木構造の条件を満たせば(S1419でYes)、当該木構造を木構造データに追加する(S1520)。その後、全ての部分木パターンの組み合わせを確認していれば(S1521でYes)、木構造データ構築部141は、木構造データを木構造選定部142に出力する(S1522)。
なお、木構造データ構築部141が、S1418で生成された木構造が木構造の条件を満たさないと判断したとき(S1419でNo)、S1416へ戻る。また、木構造データ構築部141が、S1521で、まだ確認していない部分木パターンの組み合わせがあるときも(S1521でNo)、S1416へ戻る。
なお、上記の木構造条件ルールは、例えば、以下の(1)〜(3)に示す3つの条件からなる。すなわち、(1)「項目名」のノード間のエッジは1対多。(2)「項目名」のノードと「項目値」のノード間のエッジは1対1。ただし、部分木パターン生成部140により表型と判断されたノード群の場合は、1対多となる。(3)「項目値」のノードは下位のノードを持たない。以上の3つの条件を満たすとき、木構造データ構築部141は、当該木構造を木構造の条件を満たすと判断する。
(木構造データ選定処理)
次に、図14−1を用いて、図4−4のS142の木構造データ選定処理を説明する。木構造選定部142は、木構造データ構築部141から出力された木構造データを読み込む(S1421)。ここで、読み込んだ木構造データが1種類でなければ(S1422でNo)、木構造データ選定に関する帳票構造ルール121を読み込み(S1423)、木構造データ選定に関する帳票構造ルール121(図16−1の(b)の木構造データ選定ルール)に従い、木構造データの選定処理を行い(S1424)、選定した木構造データを出力する(S1425)。一方、読み込んだ木構造データが1種類であれば(S1422でYes)、木構造選定部142は、読み込んだ木構造データを出力する(S1425)。
図14−2を用いて、図14−1のS1424における木構造データ選定ルールに従った、木構造データの選定処理の例を説明する。
例えば、木構造選定部142は、図14−2の(a)に示すように複数の木構造データ間の差分情報をユーザに表示し、ユーザが修正した情報を利用して木構造データを選定する。すなわち、木構造選定部142は、各木構造データのノード情報の差分をとり(S14241)、ユーザ側に結果通知(例えば、「異常」があることの通知)を行う(S14242)。そして、S14242の後、木構造選定部142は、例えば、木構造データの差分情報(例えば、生成された複数の木構造データを比較して得られるノードの項目属性や、包含エッジにおける包含関係、隣接エッジにおける隣接方向等の違いを示した情報)を表示した後、ユーザからGUI(Graphical User Interface)等により木構造修正情報の入力を受け付けると(S14243)、木構造選定部142は、この木構造修正情報に基づき木構造データを修正し、修正した木構造データを選定する(S14244)。
このようにすることで、複数の木構造データが生成されたときに、木構造選定部142はユーザが所望するような修正を加味した木構造データを出力することができる。
また、例えば、木構造選定部142は、図14−2の(b)に示すように、2以上の帳票ファイルを処理する場合に、1つの帳票ファイルから複数の木構造データが生成されれば、全て(またはある一定の)帳票ファイルの処理が行われた後にユーザに処理を求めるようにしてもよい。例えば、木構造選定部142は、複数の木構造データが出力された場合に各木構造データのノード情報の差分をとると(S14245)、木構造データの差分情報を出力(キャッシュ)し(S14246)、この処理中に「帳票として情報を登録しない(つまり、当該木構造データを帳票データベース122に登録しない)」旨をユーザに表示する(S14247)。そして、木構造選定部142は、全ての帳票ファイル群を処理したか否かを判断し(S14248)、未処理の帳票ファイルがあれば(S14248のNo)、未処理の帳票ファイル(帳票)を処理する(S14249)。つまり、S14245以降の処理を行う。また、木構造選定部142は、全ての帳票ファイル群を処理したと判断したとき(S14248でYes)、S14246で出力された木構造データの差分情報を読み込み(S14250)、ユーザ側に結果通知を行う(S14251)。例えば、木構造選定部142は、ユーザ側に帳票ファイルそれぞれの木構造データの差分情報の通知を行う。その後、ユーザはこれらの帳票ファイルの木構造データの差分情報に対して図14−2の(a)の処理を実施するか、帳票ファイルから木構造データへの変換を行わないかを決定する。
このようにすることで、木構造選定部142は、2以上の帳票ファイルの処理を行う場合に、他の帳票ファイルの選定・変換処理に影響を与えずに全帳票ファイルの処理を実行できる。また、複数の木構造データが生成されたときに、木構造選定部142はその差分情報をまとめてユーザに表示することができる。
また、例えば、木構造選定部142は、図14−2の(c)に示すように、複数の木構造データのうち最もシンプルな構造の木構造データを選定してもよい。例えば、木構造選定部142は、各木構造データについて構造の複雑さを示す値を計算する(S14252)。そして、木構造選定部142は、構造が最もシンプルな木構造データを選定する(S14253)。例えば、木構造選定部142は、各木構造データにおける包含関係の階層の数をカウントし、その包含関係の階層が最も少ない木構造データを選定する。そして、木構造選定部142は、ユーザ側に木構造データの選定の結果通知を行う(S14254)。
このように木構造データの構造の複雑さに着目して木構造データの選択を行うのは、木構造データ構築部141によりあまりに複雑な構造を持つ木構造データが生成された場合、その木構造データは、実際の帳票ファイルの論理構造とは異なる可能性が高いと推測されるからである。つまり、上記のように複数の木構造データが生成されたときに、木構造選定部142が、最もシンプルな構造の木構造データを選定することで、より実際の帳票ファイルの論理構造に近い木構造データを選定することができる。
(帳票構造構築処理)
次に、図15を用いて、図4−1のS6の帳票構造構築処理を説明する。帳票構造構築部143は、木構造推定部14により出力された木構造データを読み込むと(S1431)、全ノードクラスタの木構造データを取得済みか否かを判定し(S1433)、全ノードクラスタの木構造データを取得済みであれば(S1433のYes)、ノードクラスタを統合する(S1434)。そして、帳票構造構築部143は、プロパティ情報取得部134から出力されたプロパティ情報を読み込み(S1435)、このプロパティ情報を含む帳票構成に木構造データを追加する(S1436)。これを帳票構成情報とする。
例えば、帳票構造構築部143は、図6に示すようにプロパティ情報(ファイル情報+ドキュメント情報+帳票メタ情報)を含む帳票構成に、木構造推定部14にて生成した木構造データを統合する。
その後、帳票構造構築部143は帳票ファイルの全ページ(全シート)について木構造データを取得したことを確認すると(S1437でYes)、S1436で生成した帳票構成情報を帳票データベース122に出力する(S1438)。一方、帳票構造構築部143は帳票ファイルのまだ木構造データを取得していないページがあれば(S1437でNo)、ノード生成部133にて図4−2のS133のノード生成処理を行う(S133)。また、S1433においてまだ木構造データを取得していないノードクラスタがあれば(S1433でNo)、帳票構造構築部143は未取得のノードクラスタを選択し(S1440)、木構造推定部14にて図4−1のS5の木構造推定処理を行う(S5)。
このようにすることで、帳票構造構築部143は各ノードクラスタの木構造データをプロパティ情報と統合した情報(帳票構成情報)を帳票データベース122に登録することができる。
以上説明したデータ構造抽出装置10によれば帳票ファイルの中に縦横の論理構造が混在している場合であっても、帳票ファイルの木構造データを精度よく抽出することができる。また、データ構造抽出部11は、この帳票ファイルの木構造データとプロパティ情報とを対応付けた情報を帳票データベース122に登録することができる。
(その他の実施形態)
なお、データ構造抽出装置10は、帳票ファイルから抽出した項目名を項目名データベース123に登録しておき、新たな帳票ファイルを受け付けたときには、この項目名データベース123を参照して、ノードクラスタのノードの項目属性を付与するようにしてもよい。
このようなデータ構造抽出装置10は、図3−1の破線で示す項目名登録部137と、項目名データベース123と、項目名割当部139とを備える。
項目名登録部137は、ノード生成部133からノード情報を取得すると、項目名の判断に関する帳票構造ルール121に従い、項目名のノードである可能性の高いノードから文字列を抜き出し、項目名データベース123に登録する。
項目名データベース123は、項目名登録部137により抜き出された文字列(項目名に用いられることが多い文字列)を記憶する。
項目名割当部139は、項目名データベース123を参照して、ノードクラスタの各ノードに対して項目属性(「項目名」か「項目値」か)を付与する。
このようなデータ構造抽出装置10によれば、ノードクラスタの各ノードに対し精度よく項目属性を付与することができる。その結果、データ構造抽出装置10は精度のよい木構造データを生成することができる。また、木構造データ生成処理に要する時間を低減できる。
(項目名登録処理)
図9を用いて項目名登録部137の処理手順の例を説明する。項目名登録部137は、ノード生成部133から出力された帳票のノード情報を読み込み(S1371)、項目名判断に関する帳票構造ルール121を読み込む(S1372)。そして、項目名登録部137は、当該帳票のノード情報が項目名の判断に関する帳票構造ルール121を満たすと判断したとき(S1373でYes)、当該帳票をテンプレートとみなし、項目名の判断に関する帳票構造ルール121に従って、各ノードから文字列情報を抜き出す(S1374)。その後、項目名登録部137は、抜き出した文字列から文の構造を省き(S1375)、抜き出した文字列を項目名データベース123に登録する(S1376)。一方、項目名登録部137は、当該帳票のノード情報が項目名の判断に関する帳票構造ルール121を満たさないと判断したとき(S1373でNo)、処理を終了する。
上記の項目名の判断に関するルールは、例えば、以下の(1)〜(3)のいずれかの条件を満たすとき、ノード情報から文字列情報を抽出すると判断する、というルールである。(1)ノードの文字列情報が空(null)のノードが閾値以上(例えば、帳票ファイル全体の50%以上のノードに対して)である。(2)ノードに指定した塗りつぶし色、または白、透明以外のいずれかの塗りつぶし色が閾値以上(例えば、帳票ファイル全体数の50%以上のノードに対して)使われている。(3)ユーザにより帳票ファイルがテンプレート、すなわち、項目名にあたるノードにのみ文字列が付与されている帳票であると定義される。また、(1)または(3)の場合、項目名の登録に関し、項目名登録部137は、文字情報が空でないノードの文字列を全て項目名として登録するというルール、(2)の場合、項目名登録部137は、指定した塗りつぶし色、または白、透明以外のいずれかの塗りつぶし色の文字列を項目名として登録するというルールもさらに備える。
このようにすることで、項目名割当部139は、より項目名である可能性の高い文字列情報を項目名データベース123に登録することができる。
(項目名割当処理)
図11を用いて項目名割当部139の処理手順の例を説明する。項目名割当部139は、ノードクラスタのノード情報を読み込み(S1391)、項目名データベース123の項目名リストを読み込む(S1392)。次に、項目名割当部139は、ノードクラスタの未確認のノードをノードXとし(S1393)、任意のノードXの文字列が項目リスト上に存在すれば(S1394でYes)、ノードXの項目属性に「項目名」を割り当て(S1395)、ノードXの文字列が項目リスト上に存在しなければ(S1394でNo)、ノードXの項目属性を割り当てない(S1396)。S1395、S1396の後、項目名割当部139が全てのノードを確認した(つまり、S1393以降の処理を実行した)と判断すると(S1397でYes)、ノードクラスタのノード情報を部分木パターン生成部140に出力する(S1398)。一方、項目名割当部139において未確認のノードがあれば(S1397でNo)、S1393へ戻る。
このようにすることで、項目名割当部139は、ノードクラスタの各ノードに対し項目属性を付与することができる。
(罫線枠補正部の補正処理の具体例)
ここで、罫線枠補正部20における罫線枠の補正処理の具体的な例について説明する。図4−3のS23〜S26において、補正部22の各部は、まず罫線枠情報および補正ルールを読み込み、補正ルールごとに補正処理を行う。そして、補正部22の各部は、補正処理におけるノード情報の更新を罫線枠情報に反映させ、次の処理部に対して罫線枠情報を出力する。例えば、分割部24の補正処理によって更新された罫線枠情報が削除部25に対して出力される。そして、削除部25は分割部24から出力された罫線枠情報を用いて補正処理を行う。以降、補正部22の各部の処理の具体例について詳細に説明する。
(罫線枠結合処理)
まず、図17を用いて、罫線枠結合処理の具体例について説明する。図17は、罫線枠結合処理の一例を示すフローチャートである。図17に示すように、まず、結合部23は、補正ルールの中から結合ルール群を取得する(S231)。次に、結合ルール群のうちのある結合ルールの罫線枠結合条件が、罫線の種類または太さに関する条件である場合(S232で罫線の種類、太さ)、結合部23は、結合処理Aを実行する(S233)。また、当該結合ルールの罫線枠結合条件が、枠内の文字列または塗りつぶし色に関する条件である場合(S232で枠内の文字列、色)、結合部23は、結合処理Bを実行する(S234)。
このとき、全結合ルール群について処理が完了している場合(S235でYes)、処理を終了する。一方、全結合ルール群について処理が完了していない場合(S235でNo)、未処理の結合ルールを取得し(S236)、S232へ戻る。
(結合処理A)
ここで、図18を用いて結合処理Aについて説明する。図18は、図17のS233の結合処理Aの一例を示すフローチャートである。図18に示すように、まず、結合部23は、処理の対象となる結合ルールを取得する(S23301)。例えば、結合ルールの罫線枠結合条件は「罫線枠の1辺に点線があること」であり、アクションは「点線で隣接する罫線枠を結合させること」である。
次に、結合部23は罫線枠情報を参照し、罫線枠結合条件に合致する罫線枠Xを取得する(S23302)。そして、結合部23は、条件に合致する罫線の方向dを取得する(S23303)。そして、結合部23は、罫線枠Xからd方向に隣接する罫線枠群Y1,…,Ymを取得する(S23304)。
ここで、結合部23は、結合ルールの中に、文字列や色に関する条件がさらに設定されている場合、罫線枠X,Y1,…,Ymが条件に従うか否かを判定する(S23305)。そして、結合部23は、罫線枠X,Y1,…,Ymが条件に従う場合(S23305でYes)、罫線枠Xと罫線枠群Y1,…,Ymをd方向に結合させる(S23306)。また、結合部23は、罫線枠X,Y1,…,Ymが条件に従わない場合(S23305でNo)、ステップS23302へ戻る。
そして、結合部23は、罫線枠を結合させた場合、結合後の罫線枠Xを罫線枠Zとし(S23307)、罫線枠群Y1,…,Ymを削除する(S23308)。さらに、結合部23は、罫線枠Zの周辺の隣接エッジを更新する(S23309)。そして、他に罫線枠結合条件に合致する罫線枠がある場合(S23310でYes)、S23302へ戻る。一方、他に罫線枠結合条件に合致する罫線枠がない場合(S23310でNo)、処理を終了する。
(結合処理B)
次に、図19を用いて結合処理Bについて説明する。図19は、図17のS234の結合処理Bの一例を示すフローチャートである。図19に示すように、まず、結合部23は、処理の対象となる結合ルールを取得する(S23401)。例えば、結合ルールの罫線枠結合条件は「罫線枠の文字列が「(1)」または「申込年月」であること」であり、アクションは「条件に合致する文字列が隣接する場合は罫線枠を結合させること」である。
次に、結合部23は罫線枠情報を参照し、罫線枠結合条件に合致する罫線枠群X,Y1,…,Ymを取得する(S23402)。例えば罫線枠Xの文字列が「(1)」、罫線枠群Y1,…,Ymの文字列が「申込年月」であるものとする。そして、結合部23は、罫線枠群Xと罫線枠群Y1,…,Ymとが隣接している場合(S23403でYes)、罫線枠群Y1,…,Ymの隣接方向d1,…,dmを取得する(S23404)。
そして、結合部23は、罫線枠Xと罫線枠群Yi(i=1,…,m)とを結合させる(S23405)。そして、結合部23は、結合後の罫線枠Xを罫線枠Zとし(S23406)、罫線枠群Y1,…,Ymを削除する(S23407)。さらに、結合部23は、罫線枠Zの周辺の隣接エッジを更新する(S23408)。そして、他に罫線枠結合条件に合致する罫線枠がある場合(S23409でYes)、S23402へ戻る。一方、他に罫線枠結合条件に合致する罫線枠がない場合(S23409でNo)、処理を終了する。
なお、結合前の罫線枠は、隣接する罫線枠群Y1,…,Ymの隣接方向によって、図20のように分類される。図20は、図17のS233の結合処理A、およびS234の結合処理Bを説明するための図である。このとき、罫線枠結合処理における罫線枠Zの書式情報は、例えば下記のように表される。
・範囲
X,Y1,…,Ymの範囲を合わせた範囲
・左上座標
(dが右または下の場合)Xの左上座標
(dが左または上の場合)Y1の左上座標
・右下座標
(dが右または下の場合)Ymの右下座標
(dが左または上の場合)Xの右下座標
・文字列
(dが右または下の場合)Xの文字列+Y1の文字列+…+Ymの文字列
(dが左または上の場合)Y1の文字列+…+Ymの文字列+Xの文字列
・塗りつぶし色
罫線枠Xの塗りつぶし色
(罫線枠分割処理)
次に、図21を用いて、罫線枠分割処理の具体例について説明する。図21は、罫線枠分割処理の一例を示すフローチャートである。図21に示すように、まず、分割部24は、補正ルールの中から分割ルール群を取得する(S241)。次に、分割ルール群のうちのある分割ルールの罫線枠分割条件が、枠内の文字列に関する条件である場合(S242で枠内の文字列)、分割部24は、分割処理A、B、Cのいずれかを実行する。また、当該分割ルールの罫線枠分割条件が、枠内の文字列に関する条件でない場合(S242でそれ以外)、分割部24は、分割処理A、Bのいずれかを実行する。
具体的に、分割ルールの罫線枠分割基準が隣接する罫線を利用するものである場合(S243で隣接する罫線を利用)、分割部24は分割処理Aを実行する(S244)。また、分割ルールの罫線枠分割基準が分割個数を利用するものである場合(S243で分割個数を利用)、分割部24は分割処理Bを実行する(S245)。また、分割ルールの罫線枠分割基準が文字列区切を利用するものである場合(S243で文字列区切を利用)、分割部24は分割処理Cを実行する(S246)。
そして、全分割ルール群について処理が完了している場合(S247でYes)、処理を終了する。一方、全分割ルール群について処理が完了していない場合(S247でNo)、未処理の分割ルールを取得し(S248)、S242へ戻る。
(分割処理A)
ここで、図22を用いて分割処理Aについて説明する。図22は、図21のS244の分割処理Aの一例を示すフローチャートである。図22に示すように、まず、分割部24は、処理の対象となる分割ルールを取得する(S24401)。例えば、図23に示すように、分割ルールの罫線枠分割条件は「罫線枠の文字列が「氏名住所」であること」であり、アクションは「右方向の罫線枠にならって、改行コードで分割すること」である。また、どの罫線枠にならって分割個数および線分間隔を決定するかは、図24に示すように、基準となる方向によって異なる。図23および図24は、図21のS244の分割処理Aを説明するための図である。
次に、分割部24は罫線枠情報を参照し、罫線枠分割条件に合致する罫線枠Xを取得する(S24402)。そして、分割部24は、罫線枠Xを分割する基準とする方向dを取得する(S24403)。そして、分割部24は、罫線枠Xからd方向に隣接する罫線枠から、分割個数nとその線分間隔L1,…,Lnを取得する(S24404)。そして、分割部24は、罫線枠Xの文字列の分割基準に従って文字列を分割し、分割した文字列をS1,…,Snとする(S24405)。
このとき、文字列の分割個数がnでない場合(S24406でNo)、分割部24は、エラーを出力し(ステップS24413)、S24402へ戻る。一方、文字列の分割個数がnである場合(S24406でYes)、分割部24は、罫線枠Xを分割した罫線枠Z1,…,Znを生成する(S24407)。そして、分割部24は、罫線枠Z1,…,Znに、それぞれ文字列S1,…,Snを格納する(S24408)。
そして、分割部24は、罫線枠Z1,…,Znをノード情報に追加し(S24409)、ノード情報から罫線枠Xを削除する(S24410)。さらに、分割部24は、罫線枠Zの周辺の隣接エッジを更新する(S24411)。そして、他に罫線枠分割条件に合致する罫線枠がある場合(S24412でYes)、S24402へ戻る。一方、他に罫線枠結合条件に合致する罫線枠がない場合(S24412でNo)、処理を終了する。
(分割処理B)
次に、図25を用いて分割処理Bについて説明する。図25は、図21のS245の分割処理Bの一例を示すフローチャートである。図25に示すように、まず、分割部24は、処理の対象となる分割ルールを取得する(S24501)。例えば、分割ルールの罫線枠分割条件は「罫線枠の文字列が「氏名住所」であること」であり、アクションは「隣接するいずれかの方向の罫線枠にならって、改行コードで2個に分割すること」である。また、図26に示すように、隣接する罫線枠が2個である方向の罫線枠にならって線分間隔が決定される。図26は、図21のS245の分割処理Bを説明するための図である。
次に、分割部24は罫線枠情報を参照し、罫線枠分割条件に合致する罫線枠Xを取得する(S24502)。そして、分割部24は、罫線枠X上の文字列の分割基準に従って、文字列を分割し、分割した文字列をS1,…,Snとする(S24503)。そして、分割部24は、罫線枠Xに隣接する個数がnである方向dを取得する(S24504)。方向dが取得できなかった場合、またはnが1である場合(S24505でYes)、S24502へ戻る。
一方、方向dが取得でき、nが1でない場合(S24505でNo)、分割部24は、罫線枠Xからd方向に隣接する罫線枠から線分間隔L1,…,Lnを取得する(S24506)。そして、分割部24は、罫線枠Xを分割した罫線枠Z1,…,Znを生成する(S24507)。そして、分割部24は、罫線枠Z1,…,Znに、それぞれ文字列S1,…,Snを格納する(S24508)。
そして、分割部24は、罫線枠Z1,…,Znをノード情報に追加し(S24509)、ノード情報から罫線枠Xを削除する(S24510)。さらに、分割部24は、罫線枠Zの周辺の隣接エッジを更新する(S24511)。そして、他に罫線枠分割条件に合致する罫線枠がある場合(S24512でYes)、S24502へ戻る。一方、他に罫線枠結合条件に合致する罫線枠がない場合(S24512でNo)、処理を終了する。
(分割処理C)
次に、図27を用いて分割処理Cについて説明する。図27は、図21のS246の分割処理Cの一例を示すフローチャートである。図27に示すように、まず、分割部24は、処理の対象となる分割ルールを取得する(S24601)。例えば、図28に示すように、分割ルールの罫線枠分割条件は「罫線枠の文字列が項目名とチェックボックスであること」であり、アクションは「項目名とチェックボックスの間で分割すること」である。図28は、図21のS246の分割処理Cを説明するための図である。
次に、分割部24は罫線枠情報を参照し、罫線枠分割条件に合致する罫線枠Xを取得する(S24602)。そして、分割部24は、罫線枠X上の文字列の分割基準に従って、文字列を分割し、分割した文字列をS1,…,Snとする(S24603)。nが1である場合(S24604でYes)、S24602へ戻る。
一方、nが1でない場合(S24604でNo)、分割部24は、文字列の長さに合わせて罫線枠Xを分割する線分間隔L1,…,Lnを取得する(S24605)。そして、分割部24は、罫線枠Xを分割した罫線枠Z1,…,Znを生成する(S24606)。そして、分割部24は、罫線枠Z1,…,Znに、それぞれ文字列S1,…,Snを格納する(S24607)。
そして、分割部24は、罫線枠Z1,…,Znをノード情報に追加し(S24608)、ノード情報から罫線枠Xを削除する(S24609)。さらに、分割部24は、罫線枠Zの周辺の隣接エッジを更新する(S24610)。そして、他に罫線枠分割条件に合致する罫線枠がある場合(S24611でYes)、S24602へ戻る。一方、他に罫線枠結合条件に合致する罫線枠がない場合(S24611でNo)、処理を終了する。
(罫線枠削除処理)
次に、図29を用いて、罫線枠削除処理の具体例について説明する。図29は、罫線枠削除処理の一例を示すフローチャートである。図29に示すように、まず、削除部25は、補正ルールの中から削除ルール群を取得する(S251)。次に、削除ルール群のうちのある削除ルールの罫線枠削除条件が、罫線の種類、太さまたは枠内の塗りつぶし色に関する条件である場合(S252で罫線の種類、太さ、枠内の色)、削除部25は、図30に示すように、条件を満たす罫線枠領域を取得する(S253)。図30は、罫線枠削除処理を説明するための図である。図30に示すように、条件に指定される罫線の種類として例えば点線および太線があり、また、条件に指定される塗りつぶし色として灰色がある。
次に、削除部25は、条件を満たす罫線枠群を取得する(S254)。そして、削除部25は罫線枠群を削除し(S255)、ノード情報を更新する(S256)。そして、全削除ルール群について処理が完了している場合(S257でYes)、処理を終了する。一方、全削除ルール群について処理が完了していない場合(S257でNo)、未処理の削除ルールを取得し(S258)、S252へ戻る。
(罫線枠追加処理)
次に、図31を用いて、罫線枠追加処理の具体例について説明する。図31は、罫線枠追加処理の一例を示すフローチャートである。図31に示すように、まず、追加部26は、補正ルールの中から追加ルール群を取得する(S261)。次に、追加ルール群のうちのある追加ルールの罫線枠追加条件が、罫線の有無、種類、太さに関する条件である場合(S262で罫線の有無、種類、太さ)、追加部26は、追加処理Aを実行する(S263)。また、当該追加ルールの罫線枠追加条件が、枠内の塗りつぶし色、または文字列に関する条件である場合(S262で枠内の文字列、色)、追加部26は、追加処理Bを実行する(S264)。
そして、全追加ルール群について処理が完了している場合(S265でYes)、処理を終了する。一方、全追加ルール群について処理が完了していない場合(S265でNo)、未処理の追加ルールを取得し(S266)、S262へ戻る。
(追加処理A)
ここで、図32を用いて追加処理Aについて説明する。図32は、図31のS263の追加処理Aの一例を示すフローチャートである。図32に示すように、まず、追加部26は、処理の対象となる追加ルールを取得する(S26301)。例えば、図33に示すように、追加ルールの罫線枠追加条件は「文字列のいずれか方向に罫線があること」であり、アクションは「罫線枠を追加すること」である。
次に、追加部26は罫線枠情報を参照し、罫線枠追加条件に合致する文字列範囲を取得する(S26302)。そして、取得した文字列範囲の上下左右方向のいずれにも罫線がない場合(S26303でNo)、他に罫線枠追加条件に合致する文字列範囲があるか否かの判定を行う(S26416)。一方、取得した文字列範囲の上下左右方向のいずれかに罫線がある場合(S26303でYes)、追加部26は、罫線のある方向dを取得する(S26304)。
dが上である場合(S26306で上)、追加部26は、罫線枠の左上座標(x2,y2)についてy=y2を満たす罫線枠集合Bを取得する(S26307)。また、dが下である場合(S26306で下)、追加部26は、罫線枠の右下座標(x2,y2)についてy=y2を満たす罫線枠集合Bを取得する(S26308)。また、dが左である場合(S26306で左)、追加部26は、罫線枠の左上座標(x2,y2)についてx=x2を満たす罫線枠集合Bを取得する(S26309)。また、dが右である場合(S26306で右)、追加部26は、罫線枠の右下座標(x2,y2)についてx=x2を満たす罫線枠集合Bを取得する(S26310)。dが上である場合の例を図34に、dが左である場合の例を図35に示す。図34および図35は、図31のS263の追加処理Aを説明するための図である。
そして、追加部26は、罫線枠集合Bについて連結グラフGを求め(S26311)、Gから(x,y)を含む線分範囲L(s,g)を求める(S26312)。さらに、dが上または下である場合(S26313で上または下)、高さが文字列の高さ、幅がL(s,g)の罫線枠Zを作成し、ノード情報に追加する(S26314)。また、dが左または右である場合(S26313で左または右)、幅が文字列の幅、高さがL(s,g)の罫線枠Zを作成し、ノード情報に追加する(S26314)。
そして、他に罫線枠追加条件に合致する文字列範囲がある場合(S26316でYes)、S26302へ戻る。一方、他に罫線枠結合条件に合致する文字列範囲がない場合(S26316でNo)、処理を終了する。
(追加処理B)
ここで、図36を用いて追加処理Bについて説明する。図36は、図31のS264の追加処理Bの一例を示すフローチャートである。図36に示すように、まず、追加部26は、処理の対象となる追加ルールを取得する(S26401)。例えば、図37に示すように、追加ルールの罫線枠追加条件は「文字列が灰色で塗りつぶされていること」であり、アクションは「罫線枠を追加すること」である。
次に、追加部26は罫線枠情報を参照し、罫線枠追加条件に合致する文字列範囲を取得する(S26402)。そして、取得した文字列範囲の上下左右方向のいずれかに罫線がある場合(S26403でYes)、追加部26は、追加処理Aを実行する(S26404)。一方、取得した文字列範囲の上下左右方向のいずれにも罫線がない場合(S26403でNo)、文字列の座標位置、高さ、幅から罫線枠Zを生成し(S26405)、ノード情報に罫線枠Zを追加する(S26406)。
そして、他に罫線枠追加条件に合致する文字列範囲がある場合(S26407でYes)、S26402へ戻る。一方、他に罫線枠結合条件に合致する文字列範囲がない場合(S26407でNo)、処理を終了する。
(効果)
取得部21は、帳票から罫線枠を抽出し、罫線枠ごとの罫線枠情報として、罫線の種類または太さ、枠内の文字列、および枠内の塗りつぶし色を少なくとも取得する。また、結合部23は、複数の罫線枠の罫線枠情報が予め設定された罫線枠結合条件を満たしている場合、該複数の罫線枠を結合する。また、分割部24は、結合部23による処理が実行された後、罫線枠の罫線枠情報が予め設定された罫線枠分割条件を満たしている場合、該罫線枠を分割する。また、削除部25は、分割部24による処理が実行された後、罫線枠の罫線枠情報が予め設定された罫線枠削除条件を満たしている場合、該罫線枠を削除する。
これにより、帳票に所定の要件を満たさない記載方法で項目名または項目値が記載されている部分がある場合であっても、当該部分が要件を満たした記載方法補正されるため、項目名間および項目名−項目値間の論理関係を正確に推定できる。
また、補正後の罫線枠を、帳票の項目名と項目名に対応する項目値とに分類し、項目名と項目値とを対応付けた木構造のデータを生成し出力する。これにより、項目名−項目値間の論理関係を正確に推定した木構造データを取得することができる。
取得部21は、さらに、帳票から文字列が記載された領域を抽出し、領域ごとの領域情報として、領域の上下左右いずれかの方向の罫線の有無、文字列および領域の塗りつぶし色を少なくとも取得し、また領域の上下左右いずれかの方向に罫線が存在する場合は該罫線の種類または太さを取得する。追加部26は、領域の領域情報が予め設定された罫線枠追加条件を満たしている場合、該領域に罫線を追加する。これにより、罫線枠が記載されていない文字列も含めて項目名−項目値間の論理関係を推定することができる。
(その他の実施形態)
罫線枠補正部20は、図38に示すように、入力された動作指示を認識し(ステップS22a)、動作指示に応じた処理を行うようにしてもよい。図38は、図4−1のS3の罫線枠補正処理の他の例を示すフローチャートである。例えば、動作指示としては、木構造データ出力、帳票出力、罫線枠グラフ出力がある。動作指示が木構造データ出力である場合の動作は前述の通りである。また、動作指示が帳票出力である場合、罫線枠補正部20は、補正部22で補正処理が行われた結果のノード情報を用いて帳票出力を行う(ステップS29a)。また、動作指示が罫線枠グラフ出力である場合、罫線枠補正部20は、ノード情報をそのまま罫線枠グラフとして出力する(ステップSS29b)。
また、罫線枠補正部20の補正部22は、図39に示すように、予め補正ルールを結合ルール、分割ルール、削除ルール、追加ルールの順にソートしておくようにしてもよい。図39は、図4−1のS3の罫線枠補正処理の他の例を示すフローチャートである。この場合、各部は補正ルールを検索することなく取得することができる。
なお、帳票出力が行われる場合、罫線枠補正部20は、補正を行ったノード情報に対してフラグを設定しておき、フラグが設定されたノード情報と対応する罫線枠について、ノード情報に含まれる座標情報を参照しながら、当該罫線枠の構成と文字列、塗りつぶし色等を書き換える。
[システム構成等]
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPU(Central Processing Unit)および当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
また、本実施形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
(プログラム)
一実施形態として、罫線枠補正方法は、罫線枠補正部20と同様の機能を持つ罫線枠補正装置により実施されてもよい。この場合、罫線枠補正装置は、パッケージソフトウェアやオンラインソフトウェアとして上記の罫線枠補正を実行する罫線枠補正プログラムを所望のコンピュータにインストールさせることによって実装できる。例えば、上記の罫線枠補正プログラムを情報処理装置に実行させることにより、情報処理装置を罫線枠補正装置として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やPHS(Personal Handyphone System)等の移動体通信端末、さらには、PDA(Personal Digital Assistants)等のスレート端末等がその範疇に含まれる。
また、罫線枠補正装置は、ユーザが使用する端末装置をクライアントとし、当該クライアントに上記の罫線枠補正に関するサービスを提供するサーバ装置として実装することもできる。例えば、罫線枠補正装置は、罫線枠情報を入力とし、補正済み罫線枠情報を出力とする罫線枠補正サービスを提供するサーバ装置として実装される。この場合、罫線枠補正装置は、Webサーバとして実装することとしてもよいし、アウトソーシングによって上記の罫線枠補正に関するサービスを提供するクラウドとして実装することとしてもかまわない。以上のように、本発明は、コンピュータとプログラムによっても実現でき、当該プログラムを記録媒体に記録することも、ネットワークを通して提供することも可能である。
図40は、罫線枠補正プログラムを実行するコンピュータを示す図である。図40に示すように、コンピュータ1000は、例えば、メモリ1010と、CPU(Central Processing Unit)1020と、ハードディスクドライブインタフェース1030と、ディスクドライブインタフェース1040と、シリアルポートインタフェース1050と、ビデオアダプタ1060と、ネットワークインタフェース1070とを有する。これらの各部は、バス1080によって接続される。
メモリ1010は、ROM(Read Only Memory)1011およびRAM(Random Access Memory)1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。ディスクドライブ1100には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース1050には、例えば、マウス1110およびキーボード1120が接続される。ビデオアダプタ1060には、例えば、ディスプレイ1130が接続される。
ここで、図40に示すように、ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093およびプログラムデータ1094を記憶する。上記実施形態で説明した各情報は、例えばハードディスクドライブ1090やメモリ1010に記憶される。
また、罫線枠補正プログラムは、例えば、コンピュータ1000によって実行される指令が記述されたプログラムモジュールとして、ハードディスクドライブ1090に記憶される。具体的には、上述の罫線枠補正装置が実行する各処理が記述されたプログラムモジュールが、ハードディスクドライブ1090に記憶される。
また、罫線枠補正プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ1090に記憶される。そして、CPU1020が、ハードディスクドライブ1090に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出して、上述した各手順を実行する。
なお、罫線枠補正プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1090に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、制御プログラムに係るプログラムモジュール1093やプログラムデータ1094は、LAN(Local Area Network)やWAN(Wide Area Network)等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。