(57)【特許請求の範囲】
【請求項１】
帳票の書式情報を参照して、前記帳票の項目名を示すノードおよびデータを示すノードを生成するノード生成部と、
前記帳票の書式情報を参照して、前記ノード間の隣接関係を示す隣接エッジを生成する隣接エッジ生成部と、
前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの位置およびサイズから、前記ノード間の縦方向または横方向の包含関係を示す包含エッジを生成する包含エッジ生成部と、
前記隣接エッジの連結性に基づいて前記ノードをノードクラスタに分類するノードクラスタ部と、
前記ノードクラスタに分類されたノード群の包含エッジを参照して、前記包含関係を有するノード群について、帳票上の項目名とデータの並びに関する特性を満たすように、前記隣接エッジの修正および各ノードが項目名かデータかの項目属性の設定を行って部分木パターンを生成する部分木パターン生成部と、
前記部分木パターンを前記ノードの重複がないように組み合わせることにより前記帳票の木構造データを生成する木構造データ構築部と、
を備えることを特徴とするデータ構造抽出装置。
【請求項２】
前記包含エッジ生成部は、
前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの右方向に隣接するノードが２つ以上あり、前記ノードの右方向に隣接するノードのｙ座標が全て前記ノードのｙ座標の範囲にあり、前記ノードの右方向に隣接するノードのｙ座標のいずれか１つが前記ノードの始点のｙ座標と重なり、かつ前記ノードの右方向に隣接するノードのｙ座標のいずれか１つが前記ノードの終点のｙ座標と重なるとき、前記隣接するノードおよび当該ノードに隣接するノードを、前記ノードと包含関係のあるノードとして前記包含エッジを生成することを特徴とする請求項１に記載のデータ構造抽出装置。
【請求項３】
前記包含エッジ生成部は、
前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの下方向に隣接するノードが２つ以上あり、前記ノードの下方向に隣接するノードのｘ座標が全て前記ノードのｘ座標の範囲にあり、前記ノードの右方向に隣接するノードのｘ座標のいずれか１つが前記ノードの始点のｘ座標と重なり、かつ前記ノードの下方向に隣接するノードのｘ座標のいずれか１つが前記ノードの終点のｘ座標と重なるとき、前記隣接するノードおよび当該ノードに隣接するノードを、前記ノードと包含関係のあるノードとして前記包含エッジを生成することを特徴とする請求項１に記載のデータ構造抽出装置。
【請求項４】
前記部分木パターン生成部は、
前記ノードクラスタに分類されたノード群が、複数の階層にわたる包含関係を有するとき、前記階層ごとに前記部分木パターンを生成することを特徴とする請求項１〜３のいずれか１項に記載のデータ構造抽出装置。
【請求項５】
前記部分木パターン生成部は、
前記部分木パターンの生成の過程で、格子状に連結されたノード群を検出したとき、前記ノード群のノードそれぞれの項目属性および配置位置に基づき、前記ノード群の示す帳票構造が、項目とデータとが一対一の関係である列挙型か、項目とデータとが一対多の関係である表型かを推定し、推定結果に基づき、前記ノード群の隣接エッジを修正することを特徴とする請求項１〜４のいずれか１項に記載のデータ構造抽出装置。
【請求項６】
前記データ構造抽出装置は、さらに、
前記ノードのうち項目名である可能性のあるノードから文字列を抜き出し、項目名データベースに登録する項目名登録部と、
前記項目名データベースに登録された文字列を参照して、前記ノードクラスタの各ノードに対して前記項目属性を付与する項目名割当部とを備えることを特徴とする請求項１〜５のいずれか１項に記載のデータ構造抽出装置。
【請求項７】
前記データ構造抽出装置は、さらに、
前記木構造データ構築部が、１つの帳票について複数の木構造データを生成したとき、前記複数の木構造データの差分情報を出力する木構造選定部を備えることを特徴とする請求項１〜６のいずれか１項に記載のデータ構造抽出装置。
【請求項８】
データ構造抽出装置により実行されるデータ構造抽出方法であって、
帳票の書式情報を参照して、前記帳票の項目名を示すノードおよびデータを示すノードを生成するステップと、
前記帳票の書式情報を参照して、前記ノード間の隣接関係を示す隣接エッジを生成するステップと、
前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの位置およびサイズから、前記ノード間の縦方向または横方向の包含関係を示す包含エッジを生成するステップと、
前記隣接エッジの連結性に基づいて前記ノードをノードクラスタに分類するステップと、
前記ノードクラスタに分類されたノード群の包含エッジを参照して、前記包含関係を有するノード群について、帳票上の項目名とデータの並びに関する特性を満たすように、前記隣接エッジの修正および各ノードが項目名かデータかの項目属性の設定を行って部分木パターンを生成するステップと、
前記部分木パターンを前記ノードの重複がないように組み合わせることにより前記帳票の木構造データを生成するステップと、
を含んだことを特徴とするデータ構造抽出方法。
【請求項９】
帳票の書式情報を参照して、前記帳票の項目名を示すノードおよびデータを示すノードを生成するステップと、
前記帳票の書式情報を参照して、前記ノード間の隣接関係を示す隣接エッジを生成するステップと、
前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの位置およびサイズから、前記ノード間の縦方向または横方向の包含関係を示す包含エッジを生成するステップと、
前記隣接エッジの連結性に基づいて前記ノードをノードクラスタに分類するステップと、
前記ノードクラスタに分類されたノード群の包含エッジを参照して、前記包含関係を有するノード群について、帳票上の項目名とデータの並びに関する特性を満たすように、前記隣接エッジの修正および各ノードが項目名かデータかの項目属性の設定を行って部分木パターンを生成するステップと、
前記部分木パターンを前記ノードの重複がないように組み合わせることにより前記帳票の木構造データを生成するステップと、
をコンピュータに実行させることを特徴とするデータ構造抽出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、帳票のデータ構造抽出装置、データ構造抽出方法およびデータ構造抽出プログラムに関する。
【背景技術】
【０００２】
業務では、申請書、管理簿、申込書等様々な利用シーンにあわせて帳票が作成される。特に、表計算ソフト等で作成された電子帳票（以下、適宜「帳票」と略す）はユーザが帳票のテンプレートを簡単に作成できるため汎用性が高い。一方で、帳票の様式構造は帳票の作成者の意図・嗜好に依存し、画一的に定義することが困難である。そのため、帳票に書かれたデータを利用する場合、多くの場合は帳票の値の意味を明示的に示す情報（以下、「項目名」と表現する）およびその値（以下、「帳票データ」と表現する）の記入位置を予め厳格に定義し、指定の処理プロセスをスクリプトやマクロで記述、実行させる。しかし、この方法では（１）帳票を利用した新たな作業・業務が発生するたびに指定の処理プロセスを新規で記述しなければならない、（２）表計算ソフト等様式の操作が可能なものは、作成者が意図しない操作（例えば、行列の追加・削除、項目の追加・削除等）が行われた場合に指定の処理プロセスを正しく実行できない、等の問題が生じる。帳票は、情報を記入するユーザが項目名を頼りにして正確に情報を記入できるように、定型的な知識表現で作成される傾向があり、項目名と帳票データの意味的な関係性は木構造と表の２つの表現形式によって概念的に表現することができる。例えば、帳票の項目名やデータを変換したノードについて、ノード間の隣接関係を求めた後、帳票の木構造の特性を満たさないエッジをカットすることで、帳票を概念化した論理構造に変換・抽出して上記の問題を解決する方法（非特許文献１参照）が提案されている。この技術を利用することで、例えば、帳票群の帳票データ個々を対象にして、ユーザの要求に従って外部からデータ操作（例えば、参照、更新、削除）することができる。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】高木郁子他、「電子帳票群に対する横断的データ操作技術のための抽出手法の検討」、電子情報通信学会、信学技報、Vol.114、No.150、LOIS2014-11、pp.1-6、2014年7月17日
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、上記の技術ではノードの隣接エッジを参照しながら不要なエッジをカットするアルゴリズムのため、カットの順序によっては木構造データを精度よく抽出できないことがあった。また、上記の技術は、帳票のノード間の意味関係が縦方向（上から下に読む）、または、横方向（左から右に読む）のいずれかであることを前提としているため、帳票の中に縦横の論理構造が混在している場合、木構造データを精度よく抽出できないことがあった。
【０００５】
そこで、本発明は、前記した問題を解決し、帳票の中に縦横の論理構造が混在している場合であっても、木構造データを精度よく抽出することを課題とする。
【課題を解決するための手段】
【０００６】
前記した課題を解決するため、本発明は、帳票の書式情報を参照して、前記帳票の項目名を示すノードおよびデータを示すノードを生成するノード生成部と、前記帳票の書式情報を参照して、前記ノード間の隣接関係を示す隣接エッジを生成する隣接エッジ生成部と、前記ノードの隣接エッジおよび前記帳票の書式情報を参照して、前記ノードの位置およびサイズから、前記ノード間の縦方向または横方向の包含関係を示す包含エッジを生成する包含エッジ生成部と、前記隣接エッジの連結性に基づいて前記ノードをノードクラスタに分類するノードクラスタ部と、前記ノードクラスタに分類されたノード群の包含エッジを参照して、前記包含関係を有するノード群について、帳票上の項目名とデータの並びに関する特性を満たすように、前記隣接エッジの修正および各ノードが項目名かデータかの項目属性の設定を行って部分木パターンを生成する部分木パターン生成部と、前記部分木パターンを前記ノードの重複がないように組み合わせることにより前記帳票の木構造データを生成する木構造データ構築部とを備えることを特徴とする。
【発明の効果】
【０００７】
本発明によれば、帳票の中に縦横の論理構造が混在している場合であっても、木構造データを精度よく抽出することができる。
【図面の簡単な説明】
【０００８】
【図１】図１は、帳票ファイルおよび木構造データの例を示す図である。
【図２】図２は、データ構造抽出装置の構成例を示す図である。
【図３】図３は、データ構造抽出部の構成例を示す図である。
【図４−１】図４−１は、データ構造抽出装置の処理手順を示すフローチャートである。
【図４−２】図４−２は、図４−１のＳ２のグラフ生成処理を示すフローチャートである。
【図４−３】図４−３は、図４−１のＳ４の木構造推定処理を示すフローチャートである。
【図５−１】図５−１は、図４−２のＳ１３１の操作インタフェースの識別処理の一例を示すフローチャートである。
【図５−２】図５−２は、図４−２のＳ１３２の操作インタフェースの識別処理の一例を示すフローチャートである。
【図５−３】図５−３は、図４−２のＳ１３３のノード生成処理の一例を示すフローチャートである。
【図５−４】図５−４は、ノード生成処理の一例を説明するための図である。
【図５−５】図５−５は、図４−２のＳ１３４のプロパティ情報取得処理の一例を示すフローチャートである。
【図６】図６は、帳票データベースにおけるプロパティ情報と木構造データの一例を示す図である。
【図７−１】図７−１は、図４−２のＳ１３５の隣接エッジ生成処理の一例を示すフローチャートである。
【図７−２】図７−２は、隣接エッジ生成処理の一例を説明するための図である。
【図７−３】図７−３は、図７−１のＳ１３５３の各ノード間の隣接エッジを求める処理の一例を示すフローチャートである。
【図７−４】図７−４は、図７−１のＳ１３５４の各ノード間の隣接関係をチェックする処理の一例を示すフローチャートである。
【図８】図８は、図４−２のＳ１３６の包含エッジ生成処理の一例を示すフローチャートである。
【図９】図９は、項目名登録部の処理手順の一例を示すフローチャートである。
【図１０−１】図１０−１は、図４−１のＳ３のノードクラスタに分類する処理の一例を示すフローチャートである。
【図１０−２】図１０−２は、ノードクラスタの一例を示す図である。
【図１０−３】図１０−３は、図１０−１のＳ１３８３の任意のノードＸを始点とした他のノードＹのクラスタリング処理の一例を示すフローチャートである。
【図１１】図１１は、項目名割当処理の一例を示すフローチャートである。
【図１２−１】図１２−１は、図４−３のＳ１４０の部分木パターン生成処理の一例を示すフローチャートである。
【図１２−２】図１２−２は、包含ノードの階層を説明するための図である。
【図１２−３】図１２−３は、図１２−１のＳ１４０５の部分木パターンの取得処理の一例を示すフローチャートである。
【図１２−４】図１２−４は、図１２−３のＳ１４０５６およびＳ１４０６０におけるＣ（Ｘ，ｋ）についての木構造変換処理の一例を示すフローチャートである。
【図１２−５】図１２−５は、上記の表型・列挙型推定ルールに従った、項目属性の割当と隣接エッジの修正を説明するための図である。
【図１３】図１３は、図４−３のＳ１４１の木構造データ構築処理の一例を示すフローチャートである。
【図１４−１】図１４−１は、図４−３のＳ１４２の木構造データ選定処理の一例を示すフローチャートである。
【図１４−２】図１４−２は、図１４−１のＳ１４２４の木構造データ選定ルールに従った、木構造データの選定処理の例を示すフローチャートである。
【図１５】図１５は、図４−１のＳ５の帳票構造構築処理の一例を示すフローチャートである。
【図１６−１】図１６−１は、帳票構造ルールの一例を示す図である。
【図１６−２】図１６−２は、帳票の一例を示す図である。
【図１６−３】図１６−３は、ノードＸの隣接エッジ生成を説明するための図である。
【図１６−４】図１６−４は、ノードＸの隣接エッジのチェックを説明するための図である。
【図１６−５】図１６−５は、ノードＸの包含エッジ生成を説明するための図である。
【図１６−６】図１６−６は、木構造変換処理の一例を説明する図である。
【図１６−７】図１６−７は、表型・列挙型の設定の一例を説明する図である。
【図１７】図１７は、データ構造抽出プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【０００９】
以下、図面を参照しながら、本発明を実施するための形態（実施形態）について説明する。なお、本発明は本実施形態に限定されない。
【００１０】
（概要）
まず、図１を参照しながら、データ構造抽出装置１０が扱う帳票ファイルについて説明する。
【００１１】
帳票ファイルは１以上のシートからなり、シートは、符号１０１、符号１０２に示すように項目名と、その項目名に対応する帳票データとを示した表（帳票）を含む。帳票内の各項目名同士、あるいは、項目名と帳票データとの間には包含関係が存在する場合がある。例えば、符号１０１に示す帳票において項目１４は帳票データ１４−１〜帳票データ１４−４を包含し（縦方向の包含）、項目１９は項目１４〜項目１７に対応する各帳票データを包含する（横方向の包含）。また、符号１０２に示す帳票において項目２２は項目２０および項目２１に対応する各帳票データを包含し（縦方向の包含）、また、項目２３は項目２２、項目２０および項目２１に対応する各帳票データを包含する（横方向の包含）。つまり、帳票には縦方向の包含関係と横方向の包含関係が混在する場合がある。
【００１２】
データ構造抽出装置１０は、このように帳票に縦方向または横方向の論理関係が混在する場合であっても、帳票の論理構造を解釈し、項目名および帳票データのノードからなる木構造データを抽出する。例えば、データ構造抽出装置１０は、符号１０１に示す帳票から符号１０３に示す木構造データを抽出し、符号１０２に示す帳票から符号１０４に示す木構造データを抽出する。
【００１３】
（構成）
図２を用いてデータ構造抽出装置１０の構成を説明する。データ構造抽出装置１０は、データ構造抽出部１１と、記憶部１２とを備える。
【００１４】
データ構造抽出部１１は、端末（例えば、パーソナルコンピュータ、スマートフォン等）等から帳票ファイルの入力を受け付けると、帳票構造ルール１２１（詳細は後記）を参照して、この帳票ファイルの木構造データを抽出し、帳票データベース（帳票構造情報記憶部）１２２に登録する。
【００１５】
記憶部１２は、帳票構造ルール１２１と、帳票データベース１２２とを備える。帳票構造ルール１２１は、データ構造抽出部１１が、帳票ファイルから木構造データを抽出する際に参照する種々のルールを記憶する。この帳票構造ルール１２１は、例えば、図１６−１の（ａ）に示すノード生成ルール、メタ情報生成ルール、隣接エッジ生成ルール、包含エッジ生成ルール、ノードクラスタ生成ルール、木構造生成ルールや、（ｂ）に示す隣接エッジチェックルール、包含エッジチェックルール、木構造条件ルール、表型・列挙型推定ルール、木構造選定ルール等を含む。これらのルールの詳細は後記する。
【００１６】
帳票データベース１２２は、データ構造抽出部１１が抽出した木構造データを含む帳票構成情報（図６参照）を記憶する。
【００１７】
（データ構造抽出部）
次に、図３を用いてデータ構造抽出装置１０のデータ構造抽出部１１を詳細に説明する。データ構造抽出部１１は、グラフ生成部１３と、ノードクラスタ部１３８と、木構造推定部１４と、帳票構造構築部１４３とを備える。なお、記憶部１２の項目名データベース１２３は、装備する場合と装備しない場合があり、装備する場合については後記する。
【００１８】
グラフ生成部１３は、帳票ファイルの項目名および帳票データを示すノードのノード情報を生成する。また、このノード情報には、ノード間の隣接関係を示す情報（隣接エッジ）および包含関係を示す情報（包含エッジ）を含める。さらに、グラフ生成部１３は、帳票ファイルから、当該帳票ファイルの属性情報であるプロパティ情報を取得する。
【００１９】
ノードクラスタ部１３８は、ノード情報に示される各ノードの隣接エッジの連結性に基づいてノードをノードクラスタに分類する。
【００２０】
木構造推定部１４は、ノードクラスタに分類されたノード群から部分木パターンを生成する。そして、木構造推定部１４は生成した部分木パターン群をノードの重複がないように組み合わせることにより、帳票ファイルの木構造データを生成する。
【００２１】
帳票構造構築部１４３は、木構造推定部１４から出力された帳票ファイルの木構造データと、グラフ生成部１３から出力された当該帳票ファイルのプロパティ情報とを統合し、帳票データベース１２２に登録する。
【００２２】
（グラフ生成部）
グラフ生成部１３は、操作インタフェース識別部１３１と、帳票書式情報取得部１３２と、ノード生成部１３３と、プロパティ情報取得部１３４と、隣接エッジ生成部１３５と、包含エッジ生成部１３６とを備える。項目名登録部１３７は、装備する場合と装備しない場合があり、装備する場合については後記する。
【００２３】
操作インタフェース識別部１３１は、帳票ファイルの種類を特定し、帳票ファイルを操作するための操作インタフェースを決定する。そして、操作インタフェース識別部１３１は、決定した操作インタフェースを示す情報（操作インタフェース情報）を帳票書式情報取得部１３２へ出力する。操作インタフェースは、帳票ファイルの情報を取得するためのインタフェースであり、例えば、ＡＰＩ（Application  Programming  Interface）、ＣＯＭ（Component  Object  Model）、ＯＬＥ（Object  Linking  and  Embedding）等である。また、操作インタフェース識別部１３１は、帳票ファイルのファイル情報（例えば、帳票ファイルのアプリケーションの種類、作成日、追加日、サイズ、ファイル属性等のプロパティ情報）をプロパティ情報取得部１３４へ出力する。
【００２４】
帳票書式情報取得部１３２は、帳票の操作インタフェースを利用して、帳票ファイルの各シート（ページ）のドキュメント情報、書式情報を取得する。ドキュメント情報は、例えば、帳票に関するプロパティ情報、タイトル、様式番号、作成者、作成日、ページ数、文字数、分類、キーワード等である。また、書式情報は、例えば、帳票を構成する書式に関するプロパティ情報、文字情報（例えば、文字列、文字の型等）、罫線情報（例えば、罫線の開始および終了位置、罫線の種類、罫線の太さ等）、セル情報等である。なお、書式とは、例えば、帳票上の文字列、罫線の種類、罫線の太さ、罫線が囲う範囲、ノードの結合情報、ノードの色情報等であり、セル情報とは、例えば、帳票ファイルのシートを構成するセルの高さ・幅・左上座標・右下座標、セルの結合状態、セルの塗りつぶしの色等である。
【００２５】
ノード生成部１３３は、帳票構造ルール１２１に従い、帳票の項目名または帳票データを示すノードを生成する。ノード生成部１３３は、例えば、帳票書式情報取得部１３２で得た帳票の書式情報に基づき、帳票のシート上の罫線で囲われている部分をノードとして抽出する。そして、ノード生成部１３３は生成したノードに関する情報（ノード情報）を隣接エッジ生成部１３５へ出力する。また、ノード生成部１３３は、シート上の罫線で囲われていない部分の情報をメタデータ（非ノード情報）として抽出し、プロパティ情報取得部１３４へ出力する。
【００２６】
プロパティ情報取得部１３４は、帳票のプロパティ情報（帳票のファイル情報、ドキュメント情報、非ノード情報）を、帳票構造構築部１４３へ出力する。
【００２７】
隣接エッジ生成部１３５は、帳票の書式情報およびノード情報を参照して、当該帳票のノード間の隣接関係を示す隣接エッジを生成する。隣接エッジ生成部１３５は、生成した隣接エッジを当該ノードのノード情報に追加する。
【００２８】
包含エッジ生成部１３６は、ノード情報に示される各ノードの隣接エッジおよび帳票の書式情報を参照して、各ノードの位置およびサイズから、ノード間の縦方向または横方向の包含関係を示す包含エッジを生成する。包含エッジ生成部１３６は、生成した包含エッジを当該ノードのノード情報に追加する。
【００２９】
（木構造推定部）
木構造推定部１４は、部分木パターン生成部１４０と、木構造データ構築部１４１と、木構造選定部１４２とを備える。項目名割当部１３９は装備する場合と装備しない場合があり、装備する場合については後記する。
【００３０】
部分木パターン生成部１４０は、ノードクラスタに分類されたノード群について部分木パターンを生成する。具体的には、部分木パターン生成部１４０は、ノードクラスタに分類されたノード群について帳票上の木構造の特性を満たすように隣接エッジを修正し、各ノードが項目名かデータかの項目属性の設定を行うことにより部分木パターンを生成する。
【００３１】
また、部分木パターン生成部１４０は、上記の隣接エッジの修正において、ノード群のノードそれぞれの項目属性および配置位置に基づき、ノード群の示す帳票構造が、項目とデータとが一対一の関係である列挙型か、項目とデータとが一対多の関係である表型かを推定し、その推定結果に基づき、ノード群の隣接エッジを修正する。そして、生成した部分木パターンを、木構造データ構築部１４１へ出力する。なお、この部分木パターンの生成の詳細は後記する。
【００３２】
木構造データ構築部１４１は、部分木パターンをノードの重複がないように組み合わせることにより帳票の木構造データを生成する。生成した木構造データは木構造選定部１４２へ出力する。なお、木構造データは、例えば、図１の符号１０３，１０４に示すように、帳票の論理構造｛項目名，…，項目名，帳票データ（データ）｝を木構造に変換して表したものである。
【００３３】
木構造選定部１４２は、１つの帳票について複数の木構造データが生成されたとき、帳票構造ルール１２１に従い、木構造データの選択を行う。選択した木構造データは帳票構造構築部１４３へ出力する。
【００３４】
このようなデータ構造抽出装置１０によれば、帳票の中に縦横の論理構造が混在している場合であっても、木構造データを精度よく抽出することができる。
【００３５】
（処理手順）
次に、図４−１を用いて、データ構造抽出装置１０の処理手順を説明する。データ構造抽出装置１０のデータ構造抽出部１１において帳票ファイルの入力を受け付けると（Ｓ１）、グラフ生成部１３は、帳票ファイルの項目名および帳票データを示すノードのグラフを生成する（Ｓ２）。つまり、グラフ生成部１３は、帳票を構成する各ノードについて、各ノード間の隣接関係および包含関係を示すノード情報を生成する。また、グラフ生成部１３は、帳票のプロパティ情報の取得も行う。次に、ノードクラスタ部１３８は、各ノードのノード情報に示される隣接エッジの連結性に基づいて各ノードをノードクラスタに分類する（Ｓ３）。そして、木構造推定部１４は、ノードクラスタに分類されたノード群ごとに部分木パターンを生成し、生成した部分木パターンを組み合わせて木構造データを生成する（Ｓ４：木構造推定）。その後、帳票構造構築部１４３は、Ｓ４で生成された木構造データと、グラフ生成部１３において取得した帳票のプロパティ情報とを統合し、帳票データベース１２２に登録する（Ｓ５：帳票構造構築）。
【００３６】
このようにすることでデータ構造抽出装置１０は、帳票ファイルから帳票の木構造データを生成することができる。また、データ構造抽出部１１は、帳票の木構造データと、当該帳票のプロパティ情報とを統合した情報を帳票データベース１２２に登録することができる。
【００３７】
（グラフ生成）
次に、図４−２を用いて、図４−１のＳ２のグラフ生成処理を詳細に説明する。まず、グラフ生成部１３の操作インタフェース識別部１３１は、帳票ファイルの操作インタフェースの識別を行い（Ｓ１３１）、帳票書式情報取得部１３２は、帳票ファイルの書式情報の取得を行い（Ｓ１３２）、ノード生成部１３３は、帳票ファイルを構成するノード情報生成を行う（Ｓ１３３：ノード生成）。また、プロパティ情報取得部１３４は、帳票のファイル情報、ドキュメント情報、非ノード情報を当該帳票のプロパティ情報として集約し、帳票構造構築部１４３へ出力する（Ｓ１３４：プロパティ情報取得）。その後、隣接エッジ生成部１３５は、帳票の書式情報およびノード情報を参照して、当該帳票のノード間の隣接関係を示す隣接エッジを生成し、生成した隣接エッジを当該ノードのノード情報に追加する（Ｓ１３５：隣接エッジ生成）。その後、包含エッジ生成部１３６は、ノード情報に示される各ノードの隣接エッジおよび帳票の書式情報を参照して、各ノードの包含エッジを生成し、生成した包含エッジを当該ノードのノード情報に追加する（Ｓ１３６：包含エッジ生成）。
【００３８】
このようにすることでグラフ生成部１３は、帳票を構成する各ノードについて、各ノード間の隣接関係および包含関係を示すノード情報を生成することができる。
【００３９】
（木構造推定）
次に、図４−３を用いて、図４−１のＳ４の木構造推定処理を詳細に説明する。木構造推定部１４の部分木パターン生成部１４０は、Ｓ３でノードクラスタに分類されたノード群について部分木パターンを生成する（Ｓ１４０）。そして、木構造推定部１４は、Ｓ１４０で生成された部分木パターンを組み合わせて木構造データを構築する（Ｓ１４１）。その後、木構造選定部１４２は、Ｓ１４１で構築された木構造データが複数あれば、これらの中から木構造データを１つ選定する（Ｓ１４２）。
【００４０】
このようにすることで木構造推定部１４は、帳票の各ノード間の隣接関係および包含関係を反映した木構造データを生成することができる。
【００４１】
（操作インタフェース識別）
次に、図５−１を用いて、図４−２のＳ１３１の操作インタフェースの識別処理の一例を説明する。なお、以下の説明において、指定先への出力時のデータの記述言語は、例えば、ＣＳＶ（Comma-Separated  Values）、ＪＳＯＮ（JavaScript（登録商標）  Object  Notation）、ＸＭＬ（eXtensible  Markup  Language）等を用いる。また、指定先への出力はフォルダごとに出力してもよいし、ＺＩＰ、ＣＡＢ形式等のデータ圧縮を行った上で出力してもよい。
【００４２】
まず、操作インタフェース識別部１３１は、帳票ファイルのファイル情報を読み込むと（Ｓ１３１１）、帳票ファイルの種別を識別する（Ｓ１３１２）。例えば、操作インタフェース識別部１３１は、ファイル情報に含まれる帳票ファイルのプロパティ情報や拡張子、アプリケーションが固有に持つマジックナンバーから当該帳票ファイルで用いられるアプリケーションの種類を特定する。また、操作インタフェース識別部１３１は、読み込んだファイル情報をプロパティ情報取得部１３４へ出力する。そして、操作インタフェース識別部１３１は、Ｓ１３１２で特定した帳票ファイルの種類に合わせて操作インタフェースを決定する（Ｓ１３１３）。ここで、操作インタフェースが決定できれば（Ｓ１３１４でＹｅｓ）、操作インタフェース識別部１３１は、操作インタフェース情報を指定先（ここでは帳票書式情報取得部１３２）へ出力し（Ｓ１３１５）、操作インタフェースが決定できなければ（Ｓ１３１４でＮｏ）、例えば、エラーメッセージとして「帳票として情報を登録しない」旨のユーザに返す（Ｓ１３１６）。
【００４３】
このようにすることで、操作インタフェース識別部１３１は帳票ファイルの操作インタフェースを決定することができる。
【００４４】
（帳票書式情報取得）
次に、図５−２を用いて、図４−２のＳ１３２の操作インタフェースの識別処理の一例を説明する。帳票書式情報取得部１３２は、帳票ファイルの操作インタフェース情報を読み込み（Ｓ１３２１）、帳票ファイルを読み込むと（Ｓ１３２２）、帳票ファイルからページ（シート）ごとの書式情報を取得し（Ｓ１３２３）、また、帳票ファイルからドキュメント情報を取得する（Ｓ１３２４）。そして、帳票書式情報取得部１３２は、取得した書式情報、ドキュメント情報に罫線情報があれば（Ｓ１３２５でＹｅｓ）、取得した書式情報、ドキュメント情報を指定先に出力する（Ｓ１３２６）。例えば、書式情報についてはノード生成部１３３に出力し、ドキュメント情報についてはプロパティ情報取得部１３４へ出力する。なお、帳票書式情報取得部１３２は、取得した書式情報、ドキュメント情報に罫線情報がなければ（Ｓ１３２５でＮｏ）、例えば、エラーメッセージとして「帳票として情報を登録しない」旨のユーザに返す（Ｓ１３２７）。
【００４５】
このようにすることで帳票書式情報取得部１３２は、帳票ファイルから書式情報およびドキュメント情報を取得することができる。
【００４６】
（ノード生成）
次に、図５−３、図５−４および図１６−２を用いて、図４−２のＳ１３３のノード生成処理の一例を説明する。ノード生成部１３３は、書式情報を読み込み（Ｓ１３３１）、また、帳票構造ルール１２１を読み込み（Ｓ１３３２）、帳票構造ルール１２１のノード生成ルール（図１６−１参照）に従い、書式情報からノード情報を取得する（Ｓ１３３３）。ノード情報は、例えば、図５−４に示すように、罫線で囲まれた文字列（例えば、「担当者」）、罫線で囲まれたセルの左上座標（px1，py1）および右下座標（px2，py2）、塗りつぶし色（例えば、白）、罫線の種類（例えば、実線）、罫線のサイズ（例えば、１ｐｔ）等である。この他、罫線で囲まれたセルの高さや幅の情報も含んでいてもよい。
【００４７】
ノード生成部１３３は上記のようにして書式情報からノード情報を取得すると、ノード情報を隣接エッジ生成部１３５に出力する（Ｓ１３３４：ノード情報を出力）。一方書式情報に含まれる情報のうちノード情報以外の情報（非ノード情報）はプロパティ情報取得部１３４に出力する（Ｓ１３３５：非ノード情報を出力）。
【００４８】
書式情報に含まれる情報が、ノード情報（ノードの情報）か、非ノード情報（非ノードの情報）かは、以下のようにして判断する。例えば、ノード生成部１３３は、帳票構造ルール１２１に従い、図１６−２に示す帳票のうち、帳票の罫線で囲まれた「氏名」等をノードとし、罫線で囲まれていない「様式Ａ−１」等を非ノードとする。なお、ノード生成部１３３は、罫線で囲まれており、かつ、同じ背景色で塗りつぶされた領域をノードとしてもよいし、実線の罫線で囲まれた領域をノードとしてもよい。さらに、ノード生成部１３３は、予め非ノードとする文字列を決めておき、その文字列を含む領域を非ノードとしてもよいし、予め非ノードと判断する領域（例えば、帳票の上部または下部）を決めておき、その領域で文字列が配置されている領域を非ノードとしてもよい。そして、ノード生成部１３３は、ノードと判断した部分についてノード情報として取得し、非ノードと判断した部分について非ノード情報として取得する。
【００４９】
このようにすることで、ノード生成部１３３は帳票ファイルの木構造データの生成に必要なノード（ノード情報）を抽出することができる。また、ノード生成部１３３は、帳票ファイルの属性情報を非ノード情報として抽出することができる。
【００５０】
（プロパティ情報取得）
次に、図５−５を用いて、図４−２のＳ１３４のプロパティ情報取得処理の一例を説明する。プロパティ情報取得部１３４は、ファイル情報を読み込み（Ｓ１３４１）、ドキュメント情報を読み込み（Ｓ１３４２）、非ノード情報を読み込み（Ｓ１３４３）、帳票構造ルール１２１を読み込む（Ｓ１３４４）。そして、プロパティ情報取得部１３４は、読み込んだ帳票構造ルール１２１に従って非ノード情報から帳票メタ情報を生成する（Ｓ１３４５）。帳票メタ情報とは、帳票のタイトル、日付、様式等の帳票に付随する情報である。
【００５１】
例えば、プロパティ情報取得部１３４は、帳票構造ルール１２１のメタ情報生成ルール（図１６−１の（ａ）参照）に従い、非ノード情報の文字列の区切り記号（例えば、「：」や「／」等）や文字列の内容をもとに帳票メタ情報を生成する。例えば、「氏名：ｘｘｘ」という非ノード情報があれば、「氏名」という帳票メタ情報を生成する。また、プロパティ情報取得部１３４は、非ノード情報に含まれる文字列（例えば、「様式」、「氏名」）や特殊文字（例えば、「〒」、「TEL」）、データ型、フォーマット等が分かっていればそのデータ型やフォーマット等をもとに、帳票メタ情報を生成してもよい。例えば、日付や社員番号等のデータ型が予めわかっていれば、プロパティ情報取得部１３４はそのデータ型により、「日付」や「社員番号」という帳票メタ情報を生成する。
【００５２】
Ｓ１３４５の後、プロパティ情報取得部１３４は、各属性情報（つまり、ファイル情報、ドキュメント情報および帳票メタ情報）をプロパティ情報として集約し（Ｓ１３４６）、帳票構造構築部１４３に出力する（Ｓ１３４７：プロパティ情報出力）。
【００５３】
このようにすることでプロパティ情報取得部１３４は、帳票ファイルのプロパティ情報を取得することができる。
【００５４】
なお、Ｓ１３４７においてプロパティ情報は、例えば、図６に示すように、ファイル情報、ドキュメント情報および帳票メタ情報が関連付けられた状態で帳票構造構築部１４３へ出力される。その後、帳票構造構築部１４３は、このプロパティ情報に、木構造推定部１４により生成された木構造データ（符号６０１，６０２）を統合して、帳票データベース１２２に出力する。
【００５５】
（隣接エッジ生成）
次に、図７−１および図７−２を用いて、図４−２のＳ１３５の隣接エッジ生成処理の一例を説明する。隣接エッジ生成部１３５は、図４−２のＳ１３３で生成されたノード情報を読み込み（Ｓ１３５１）、帳票構造ルール１２１を読み込む（Ｓ１３５２）。そして、隣接エッジ生成部１３５は、帳票構造ルール１２１に従い、各ノード間の隣接エッジを求め（Ｓ１３５３）、隣接関係をチェックする（Ｓ１３５４）。その後、隣接エッジ生成部１３５は、ノード情報にＳ１３５３で生成した隣接エッジ（隣接エッジ情報）を追加し（Ｓ１３５５）、隣接エッジ生成部１３５は隣接エッジ情報が追加されたノード情報を包含エッジ生成部１３６に出力する（Ｓ１３５６）。
【００５６】
例えば、隣接エッジ生成部１３５は、まず、各ノードのノード情報を参照して、ノードごとに、当該ノードの上、下、左、右方向の隣接ノードを示した情報（隣接ベクトル）を生成する。なお、当該ノードに隣接ノードがある場合には、隣接ベクトルに隣接ノードのインデックス情報を保持させる。隣接ノードがない場合には、隣接ベクトルにその旨（例えば、「０」）を記載する。例えば、図７−２に示す「担当者」ノードの上、下、左に隣接ノードはないが、右に「名前」ノードと「所属」ノードが隣接する場合、隣接エッジ生成部１３５は、その旨を示す隣接エッジ情報を、「担当者」ノードのノード情報に追加する。
【００５７】
このようにすることで隣接エッジ生成部１３５は、各ノードの隣接関係を示す隣接エッジを生成することができる。
【００５８】
（各ノード間の隣接エッジを求める処理）
次に、図７−３および図１６−３を用いて、図７−１のＳ１３５３の各ノード間の隣接エッジを求める処理の一例を説明する。隣接エッジ生成部１３５は、図７−１のＳ１３５１で読み込んだノード情報を参照して、未探索のノードＸ，Ｙを定義すると（Ｓ１３５３２）、ノードＸとノードＹが、隣接関係に関する帳票構造ルール１２１（図１６−１の（ａ）の隣接エッジ生成ルール）を満たすか否かを判定する（Ｓ１３５３３）。Ｓ１３５３３において、隣接エッジ生成部１３５が、ノードＸとノードＹについて隣接関係に関する帳票構造ルール１２１を満たすと判定したとき（Ｓ１３５３３でＹｅｓ）、ノードＸ，Ｙに対して隣接方向に隣接エッジを張る（Ｓ１３５３４）。そして、隣接エッジ生成部１３５は、全てのノード間の隣接関係をチェックしたと判定すると（Ｓ１３５３５でＹｅｓ）、隣接エッジ情報を出力する（Ｓ１３５３６）。一方、Ｓ１３５３３において、隣接エッジ生成部１３５がノードＸとノードＹについて隣接関係に関する帳票構造ルール１２１を満たさないと判定したとき（Ｓ１３５３３でＮｏ）、Ｓ１３５３４をスキップしてＳ１３５３５へ進む。一方、隣接エッジ生成部１３５は、まだノード間の隣接関係をチェックしていないものがあると判定すると（Ｓ１３５３５でＮｏ）、Ｓ１３５３２へ戻る。
【００５９】
なお、上記の隣接エッジ生成ルールは、例えば、図１６−３に示すノードＸとノードＹについて、（１）ノードＸのｙ座標範囲がノードＹのｙ座標の範囲を包含し、かつ、（２）ノードＸのｘ座標の終点がノードＹのｘ座標の始点と一致するときノードＸとノードＹについて隣接関係があるとみなす、というルールである。つまり、図１６−３に示すノードＸとノードＹについて、ノードＸの左上座標をＸ（ｘ１，ｙ１）、右下座標をＸ（ｘ２，ｙ２）とし、ノードＹの左上座標をＹ（ｘ１，ｙ１）、右下座標をＹ（ｘ２，ｙ２）とするときに、（１）Ｘ（＊，ｙ１）≦Ｙ（＊，ｙ１）かつＸ（＊，ｙ２）≧Ｙ（＊，ｙ２）であり、（２）Ｘ（ｘ２，＊）＝Ｙ（ｘ１，＊）であるとき、隣接エッジ生成部１３５は、ノードＸとノードＹについて隣接関係があるとみなす。
【００６０】
なお、上記は右方向（横方向）の隣接エッジ生成ルールであるが、下方向（縦方向）の隣接エッジ生成ルールについても同様に定義される。このように隣接エッジ生成部１３５がノードの右方向、下方向の隣接エッジを生成することで、対となる（当該ノードに隣接する）ノードの左、上方向の隣接エッジも取得できる。
【００６１】
このようにすることで隣接エッジ生成部１３５はノード間の位置関係に基づき隣接エッジを生成することができる。
【００６２】
（隣接関係をチェックする処理）
次に、図７−４および図１６−４を用いて、図７−１のＳ１３５４の各ノード間の隣接関係をチェックする処理の一例を説明する。隣接エッジ生成部１３５は、Ｓ１３５３６で出力された隣接エッジ情報を読み込み（Ｓ１３５４１）、未確認のノードＸについて隣接方向ｋを定義する（Ｓ１３５４２）。なお、隣接方向ｋは、横方向、縦方向のいずれかを示し、例えば、横方向であればｋ＝０とし、縦方向であればｋ＝１とする。次に、隣接エッジ生成部１３５は、ノードＸのｋ方向の隣接エッジが帳票構造ルール１２１（図１６−１の（ｂ）の隣接エッジチェックルール）を満たし（Ｓ１３５４３でＮｏ）、全ノード、全隣接方向を確認済みであれば（Ｓ１３５４５でＹｅｓ）、隣接エッジ情報を出力する（Ｓ１３５４６）。一方、ノードＸのｋ方向の隣接エッジが帳票構造ルール１２１（図１６−１の（ｂ）の隣接エッジチェックルール）を満たさなければ（Ｓ１３５４３でＹｅｓ）、当該隣接エッジを削除し（Ｓ１３５４４）、Ｓ１３５４５へ進む。また、Ｓ１３５４５でいずれかのノードまたはいずれかの隣接方向を確認していなければ（Ｓ１３５４５でＮｏ）、Ｓ１３５４１へ戻る。
【００６３】
なお、上記の隣接エッジチェックルールは、例えば、図１６−４に示すノードＸについて、（１）ノードＸの右側に位置する全ノードのｙ座標がノードＸのｙ座標の範囲内あり（１つでも満たさないノードがあれば不成立）、かつ、（２）ノードＸの左にあるノードは１つ以下であるとき、ノードＸに関する隣接エッジの修正は必要ないとみなす、というルールである。例えば、図１６−４の符号１６０１に示すようにノードＸの右側に位置するノードがノードＹのみであり、このノードＹのｙ座標がノードＸのｙ座標に包含されていれば、隣接エッジ生成部１３５は、前記した（１）の条件を満たすと判断する。一方、符号１６０２に示すようにノードＸの右側に位置するノードがノードＹ，Ｚであり、ノードＹのｙ座標がノードＸのｙ座標に包含されていなければ、前記した（１）の条件を満たさないと判断する。また、符号１６０３に示すようにノードＸの左側に位置するノードがノードＷのみであれば、隣接エッジ生成部１３５は、前記した（２）の条件を満たすと判断する。一方、符号１６０４に示すように、ノードＸの左側に位置するノードがノードＷ，Ｖの２つであるとき、隣接エッジ生成部１３５は、前記した（２）の条件は満たさないと判断する。
【００６４】
なお、上記は右方向（横方向）の隣接エッジチェックルールであるが、下方向（縦方向）の隣接エッジチェックルールについても同様に定義される。
【００６５】
このようにすることで隣接エッジ生成部１３５は生成した隣接エッジについて帳票上の隣接関係として不適切な隣接関係を含む場合、これを修正することができる。
【００６６】
（包含エッジ生成）
次に、図８および図１６−５を用いて、図４−２のＳ１３６の包含エッジ生成処理の一例を説明する。包含エッジ生成部１３６は、図４−２のＳ１３５で生成された隣接エッジ情報を含むノード情報を読み込み（Ｓ１３６１）、また、帳票構造ルール１２１を読み込む（Ｓ１３６２）。そして、包含エッジ生成部１３６は、未探索のノードＸ，Ｙ、隣接方向ｋを定義すると（Ｓ１３６３）、任意のノードＸと他のノードＹとｋ方向（縦／横）方向について、包含関係に関する帳票構造ルール１２１（図１６−１の（ａ）の包含エッジ生成ルール）を満たすか否かを判定する（Ｓ１３６４）。ここで、包含エッジ生成部１３６が任意のノードＸと他のノードＹとｋ方向（縦／横）方向について、包含関係に関する帳票構造ルール１２１を満たしていれば（Ｓ１３６４でＹｅｓ）、ノードＸ，Ｙ間に包含エッジを張る（Ｓ１３６５）。一方、包含エッジ生成部１３６が任意のノードＸと他のノードＹとｋ方向（縦／横）方向について、包含関係に関する帳票構造ルール１２１（図１６−１の（ａ）の包含エッジ生成ルール）を満たしていなければ（Ｓ１３６４でＮｏ）、Ｓ１３６５をスキップしてＳ１３６６へ進む。Ｓ１３６６で、全てのノード間の包含関係を確認済みであれば（Ｓ１３６６でＹｅｓ）、ノード情報に包含エッジ情報を追加し（Ｓ１３６７）、当該ノード情報をノードクラスタ部１３８に出力する（Ｓ１３６８）。一方、まだいずれかのノード間の包含関係を確認済みでなければ（Ｓ１３６６でＮｏ）、Ｓ１３６３へ戻る。
【００６７】
なお、上記の包含エッジ生成ルールは、例えば、（１）ノードＸの右方向に隣接するノードが２つ以上ある。（２）ノードＸの右方向に隣接するノードのｙ座標が全てノードＸのｙ座標の範囲にある。（３）ノードＸの右方向に隣接するノードのｙ座標のいずれか１つがノードＸの始点のｙ座標と重なり、かつノードＸの右方向に隣接するノードのｙ座標のいずれか１つがノードＸの終点のｙ座標と重なる。という３つの条件を全て満たすとき、ノードＸと、このノードＸの右方向に隣接するノード（および当該ノードに隣接する一連のノード）について包含関係がある、とみなすルールである。
【００６８】
この包含エッジ生成ルールによれば、例えば、図１６−５の符号１６１に示すノードＸと、ノードＸの右方向に隣接するノード（ノードＹ，Ｚ，Ｕ）および当該ノードの右方向に隣接する一連のノード（ノードＷ，Ｖ，Ｔ）について、包含エッジ生成部１３６は包含関係があるとみなす。すなわち、上記の例でいうと、包含エッジ生成部１３６は、ノードＸ、ノードＹ，Ｚ，Ｕ，Ｗ，Ｖ，Ｔに包含関係がある、とみなす。
【００６９】
なお、例えば、図１６−５の符号１６１に示すノード群のうちノードＵが欠けた状態のとき（符号１６２参照）、上記の（１）および（２）の条件を満たすが、上記の（３）に示す「ノードＸの右方向に隣接するノードのｙ座標のいずれか１つがノードＸの終点のｙ座標と重なる」という条件を満たさないので、包含エッジ生成部１３６は、ノードＸ、ノードＹ，Ｚ，Ｗ，Ｖ，Ｔには包含関係がないとみなす。
【００７０】
なお、上記は右方向（横方向）の包含エッジ生成ルールであるが、下方向（縦方向）の包含エッジ生成ルールについても同様に定義される。例えば、下方向（縦方向）の包含エッジ生成ルールは、（１）ノードＸの下方向に隣接するノードが２つ以上ある。（２）ノードＸの下方向に隣接するノードのｘ座標が全てノードＸのｘ座標の範囲にある。（３）ノードＸの右方向に隣接するノードのｘ座標のいずれか１つがノードＸの始点のｘ座標と重なり、かつノードＸの右方向に隣接するノードのｘ座標のいずれか１つがノードＸの終点のｘ座標と重なる。という３つの条件を全て満たすとき、ノードＸと、このノードＸにの下方向に隣接するノード（および当該ノードに隣接する一連のノード）について包含関係がある、とみなすルールである。
【００７１】
このようにすることで包含エッジ生成部１３６は、各ノードの包含関係を示す包含エッジを生成することができる。
【００７２】
（ノードクラスタに分類する処理）
次に、図１０−１、図１０−２および図１０−３を用いて、図４−１のＳ３のノードクラスタに分類する処理の一例を説明する。ノードクラスタ部１３８は、図４−１のＳ２のグラフ生成処理で生成されたノード情報を読み込み（Ｓ１３８１）、帳票構造ルール１２１を読み込む（Ｓ１３８２）。そして、ノードクラスタ部１３８は帳票構造ルール１２１（図１６−１の（ａ）に示すノードクラスタ生成ルール）に従い、任意のノードＸを始点として他のノードＹのクラスタリングを行う（Ｓ１３８３）。その後、ノードクラスタ部１３８はクラスタリングされていないノードがあるか否かを確認し（Ｓ１３８４）、クラスタリングされていないノードがあれば（Ｓ１３８４でＹｅｓ）、クラスタリングされていないノードをノードＸとして選択し（Ｓ１３８５）、Ｓ１３８３に戻る。一方、ノードクラスタリングされていないノードがなければ（Ｓ１３８４でＮｏ）、ノードクラスタ部１３８はノードクラスタを木構造推定部１４に出力する（Ｓ１３８６）。
【００７３】
なお、上記のノードクラスタ生成ルールは、例えば、あるノードの隣接エッジについて、当該ノードに連結しているノード群をノードクラスタとみなす、というルールである。また上記のルールに、例えば、当該ノードに連結しているノード群のうち、所定の罫線（例えば、太線や赤色の罫線）で分断されたノードについては別のノードクラスタとみなすというルールや、所定の塗りつぶし色（例えば、灰色）のノードは同じノードクラスタとみなすというルールを組み合わせてもよい。
【００７４】
ノードクラスタ部１３８は、このようなノードクラスタ生成ルールに従い、ノードクラスタへの分類を行うことで、例えば、図１０−２に示すように、同じ帳票ファイルのシート内の表について物理的に離れているものをノードクラスタ１，２に分けることができる。その結果、木構造推定部１４は、同じシート内の帳票（表）のうち、物理的に離れているものについてそれぞれ別個の木構造データを生成することができる。
【００７５】
（任意のノードＸを始点とした他のノードＹのクラスタリング処理）
なお、図１０−１のＳ１３８３の処理は、例えば、図１０−３に示す処理手順により行われる。まず、ノードクラスタ部１３８は、ノードＸのノード情報を読み込むと（Ｓ１３８３１）、ノードＸを始点として他のノードＹを探索し（Ｓ１３８３２）、ノードＹを発見できなかったとき（Ｓ１３８３３でＮｏ）、ノードＹがクラスタリング済みか否かを判定し（Ｓ１３８３４）、ノードＹがクラスタリング済みでなければ（Ｓ１３８３４でＮｏ）、ノードＹをノードＸと同じクラスタ（ノードクラスタ）に分類し、ノードＹに分類済みのフラグをたてる（Ｓ１３８３５）。その後、Ｓ１３８３６へ進む。Ｓ１３８３３でノードＹを発見できたとき（Ｓ１３８３３でＹｅｓ）、Ｓ１３８３９へ進む。またノードＹがクラスタリング済みであれば（Ｓ１３８３４でＹｅｓ）、Ｓ１３８３６へ進む。
【００７６】
Ｓ１３８３６において、ノードクラスタ部１３８は、全ノードを探索したとき（ＳＳ１３８３６でＹｅｓ）、ノードＸに分類済みフラグをたて（Ｓ１３８３７）、ノードクラスタを出力する（Ｓ１３８３８）。一方、まだ探索していないノードがあるとき（Ｓ１３８３６でＮｏ）、未探索のノードをノードＹとして定義し(Ｓ１３８３９)、Ｓ１３８３２へ戻る。
【００７７】
このようにすることで、ノードクラスタ部１３８は、各ノードをノードクラスタに分類することができる。
【００７８】
（部分木パターン生成処理）
次に、図１２−１〜図１２−５、図１６−６および図１６−７を用いて、図４−３のＳ１４０の部分木パターン生成処理の一例を説明する。部分木パターン生成部１４０は、図４−１のＳ３で分類されたノードクラスタのノード情報を読み込み（Ｓ１４０１）、帳票構造ルール１２１を読み込む（Ｓ１４０２）。そして、部分木パターン生成部１４０は、ノードクラスタ内の包含ノードの集合を取得し、探索済包含ノード集合に｛φ｝を設定する（Ｓ１４０３）。なお、包含ノードとは、ノード間の包含関係において他のノードを包含する側のノードであり、例えば、図１６−５の符号１６１に示すノード群のうちノードＸが包含ノードに相当する。
【００７９】
次に、包含エッジ生成部１３６は包含ノードの階層毎にＣ（Ｘ，ｋ）をレベル分けする。また最大階層をｍとし、ｎ（包含ノードの階層）に「０」を設定する（Ｓ１４０４）。
【００８０】
なお、上記のＣ（Ｘ，ｋ）は、包含ノードであるノードＸがｋ方向に包含するノードの集合を示す。例えば、ノードＸが縦方向に包含するノード集合はＣ（Ｘ，１）であり、横方向に包含するノード集合はＣ（Ｘ，０）である。また、上記の階層は、包含ノードが入れ子構造になっている場合の階層を示し、入れ子になる包含ノードがない場合は「１」であり、ある場合は「その入れ子構造の数＋１」である。例えば、図１２−２に示すノードクラスタは入れ子になる包含ノードが１つなので、階層は「２」である。
【００８１】
次に、部分木パターン生成部１４０はレベルｎのＣ（Ｘ，ｋ）について部分木パターンを取得し（Ｓ１４０５）、探索済包含ノード集合にレベルｎの包含ノードを追加する（Ｓ１４０６）。そして、部分木パターン生成部１４０はｎの値をインクリメントして（Ｓ１４０７）、ｎ＞ｍ、かつ、未探索の包含ノードが存在しない場合（Ｓ１４０８でＹｅｓ）、包含ノード集合の部分木パターンを木構造データ構築部１４１に出力する（Ｓ１４０９）。一方、ｎ＞ｍではない、または、未探索の包含ノードが存在する場合（Ｓ１４０８でＮｏ）、Ｓ１４０５へ戻る。
【００８２】
このようにすることで部分木パターン生成部１４０は、ノードクラスタ内で包含ノードが入れ子構造になっている場合でも、階層ごとの部分木パターンを取得することができる。
【００８３】
（部分木パターン取得処理）
次に、図１２−３を用いて、図１２−１のＳ１４０５の部分木パターンの取得処理の一例を説明する。部分木パターン生成部１４０は、レベルｎのＣ（Ｘ，ｋ）を読み込み（Ｓ１４０５１）、帳票構造ルール１２１を読み込む（Ｓ１４０５２）。そして、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）の部分木パターンに｛φ｝を設定し（Ｓ１４０５３）、ｎが１以上であれば（Ｓ１４０５４のＹｅｓ）、Ｃ（Ｘ，ｋ）に含まれる直近階層の包含ノード（ノードＸ´）について、Ｃ（Ｘ´，ｋ）をダミーノードとみなす（Ｓ１４０５５）。例えば、部分木パターン生成部１４０は、図１２−２に示すノード群のうち、符号１２０１に示すノード群を、図１２−３の吹き出し１２０２に示すように１つのノード（ダミーノード）とみなす。なお、Ｓ１４０５４でｎが１以上でなければ（Ｓ１４０５４でＮｏ）、Ｓ１４０５９へ進む。
【００８４】
次に、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）について木構造変換処理を行い（Ｓ１４０５６）、部分木パターンが取得できれば（Ｓ１４０５７でＹｅｓ）、Ｃ（Ｘ，ｋ）の部分木パターンに当該部分木パターンを追加する（Ｓ１４０５８）。一方、Ｓ１４０５７で部分木パターンが取得できなければ（Ｓ１４０５７でＮｏ）、Ｓ１４０５９へ進む。
【００８５】
次に、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）に含まれる包含ノードがないとみなし（Ｓ１４０５９）、Ｓ１４０５６と同様にＣ（Ｘ，ｋ）について木構造変換処理を行い（Ｓ１４０６０）、部分木パターンが取得できれば（Ｓ１４０６１でＹｅｓ）、Ｃ（Ｘ，ｋ）の部分木パターンに当該部分木パターンを追加する（Ｓ１４０６２）。そして、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）の部分木パターンを出力する（Ｓ１４０６３）。一方、部分木パターンが取得できなければ（Ｓ１４０６１でＮｏ）、Ｓ１４０６２をスキップして、Ｓ１４０６３へ進む。
【００８６】
このようにすることで部分木パターン生成部１４０は、ノードクラスタ内で包含ノードが入れ子構造になっている場合に、階層ごとの部分木パターンと、ノードクラスタ全体の部分木パターンとの両方の部分木パターンを取得できる。
【００８７】
（Ｃ（Ｘ，ｋ）についての木構造変換処理）
次に、図１２−４を用いて、図１２−３のＳ１４０５６およびＳ１４０６０におけるＣ（Ｘ，ｋ）についての木構造変換処理の一例を説明する。部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）を読み込み（Ｓ１４０６０１）、木構造生成に関する帳票構造ルール１２１を読み込む（Ｓ１４０６０２）。そして、部分木パターン生成部１４０は、木構造生成に関する帳票構造ルール１２１（図１６−１の（ａ）の木構造生成ルール）に従い、各ノードの隣接エッジの修正と項目属性の設定を行う（Ｓ１４０６０３）。
【００８８】
なお、上記の木構造生成ルールは、例えば、以下の（１）〜（４）に示す４つの条件からなる。すなわち、（１）包含ノードを除いて下位（この場合、右側）に隣接エッジは１本のみである。包含ノードを除いて下位（この場合、右側）に隣接エッジが２本以上ある場合、部分木パターン生成部１４０は、その隣接エッジをカットする。例えば、部分木パターン生成部１４０は、図１６−６の（１）に示すノードａとノードｂ，ｃを接続する隣接エッジをカットする。
【００８９】
（２）包含ノードの下位のノードはすべて包含ノードを上位に持つ。（１）の後、包含ノードを除いて上位（この場合、左側）の隣接エッジを持たないノードがある場合、部分木パターン生成部１４０は、ｋ方向に包含ノード（ノードＸ）と隣接エッジを張る。例えば、部分木パターン生成部１４０は、図１６−６の（２）に示すノードＸとノードｂ，ｃを接続する隣接エッジを張る。
【００９０】
（３）下位の隣接エッジがある場合の項目属性は「項目名」、ないノードの項目属性は「帳票データ」である。（２）の後、部分木パターン生成部１４０は、下位の隣接エッジがないノードの項目属性を「帳票データ」に設定する。例えば、部分木パターン生成部１４０は、図１６−６の（３）に示すノードａ，ｄ，ｅ，ｆの項目属性を「帳票データ」に設定する。
【００９１】
（４）隣接エッジが１本のノードが２つ以上連結されている部分を含む場合、表型または列挙型または隣接エッジを張るべきでない（木構造不適合）。（１）〜（３）の後、隣接エッジが１本のノードが２つ以上連結されている部分を含む場合、表型・列挙型推定ルール（詳細は後記）に従い、包含ノードを含むノード群について表型か列挙型かの推定（判断）を行う。例えば、部分木パターン生成部１４０は、図１６−６の（４）の符号１６１０に示す隣接エッジが１本のノードが２つ以上連結されている一連のノード群を発見した場合、符号１６１０に示すノード群について表型・列挙型推定ルール（詳細は後記）による表型か列挙型かの推定（判断）対象とする。
【００９２】
図１２−４のＳ１４０６０３の後、部分木パターン生成部１４０は、Ｓ１４０６０３により設定された項目属性が「帳票データ」のノードから未探索のノードＺを選択し（Ｓ１４０６０４）、ノードＺからノードＸまでを辿る（Ｓ１４０６０５）。このときのノードＺからノードＸまでの経路をroute(Ｘ，Ｚ)とする。そして、部分木パターン生成部１４０は、表型・列挙型推定ルール（図１６−１の（ｂ）参照）に従い、表型・列挙型となる経路（route(Ｘ，Ｚ)）があるか否かを判定（推定）し（Ｓ１４０６０６）、表型・列挙型となる経路（route(Ｘ，Ｚ)）があれば（Ｓ１４０６０６のＹｅｓ）、表型・列挙型推定に関する帳票構造ルール１２１（表型・列挙型推定ルール）に従って、表型・列挙型の設定を行う（Ｓ１４０６０７）。そして、Ｓ１４０６０９へ進む。一方、表型・列挙型となる経路（route(Ｘ，Ｚ)）がなければ（Ｓ１４０６０６のＮｏ）、表型・列挙型となる経路（route(Ｘ，Ｚ)）上のノードＺ以外の項目属性を「項目名」に設定し（Ｓ１４０６０８）、Ｓ１４０６０９へ進む。
【００９３】
なお、上記の表型・列挙型推定ルールは、例えば、以下の（１）〜（４）に示す４つの条件からなる。（１）ノードＸが包含するノードが格子状の連結関係を持つ。例えば、部分木パターン生成部１４０は、図１６−７の（１）に示すようにノードＸが包含するノードが格子状の連結関係を持つとき、これらのノードを、表型・列挙型推定対象とする。
【００９４】
（２）（１）の条件を満たす場合において、ノードＸに隣接しないノードに「項目名」のノードが存在するならば「列挙型」か「木構造不適合」と判断する。例えば、部分木パターン生成部１４０は、図１６−７の（２）に示すようにノードＸに隣接しないノードに「項目名」のノードが存在するとき、「列挙型」か「木構造不適合」と推定する。
【００９５】
（３）（１）の条件を満たすが、（２）の条件を満たさない場合において、ノードＸが包含する各ノードの端点が隣接する他のノードのいずれかの端点と重なるならば「表型」と推定する。例えば、部分木パターン生成部１４０は、図１６−７の（３）に示すようにノードＸが包含する各ノードの端点が隣接する他のノードのいずれかの端点と重なっていれば「表型」と推定する。
【００９６】
（４）（１）および（２）の条件を満たす場合において、ノードＸを除いたノードから末端のノードまでのノードの個数が偶数であれば「列挙型」と推定し、奇数であれば「木構造不適合」と推定する。例えば、部分木パターン生成部１４０は、図１６−７の（４）に示すようにノードＸを除いたノードから末端のノードまでのノードの個数が偶数（４個）であれば「列挙型」と判断し、奇数（３個）であれば「木構造不適合」と判断する。つまり、図１６−７の（４）に示すように「列挙型」であれば、「項目名」と「帳票データ」とがペアの構造となるが、「項目名」に対しペアとなる「帳票データ」がない場合、帳票の木構造として不自然であるので、部分木パターン生成部１４０は、このようなノード群については「木構造不適合」と推定する。上記のようにして、部分木パターン生成部１４０はノード群が表型か列挙型かそもそも木構造として不適合かの推定を行う。
【００９７】
そして、部分木パターン生成部１４０は、上記の表型・列挙型推定ルールに従い、表型と推定したノード群については表型の項目属性の割当と隣接エッジの修正を行い（図１２−５の（ａ）参照）、列挙型と推定したノード群については列挙型の項目属性の割当と隣接エッジの修正を行う（図１２−５の（ｂ）参照）。
【００９８】
図１２−４のＳ１４０６０７の後、部分木パターン生成部１４０は、Ｓ１４０６０７においてＣ（Ｘ，ｋ）を表型または列挙型に変換できた場合（Ｓ１４０６０９でＹｅｓ）、Ｓ１４０６０４で選択したノードＺを探索済みとする（Ｓ１４０６１０）。そして、項目属性が「帳票データ」のノード全てを探索済みであれば（Ｓ１４０６１１でＹｅｓ）、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）の部分木パターンを出力し（Ｓ１４０６１２）、項目属性が「帳票データ」のノードに探索していないノードがあれば（Ｓ１４０６１１でＮｏ）、Ｓ１４０６０４に戻る。
【００９９】
一方、Ｓ１４０６０９において、部分木パターン生成部１４０は、Ｃ（Ｘ，ｋ）を表型または列挙型に変換できなかった場合（Ｓ１４０６０９でＮｏ）、Ｃ（Ｘ，ｋ）について木構造条件を満たさないと判断する（Ｓ１４０６１３）。この場合、部分木パターンの出力は行わない。
【０１００】
このようにすることで部分木パターン生成部１４０は、包含ノードに包含されるノード群（Ｃ（Ｘ，ｋ））について、表型か列挙型かを考慮しつつ、各ノードの隣接エッジの修正と項目属性の設定を行う。また、部分木パターン生成部１４０は、木構造条件（帳票としての木構造の特性）を満たさないノード群については、部分木パターンとして出力しない。その結果、部分木パターン生成部１４０は、精度の高い部分木パターンを生成することができる。
【０１０１】
（木構造データ構築処理）
次に、図１３を用いて、図４−３のＳ１４１の木構造データ構築処理を説明する。木構造データ構築部１４１は、Ｓ１４０で生成された各包含ノードの部分木パターンを読み込み（Ｓ１４１１）、ノードクラスタのノード情報を読み込み（Ｓ１４１２）、帳票構造ルール１２１を読み込む（Ｓ１４１３）。そして、木構造データ構築部１４１は、木構造データの集合に｛φ｝を設定した後（Ｓ１４１４）、ノードの重複がないような部分木パターンの組み合わせを求める（Ｓ１４１５）。その後、木構造データ構築部１４１は、部分木パターンの組み合わせ群から、未確認の部分木パターンの組み合わせを選ぶ（Ｓ１４１６）。つまり、後記するＳ１４１９の処理を行っていない部分木パターンの組み合わせを選ぶ。その後、木構造データ構築部１４１は、Ｓ１４１２で読み込んだノードクラスタのノード情報を参照して、Ｓ１４１６で選んだ部分木パターンの組み合わせについて、不足しているノードを追加する（Ｓ１４１７）。
【０１０２】
次に、木構造データ構築部１４１は、Ｓ１４１７までの処理により生成された部分木パターンの組み合わせ（およびそれに追加されたノード）の包含エッジ、隣接エッジを参照しながら木構造を生成する（Ｓ１４１８）。
【０１０３】
そして、木構造データ構築部１４１は、Ｓ１４１８で生成された木構造について、木構造の条件に関する帳票構造ルール１２１（図１６−１の（ｂ）の木構造条件ルール）に従い、木構造の条件を満たすか否かを判断し（Ｓ１４１９）、木構造の条件を満たせば（Ｓ１４１９でＹｅｓ）、当該木構造を木構造データに追加する（Ｓ１５２０）。その後、全ての部分木パターンの組み合わせを確認していれば（Ｓ１５２１でＹｅｓ）、木構造データ構築部１４１は、木構造データを木構造選定部１４２に出力する（Ｓ１５２２）。
【０１０４】
なお、木構造データ構築部１４１が、Ｓ１４１８で生成された木構造が木構造の条件を満たさないと判断したとき（Ｓ１４１９でＮｏ）、Ｓ１４１６へ戻る。また、木構造データ構築部１４１が、Ｓ１５２１で、まだ確認していない部分木パターンの組み合わせがあるときも（Ｓ１５２１でＮｏ）、Ｓ１４１６へ戻る。
【０１０５】
なお、上記の木構造条件ルールは、例えば、以下の（１）〜（３）に示す３つの条件からなる。すなわち、（１）「項目名」のノード間のエッジは１対多。（２）「項目名」のノードと「帳票データ」のノード間のエッジは１対１。ただし、部分木パターン生成部１４０により表型と判断されたノード群の場合は、１対多となる。（３）「帳票データ」のノードは下位のノードを持たない。以上の３つの条件を満たすとき、木構造データ構築部１４１は、当該木構造を木構造の条件を満たすと判断する。
【０１０６】
（木構造データ選定処理）
次に、図１４−１を用いて、図４−３のＳ１４２の木構造データ選定処理を説明する。木構造選定部１４２は、木構造データ構築部１４１から出力された木構造データを読み込む（Ｓ１４２１）。ここで、読み込んだ木構造データが１種類でなければ（Ｓ１４２２でＮｏ）、木構造データ選定に関する帳票構造ルール１２１を読み込み（Ｓ１４２３）、木構造データ選定に関する帳票構造ルール１２１（図１６−１の（ｂ）の木構造データ選定ルール）に従い、木構造データの選定処理を行い（Ｓ１４２４）、選定した木構造データを出力する（Ｓ１４２５）。一方、読み込んだ木構造データが１種類であれば（Ｓ１４２２でＹｅｓ）、木構造選定部１４２は、読み込んだ木構造データを出力する（Ｓ１４２５）。
【０１０７】
図１４−２を用いて、図１４−１のＳ１４２４における木構造データ選定ルールに従った、木構造データの選定処理の例を説明する。
【０１０８】
例えば、木構造選定部１４２は、図１４−２の（ａ）に示すように複数の木構造データ間の差分情報をユーザに表示し、ユーザが修正した情報を利用して木構造データを選定する。すなわち、木構造選定部１４２は、各木構造データのノード情報の差分をとり（Ｓ１４２４１）、ユーザ側に結果通知（例えば、「異常」があることの通知）を行う（Ｓ１４２４２）。そして、Ｓ１４２４２の後、木構造選定部１４２は、例えば、木構造データの差分情報（例えば、生成された複数の木構造データを比較して得られるノードの項目属性や、包含エッジにおける包含関係、隣接エッジにおける隣接方向等の違いを示した情報）を表示した後、ユーザからＧＵＩ（Graphical  User  Interface）等により木構造修正情報の入力を受け付けると（Ｓ１４２４３）、木構造選定部１４２は、この木構造修正情報に基づき木構造データを修正し、修正した木構造データを選定する（Ｓ１４２４４）。
【０１０９】
このようにすることで、複数の木構造データが生成されたときに、木構造選定部１４２はユーザが所望するような修正を加味した木構造データを出力することができる。
【０１１０】
また、例えば、木構造選定部１４２は、図１４−２の（ｂ）に示すように、２以上の帳票ファイルを処理する場合に、１つの帳票ファイルから複数の木構造データが生成されれば、全て（またはある一定の）帳票ファイルの処理が行われた後にユーザに処理を求めるようにしてもよい。例えば、木構造選定部１４２は、複数の木構造データが出力された場合に各木構造データのノード情報の差分をとると（Ｓ１４２４５）、木構造データの差分情報を出力（キャッシュ）し（Ｓ１４２４６）、この処理中に「帳票として情報を登録しない（つまり、当該木構造データを帳票データベース１２２に登録しない）」旨をユーザに表示する（Ｓ１４２４７）。そして、木構造選定部１４２は、全ての帳票ファイル群を処理したか否かを判断し（Ｓ１４２４８）、未処理の帳票ファイルがあれば（Ｓ１４２４８のＮｏ）、未処理の帳票ファイル（帳票）を処理する（Ｓ１４２４９）。つまり、Ｓ１４２４５以降の処理を行う。また、木構造選定部１４２は、全ての帳票ファイル群を処理したと判断したとき（Ｓ１４２４８でＹｅｓ）、Ｓ１４２４６で出力された木構造データの差分情報を読み込み（Ｓ１４２５０）、ユーザ側に結果通知を行う（Ｓ１４２５１）。例えば、木構造選定部１４２は、ユーザ側に帳票ファイルそれぞれの木構造データの差分情報の通知を行う。その後、ユーザはこれらの帳票ファイルの木構造データの差分情報に対して図１４−２（ａ）の処理を実施するか、帳票ファイルから木構造データへの変換を行わないかを決定する。
【０１１１】
このようにすることで、木構造選定部１４２は、２以上の帳票ファイルの処理を行う場合に、他の帳票ファイルの選定・変換処理に影響を与えずに全帳票ファイルの処理を実行できる。また、複数の木構造データが生成されたときに、木構造選定部１４２はその差分情報をまとめてユーザに表示することができる。
【０１１２】
また、例えば、木構造選定部１４２は、図１４−２の（ｃ）に示すように、複数の木構造データのうち最もシンプルな構造の木構造データを選定してもよい。例えば、木構造選定部１４２は、各木構造データについて構造の複雑さを示す値を計算する（Ｓ１４２５２）。そして、木構造選定部１４２は、構造が最もシンプルな木構造データを選定する（Ｓ１４２５３）。例えば、木構造選定部１４２は、各木構造データにおける包含関係の階層の数をカウントし、その包含関係の階層が最も少ない木構造データを選定する。そして、木構造選定部１４２は、ユーザ側に木構造データの選定の結果通知を行う（Ｓ１４２５４）。
【０１１３】
このように木構造データの構造の複雑さに着目して木構造データの選択を行うのは、木構造データ構築部１４１によりあまりに複雑な構造を持つ木構造データが生成された場合、その木構造データは、実際の帳票ファイルの論理構造とは異なる可能性が高いと推測されるからである。つまり、上記のように複数の木構造データが生成されたときに、木構造選定部１４２が、最もシンプルな構造の木構造データを選定することで、より実際の帳票ファイルの論理構造に近い木構造データを選定することができる。
【０１１４】
（帳票構造構築処理）
次に、図１５を用いて、図４−１のＳ５の帳票構造構築処理を説明する。帳票構造構築部１４３は、木構造推定部１４により出力された木構造データを読み込むと（Ｓ１４３１）、全ノードクラスタの木構造データを取得済みか否かを判定し（Ｓ１４３３）、全ノードクラスタの木構造データを取得済みであれば（Ｓ１４３３のＹｅｓ）、ノードクラスタを統合する（Ｓ１４３４）。そして、帳票構造構築部１４３は、プロパティ情報取得部１３４から出力されたプロパティ情報を読み込み（Ｓ１４３５）、このプロパティ情報を含む帳票構成に木構造データを追加する（Ｓ１４３６）。これを帳票構成情報とする。
【０１１５】
例えば、帳票構造構築部１４３は、図６に示すようにプロパティ情報（ファイル情報＋ドキュメント情報＋帳票メタ情報）を含む帳票構成に、木構造推定部１４にて生成した木構造データを統合する。
【０１１６】
その後、帳票構造構築部１４３は帳票ファイルの全ページ（全シート）について木構造データを取得したことを確認すると（Ｓ１４３７でＹｅｓ）、Ｓ１４３６で生成した帳票構成情報を帳票データベース１２２に出力する（Ｓ１４３８）。一方、帳票構造構築部１４３は帳票ファイルのまだ木構造データを取得していないページがあれば（Ｓ１４３７のＮｏ）、ノード生成部１３３にて図４−２のＳ１３３のノード生成処理を行う（Ｓ１３３）。また、Ｓ１４３３においてまだ木構造データを取得していないノードクラスタがあれば（Ｓ１４３３でＮｏ）、帳票構造構築部１４３は未取得のノードクラスタを選択し（Ｓ１４４０）、木構造推定部１４にて図４−１のＳ４の木構造推定処理を行う（Ｓ４）。
【０１１７】
このようにすることで、帳票構造構築部１４３は各ノードクラスタの木構造データをプロパティ情報と統合した情報（帳票構成情報）を帳票データベース１２２に登録することができる。
【０１１８】
以上説明したデータ構造抽出装置１０によれば帳票ファイルの中に縦横の論理構造が混在している場合であっても、帳票ファイルの木構造データを精度よく抽出することができる。また、データ構造抽出部１１は、この帳票ファイルの木構造データとプロパティ情報とを対応付けた情報を帳票データベース１２２に登録することができる。
【０１１９】
（その他の実施形態）
なお、データ構造抽出装置１０は、帳票ファイルから抽出した項目名を項目名データベース１２３に登録しておき、新たな帳票ファイルを受け付けたときには、この項目名データベース１２３を参照して、ノードクラスタのノードの項目属性を付与するようにしてもよい。
【０１２０】
このようなデータ構造抽出装置１０は、図３の破線で示す項目名登録部１３７と、項目名データベース１２３と、項目名割当部１３９とを備える。
【０１２１】
項目名登録部１３７は、ノード生成部１３３からノード情報を取得すると、項目名の判断に関する帳票構造ルール１２１に従い、項目名のノードである可能性の高いノードから文字列を抜き出し、項目名データベース１２３に登録する。
【０１２２】
項目名データベース１２３は、項目名登録部１３７により抜き出された文字列（項目名に用いられることが多い文字列）を記憶する。
【０１２３】
項目名割当部１３９は、項目名データベース１２３を参照して、ノードクラスタの各ノードに対して項目属性（「項目名」か「帳票データ」か）を付与する。
【０１２４】
このようなデータ構造抽出装置１０によれば、ノードクラスタの各ノードに対し精度よく項目属性を付与することができる。その結果、データ構造抽出装置１０は精度のよい木構造データを生成することができる。また、木構造データ生成処理に要する時間を低減できる。
【０１２５】
（項目名登録処理）
図９を用いて項目名登録部１３７の処理手順の例を説明する。項目名登録部１３７は、ノード生成部１３３から出力された帳票のノード情報を読み込み（Ｓ１３７１）、項目名判断に関する帳票構造ルール１２１を読み込む（Ｓ１３７２）。そして、項目名登録部１３７は、当該帳票のノード情報が項目名の判断に関する帳票構造ルール１２１を満たすと判断したとき（Ｓ１３７３でＹｅｓ）、当該帳票をテンプレートとみなし、項目名の判断に関する帳票構造ルール１２１に従って、各ノードから文字列情報を抜き出す（Ｓ１３７４）。その後、項目名登録部１３７は、抜き出した文字列から文の構造を省き（Ｓ１３７５）、抜き出した文字列を項目名データベース１２３に登録する（Ｓ１３７６）。一方、項目名登録部１３７は、当該帳票のノード情報が項目名の判断に関する帳票構造ルール１２１を満たさないと判断したとき（Ｓ１３７３でＮｏ）、処理を終了する。
【０１２６】
上記の項目名の判断に関するルールは、例えば、以下の（１）〜（３）のいずれかの条件を満たすとき、ノード情報から文字列情報を抽出すると判断する、というルールである。（１）ノードの文字列情報が空（null）のノードが閾値以上（例えば、帳票ファイル全体の５０％以上のノードに対して）ある。（２）ノードに指定した塗りつぶし色、または白、透明以外のいずれかの塗りつぶし色が閾値以上（例えば、帳票ファイル全体数の５０％以上のノードに対して）使われている。（３）ユーザにより帳票ファイルがテンプレートであると定義される。また、（１）の場合、項目名の登録に関し、項目名登録部１３７は、文字情報が空でないノードの文字列を全て項目名として登録するというルール、（２）の場合、項目名登録部１３７は、指定した塗りつぶし色、または白、透明以外のいずれかの塗りつぶし色の文字列を項目名として登録するというルールもさらに備える。
【０１２７】
このようにすることで、項目名割当部１３９は、より項目名である可能性の高い文字列情報を項目名データベース１２３に登録することができる。
【０１２８】
（項目名割当処理）
図１１を用いて項目名割当部１３９の処理手順の例を説明する。項目名割当部１３９は、ノードクラスタのノード情報を読み込み（Ｓ１３９１）、項目名データベース１２３の項目名リストを読み込む（Ｓ１３９２）。次に、項目名割当部１３９は、ノードクラスタの未確認のノードをノードＸとし（Ｓ１３９３）、任意のノードＸの文字列が項目リスト上に存在すれば（Ｓ１３９４のＹｅｓ）、ノードＸの項目属性に「項目名」を割り当て（Ｓ１３９５）、ノードＸの文字列が項目リスト上に存在しなければ（Ｓ１３９４のＮｏ）、ノードＸの項目属性を割り当てない（Ｓ１３９６）。Ｓ１３９５、Ｓ１３９６の後、項目名割当部１３９が全てのノードを確認した（つまり、Ｓ１３９３以降の処理を実行した）と判断すると（Ｓ１３９７でＹｅｓ）、ノードクラスタのノード情報を部分木パターン生成部１４０に出力する（Ｓ１３９８）。一方、項目名割当部１３９において未確認のノードがあれば（Ｓ１３９７でＮｏ）、Ｓ１３９３へ戻る。
【０１２９】
このようにすることで、項目名割当部１３９は、ノードクラスタの各ノードに対し項目属性を付与することができる。
【０１３０】
（プログラム）
また、上記実施形態に係るデータ構造抽出装置１０が実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成し、実行することもできる。この場合、コンピュータがプログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかるプログラムをコンピュータに読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。以下に、データ構造抽出装置１０と同様の機能を実現する制御プログラムを実行するコンピュータの一例を説明する。
【０１３１】
図１７は、データ構造抽出プログラムを実行するコンピュータを示す図である。図１７に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【０１３２】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【０１３３】
ここで、図１７に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した各情報は、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【０１３４】
また、データ構造抽出プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、ハードディスクドライブ１０９０に記憶される。具体的には、上記実施形態で説明したデータ構造抽出装置１０が実行する各処理が記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。
【０１３５】
また、データ構造抽出プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【０１３６】
なお、データ構造抽出プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、制御プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０１３７】
１０    データ構造抽出装置
１１    データ構造抽出部
１２    記憶部
１３    グラフ生成部
１２１  帳票構造ルール
１２２  帳票データベース
１２３  項目名データベース
１３１  操作インタフェース識別部
１３２  帳票書式情報取得部
１３３  ノード生成部
１３４  プロパティ情報取得部
１３５  隣接エッジ生成部
１３６  包含エッジ生成部
１３７  項目名登録部
１３８  ノードクラスタ部
１３９  項目名割当部
１４０  部分木パターン生成部
１４１  木構造データ構築部
１４２  木構造選定部
１４３  帳票構造構築部
【図１】
0006325472.tif 000002
【図２】
0006325472.tif 000003
【図３】
0006325472.tif 000004
【図４−１】
0006325472.tif 000005
【図４−２】
0006325472.tif 000006
【図４−３】
0006325472.tif 000007
【図５−１】
0006325472.tif 000008
【図５−２】
0006325472.tif 000009
【図５−３】
0006325472.tif 000010
【図５−４】
0006325472.tif 000011
【図５−５】
0006325472.tif 000012
【図６】
0006325472.tif 000013
【図７−１】
0006325472.tif 000014
【図７−２】
0006325472.tif 000015
【図７−３】
0006325472.tif 000016
【図７−４】
0006325472.tif 000017
【図８】
0006325472.tif 000018
【図９】
0006325472.tif 000019
【図１０−１】
0006325472.tif 000020
【図１０−２】
0006325472.tif 000021
【図１０−３】
0006325472.tif 000022
【図１１】
0006325472.tif 000023
【図１２−１】
0006325472.tif 000024
【図１２−２】
0006325472.tif 000025
【図１２−３】
0006325472.tif 000026
【図１２−４】
0006325472.tif 000027
【図１２−５】
0006325472.tif 000028
【図１３】
0006325472.tif 000029
【図１４−１】
0006325472.tif 000030
【図１４−２】
0006325472.tif 000031
【図１５】
0006325472.tif 000032
【図１６−１】
0006325472.tif 000033
【図１６−２】
0006325472.tif 000034
【図１６−３】
0006325472.tif 000035
【図１６−４】
0006325472.tif 000036
【図１６−５】
0006325472.tif 000037
【図１６−６】
0006325472.tif 000038
【図１６−７】
0006325472.tif 000039
【図１７】
0006325472.tif 000040