(57)【特許請求の範囲】
【請求項１】
帳票から罫線枠を抽出し、前記罫線枠ごとの罫線枠情報として、罫線の種類または太さ、枠内の文字列、および枠内の塗りつぶし色を少なくとも取得する取得工程と、
複数の前記罫線枠の前記罫線枠情報が予め設定された罫線枠結合条件を満たしている場合、該複数の罫線枠を結合する結合工程と、
前記結合工程による処理が実行された後、前記罫線枠の前記罫線枠情報が予め設定された罫線枠分割条件を満たしている場合、該罫線枠を分割する分割工程と、
前記分割工程による処理が実行された後、前記罫線枠の前記罫線枠情報が予め設定された罫線枠削除条件を満たしている場合、該罫線枠を削除する削除工程と、
を含んだことを特徴とする罫線枠補正方法。
【請求項２】
前記結合工程、前記分割工程および前記削除工程の実行後に、前記罫線枠を、前記帳票の項目名と前記項目名に対応する項目値とに分類し、前記項目名と前記項目値とを対応付けた木構造のデータを生成し出力する木構造データ出力工程をさらに有することを特徴とする請求項１に記載の罫線枠補正方法。
【請求項３】
前記取得工程は、さらに、前記帳票から文字列が記載された領域を抽出し、前記領域ごとの領域情報として、前記領域の上下左右いずれかの方向の罫線の有無、前記文字列および前記領域の塗りつぶし色を少なくとも取得し、また前記領域の上下左右いずれかの方向に罫線が存在する場合は該罫線の種類または太さを取得し、
前記削除工程による処理が実行された後、前記領域の前記領域情報が予め設定された罫線枠追加条件を満たしている場合、該領域に罫線を追加する追加工程をさらに含んだことを特徴とする請求項１または２に記載の罫線枠補正方法。
【請求項４】
前記結合工程は、第１の罫線枠、および前記第１の罫線枠に隣接する第２の罫線枠のうちの少なくとも一方が、罫線の種類が予め設定された特定の種類であること、罫線の太さが予め設定された特定の太さの範囲に含まれること、枠内の文字列が予め設定された特定の文字列であること、枠内の塗りつぶし色が予め設定された特定の色であること、のうちの少なくとも１つを満たしている場合、前記第１の罫線枠と前記第２の罫線枠とを結合することを特徴とする請求項１から３のいずれか１項に記載の罫線枠補正方法。
【請求項５】
前記分割工程は、前記罫線枠が、枠内の文字列が予め設定された特定の文字列であること、枠内の塗りつぶし色が予め設定された特定の色であること、のうちの少なくとも１つを満たしている場合、該罫線枠を分割することを特徴とする請求項１から４のいずれか１項に記載の罫線枠補正方法。
【請求項６】
前記削除工程は、前記罫線枠が、罫線の種類が予め設定された特定の種類であること、罫線の太さが予め設定された特定の太さの範囲に含まれること、枠内の文字列が予め設定された特定の文字列であること、枠内の塗りつぶし色が予め設定された特定の色であること、のうちの少なくとも１つを満たしている場合、該罫線枠を削除することを特徴とする請求項１から５のいずれか１項に記載の罫線枠補正方法。
【請求項７】
帳票から罫線枠を抽出し、前記罫線枠ごとの罫線枠情報として、罫線の種類または太さ、枠内の文字列、および枠内の塗りつぶし色を少なくとも取得する取得部と、
複数の前記罫線枠の前記罫線枠情報が予め設定された罫線枠結合条件を満たしている場合、該複数の罫線枠を結合する結合部と、
前記結合部によって処理が実行された後、前記罫線枠の前記罫線枠情報が予め設定された罫線枠分割条件を満たしている場合、該罫線枠を分割する分割部と、
前記分割部によって処理が実行された後、前記罫線枠の前記罫線枠情報が予め設定された罫線枠削除条件を満たしている場合、該罫線枠を削除する削除部と、
を有することを特徴とする罫線枠補正装置。
【請求項８】
コンピュータを、請求項７に記載の罫線枠補正装置として機能させるための罫線枠補正プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、罫線枠補正方法、罫線枠補正装置および罫線枠補正プログラムに関する。
【背景技術】
【０００２】
業務において、電子ファイルまたは紙で作成された帳票が様々なシーンで用いられている。帳票は、項目名および項目名に対する項目値によって構成されている場合が多い。その場合、項目名と項目名、または項目名と項目値を論理的に対応付けることで、帳票を構造的に表現することが可能となる。
【０００３】
従来、帳票の罫線枠の位置や大きさ等の情報を利用して、項目名と項目名の間（以降、項目名間）、または項目名と項目値の間（以降、項目名−項目値間）の論理関係を自動推定し、推定結果を木構造データとして出力する手法が知られている（例えば非特許文献１）。この手法によれば、出力した木構造データを用いて、他のシステム等と帳票との間で半自動的にデータの連携を行うことが可能となる。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】高木郁子，名和長年，丸山勉，“電子帳票群に対する横断的データ操作技術のための抽出手法の検討”，電子情報通信学会技術研究報告  LOIS2014-11，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）および当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１９６】
また、本実施形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１９７】
（プログラム）
一実施形態として、罫線枠補正方法は、罫線枠補正部２０と同様の機能を持つ罫線枠補正装置により実施されてもよい。この場合、罫線枠補正装置は、パッケージソフトウェアやオンラインソフトウェアとして上記の罫線枠補正を実行する罫線枠補正プログラムを所望のコンピュータにインストールさせることによって実装できる。例えば、上記の罫線枠補正プログラムを情報処理装置に実行させることにより、情報処理装置を罫線枠補正装置として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やＰＨＳ（Personal  Handyphone  System）等の移動体通信端末、さらには、ＰＤＡ（Personal  Digital  Assistants）等のスレート端末等がその範疇に含まれる。
【０１９８】
また、罫線枠補正装置は、ユーザが使用する端末装置をクライアントとし、当該クライアントに上記の罫線枠補正に関するサービスを提供するサーバ装置として実装することもできる。例えば、罫線枠補正装置は、罫線枠情報を入力とし、補正済み罫線枠情報を出力とする罫線枠補正サービスを提供するサーバ装置として実装される。この場合、罫線枠補正装置は、Ｗｅｂサーバとして実装することとしてもよいし、アウトソーシングによって上記の罫線枠補正に関するサービスを提供するクラウドとして実装することとしてもかまわない。以上のように、本発明は、コンピュータとプログラムによっても実現でき、当該プログラムを記録媒体に記録することも、ネットワークを通して提供することも可能である。
【０１９９】
図４０は、罫線枠補正プログラムを実行するコンピュータを示す図である。図４０に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【０２００】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【０２０１】
ここで、図４０に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した各情報は、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【０２０２】
また、罫線枠補正プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、ハードディスクドライブ１０９０に記憶される。具体的には、上述の罫線枠補正装置が実行する各処理が記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。
【０２０３】
また、罫線枠補正プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【０２０４】
なお、罫線枠補正プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、制御プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０２０５】
１０    データ構造抽出装置
１１    データ構造抽出部
１２    記憶部
１３    グラフ生成部
２０    罫線枠補正部
２１    取得部
２２    補正部
２３    結合部
２４    分割部
２５    削除部
２６    追加部
２７    補正ルール入力部
２８    補正ルール記憶部
１２１  帳票構造ルール
１２２  帳票データベース
１２３  項目名データベース
１３１  操作インタフェース識別部
１３２  帳票書式情報取得部
１３３  ノード生成部
１３４  プロパティ情報取得部
１３５  隣接エッジ生成部
１３６  包含エッジ生成部
１３７  項目名登録部
１３８  ノードクラスタ部
１３９  項目名割当部
１４０  部分木パターン生成部
１４１  木構造データ構築部
１４２  木構造選定部
１４３  帳票構造構築部
【図１】
0006430919.tif 000002
【図２】
0006430919.tif 000003
【図３−１】
0006430919.tif 000004
【図３−２】
0006430919.tif 000005
【図４−１】
0006430919.tif 000006
【図４−２】
0006430919.tif 000007
【図４−３】
0006430919.tif 000008
【図４−４】
0006430919.tif 000009
【図５−１】
0006430919.tif 000010
【図５−２】
0006430919.tif 000011
【図５−３】
0006430919.tif 000012
【図５−４】
0006430919.tif 000013
【図５−５】
0006430919.tif 000014
【図６】
0006430919.tif 000015
【図７−１】
0006430919.tif 000016
【図７−２】
0006430919.tif 000017
【図７−３】
0006430919.tif 000018
【図７−４】
0006430919.tif 000019
【図８】
0006430919.tif 000020
【図９】
0006430919.tif 000021
【図１０−１】
0006430919.tif 000022
【図１０−２】
0006430919.tif 000023
【図１０−３】
0006430919.tif 000024
【図１１】
0006430919.tif 000025
【図１２−１】
0006430919.tif 000026
【図１２−２】
0006430919.tif 000027
【図１２−３】
0006430919.tif 000028
【図１２−４】
0006430919.tif 000029
【図１２−５】
0006430919.tif 000030
【図１３】
0006430919.tif 000031
【図１４−１】
0006430919.tif 000032
【図１４−２】
0006430919.tif 000033
【図１５】
0006430919.tif 000034
【図１６−１】
0006430919.tif 000035
【図１６−２】
0006430919.tif 000036
【図１６−３】
0006430919.tif 000037
【図１６−４】
0006430919.tif 000038
【図１６−５】
0006430919.tif 000039
【図１６−６】
0006430919.tif 000040
【図１６−７】
0006430919.tif 000041
【図１７】
0006430919.tif 000042
【図１８】
0006430919.tif 000043
【図１９】
0006430919.tif 000044
【図２０】
0006430919.tif 000045
【図２１】
0006430919.tif 000046
【図２２】
0006430919.tif 000047
【図２３】
0006430919.tif 000048
【図２４】
0006430919.tif 000049
【図２５】
0006430919.tif 000050
【図２６】
0006430919.tif 000051
【図２７】
0006430919.tif 000052
【図２８】
0006430919.tif 000053
【図２９】
0006430919.tif 000054
【図３０】
0006430919.tif 000055
【図３１】
0006430919.tif 000056
【図３２】
0006430919.tif 000057
【図３３】
0006430919.tif 000058
【図３４】
0006430919.tif 000059
【図３５】
0006430919.tif 000060
【図３６】
0006430919.tif 000061
【図３７】
0006430919.tif 000062
【図３８】
0006430919.tif 000063
【図３９】
0006430919.tif 000064
【図４０】
0006430919.tif 000065