【文献】
電子帳票群に対する横断的データ操作技術のための抽出手法の検討,電子情報通信学会技術研究報告,2014年 7月17日,Vol.114, No.150,pp.1-6
【文献】
視覚表現を利用した電子帳票のデータ構造変換手法の検討,電子情報通信学会技術研究報告,2016年 1月14日,Vol.115, No.410,pp.25-30
【文献】
帳票文書の構造認識のための書式構造知識の自動獲得,電子情報通信学会論文誌,1993年 3月25日,J76-D-II巻, 第3号,pp.534-546
(58)【調査した分野】(Int.Cl.,DB名)
帳票の項目名または項目値を表す領域に関する情報をノードとして表し、前記ノード間の隣接関係をエッジとして表したグラフを基に、前記ノードのうち、あらかじめ設定された条件を満たすノードを、項目名を表す領域のノードである項目名ノードとして抽出する抽出部と、
1つのノードの所定の方向に、複数のノードが隣接している場合、前記1つのノードと前記複数のノードとの隣接関係を表すエッジを削除する第1の削除部と、
前記項目名ノードのうち、所定の方向に項目値を表す領域のノードである項目値ノードが隣接している項目名ノードと、前記項目値ノードとの隣接関係を表すエッジを削除する第2の削除部と、
前記第1の削除部および前記第2の削除部によってエッジの削除が行われた前記グラフを基に、前記項目名ノードと前記項目値ノードとの間の論理関係を取得する第1の取得部と、
前記第1の削除部によってエッジの削除が行われた前記グラフを基に、前記項目名ノード間の包含関係を取得する第2の取得部と、
前記第1の取得部によって取得された論理関係、および前記第2の取得部によって取得された包含関係を合成した木構造のデータを作成する合成部と、
を有することを特徴とする論理関係認識装置。
前記第2の取得部は、第1の項目名ノードの右側に隣接する第1のノード群のうち少なくとも1つが前記項目名ノードであり、かつ、前記第1のノード群に含まれる全てのノードの高さが前記第1の項目名ノードの高さ以下であり、かつ、前記第1のノード群の左上端のノードの頂点と、前記第1の項目名ノードの頂点が重なっている場合、前記第1の項目名ノードが前記第1のノード群を包含していると判定し、第2の項目名ノードの下側に隣接する第2のノード群のうち少なくとも1つが前記項目名ノードであり、かつ、前記第2のノード群に含まれる全てのノードの幅が前記第2の項目名ノードの幅以下であり、かつ、前記第2のノード群の左上端のノードの頂点と、前記第2の項目名ノードの頂点が重なっている場合、前記第2の項目名ノードが前記第2のノード群を包含していると判定することを特徴とする請求項2に記載の論理関係認識装置。
【発明を実施するための形態】
【0012】
以下に、本願に係る論理関係認識装置、論理関係認識方法および論理関係認識プログラムの実施形態を図面に基づいて詳細に説明する。なお、この実施形態により本発明が限定されるものではない。
【0013】
まず、
図1を用いて、論理関係認識装置を有する論理関係認識システムによる論理関係認識処理の概要について説明する。
図1は、論理関係認識処理の概要について説明するための図である。
図1に示すように、まず、論理関係認識システムは、PC等から列挙形式の帳票を読み込む(ステップS1)。このとき、論理関係認識システムが読み込むデータは、帳票に限られず、WebGUI、システムGUI、および画像上の列挙構造等の、半構造のデータであればよい。次に、論理関係認識システムは、読み込んだ帳票から罫線枠に関する情報を取得する(ステップS2)。また、論理関係認識システムは、スキャナ等で読み込まれた紙の帳票の画像から記載内容をOCR(光学文字認識:Optical Character Recognition)によって取得してもよい(ステップS3)。
【0014】
そして、論理関係認識システムは、罫線枠情報および項目名定義情報を基に、様式グラフを生成する(ステップS4)。罫線枠情報には、例えば罫線枠の座標、罫線枠内の文字列、罫線枠の塗りつぶし色、罫線の種類や太さ、色等の視覚的な情報が含まれる。また、項目名定義情報には、罫線枠を項目名として判断する際の条件が含まれる。
【0015】
例えば、色が黄色の罫線枠を項目名とする項目名定義情報は、「if {node:{color:#FFFF00}} then item」と記述される。また、例えば、文字列の空でない罫線枠を項目名とする罫線枠定義情報は、「if {node:{!string:null}} then item」と記述される。また、例えば、色が白でなく,かつ文字列が空でない罫線枠を項目名とする罫線枠定義情報は、「if {node:{!color:whilte},{!string:null} then item」と記述される。また、例えば、文字列が「y1」の罫線枠を項目名とする罫線枠定義情報は、「if {node:{string:”y1”}} then item」と記述される。
【0016】
また、様式グラフとは、帳票に含まれる複数の様式ごとに、罫線枠等をノード、ノードの隣接関係をエッジとして表したグラフである。以降の処理において、論理関係認識システムは、帳票の様式をグラフ形式のデータとして扱う。また、様式には列挙が含まれる。以降の説明では、様式グラフを基に論理関係を認識する場合について説明するが、帳票全体をノードとエッジで表した帳票グラフを用いることとしてもよい。
【0017】
次に、論理関係認識システムは、列挙形式の構造から論理関係を認識し(ステップS5)、認識した結果を所定の形式のデータ構造(xml、yaml、json等)に変換し(ステップS6)、DBに格納する。このとき、DBへはデータ構造のリンクパスを格納してもよいし、あらかじめ定義したスキーマに合わせてデータを格納してもよい。
【0018】
次に、
図2〜8を用いて、論理関係認識システムによる論理関係認識処理の対象である列挙の種類について説明する。なお、
図2〜8の各符号はノードを表しており、以降の説明では、説明のために、これらの符号が示すノードを、単にノードと呼ぶ場合と、項目名ノードまたは項目値ノードと呼ぶ場合がある。
【0019】
図2は、縦列挙の一例を示す図である。
図2に示すように、縦列挙は、項目名同士、および項目名と項目値の関係である論理関係を、縦方向に複数有する。例えば、ノードa1とa2、およびノードa4とa5は、項目名と項目値の論理関係を有する。
図3は、横列挙の一例を示す図である。
図3に示すように、横列挙は、論理関係を横方向に複数有する。例えば、ノードb1とb2は、項目名と項目値の論理関係を有する。なお、
図2〜8において、網掛け部分は項目名を表し、網掛けでない部分は項目値を表している。
【0020】
図4は、縦列挙と横列挙の複合型の一例を示す図である。
図4に示すように、縦列挙と横列挙の複合型の場合、縦列挙および横列挙が1つの様式内に存在する。例えば、ノードc1とc2、およびノードc3とc4は、横列挙である。また、例えば、ノードc5とc7、およびノードc6とc8は、縦列挙である。
【0021】
図5〜8は、列挙型入れ子構造の一例を示す図である。
図5に示すように、列挙型入れ子構造は、縦方向または横方向に、入れ子になった複数の列挙を有する。例えば、ノードd1とd2は項目名同士の論理関係を有する。さらに、ノードd2とd3は、項目名と項目値の論理関係を有する。このように、ノードd2とd3の論理関係は、ノードd1とd2の論理関係の入れ子になっている。
【0022】
また、
図6に示すように、例えば、ノードe1とe2は項目名同士の論理関係を有する。さらに、ノードe2とe3は、項目名と項目値の論理関係を有する。このように、ノードe2とe3の論理関係は、ノードe1とe2の論理関係の入れ子になっている。
【0023】
また、
図7に示すように、例えば、ノードf1とf2は項目名同士の論理関係を有する。また、ノードf2とf3は項目名同士の論理関係を有する。さらに、ノードf3とf4は、項目名と項目値の論理関係を有する。このように、ノードf3とf4の論理関係は、ノードf2とf3の論理関係の入れ子になっている。さらに、ノードf2とf3の論理関係は、ノードf1とf2の論理関係の入れ子になっている。
【0024】
また、
図8に示すように、例えば、ノードg2とg3は、項目名と項目値の論理関係を有する。また、ノードg6とg7は項目名同士の論理関係を有する。また、ノードg7とg8は、項目名と項目値の論理関係を有する。このように、ノードg7とg8の論理関係は、ノードg6とg7の論理関係の入れ子になっている。しかし、ノードg2とg3の論理関係は、ノードg7とg8の論理関係、およびノードg6とg7の論理関係との間に入れ子関係はない。
【0025】
[第1の実施形態の構成]
次に、
図9を用いて、第1の実施形態に係る論理関係認識装置の構成について説明する。
図9は、第1の実施形態に係る論理関係認識装置の構成の一例を示す図である。
図9に示すように、論理関係認識装置10は、制御部20および記憶部30を有する。
【0026】
制御部20は、論理関係認識装置10全体を制御する。制御部20は、例えば、CPU(Central Processing Unit)、MPU(Micro Processing Unit)等の電子回路や、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)等の集積回路である。また、制御部20は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、内部メモリを用いて各処理を実行する。また、制御部20は、各種のプログラムが動作することにより各種の処理部として機能する。例えば、制御部20は、抽出部201、解析部202、第1の削除部203、第2の削除部204、分類部205、縦列挙取得部206、横列挙取得部207、包含関係取得部208、包含グラフ生成部209、項目名間合成部210、列挙合成部211および追加部212を有する。
【0027】
記憶部30は、HDD(Hard Disk Drive)、SSD(Solid State Drive)、光ディスク等の記憶装置である。なお、記憶部30は、RAM(Random Access Memory)、フラッシュメモリ、NVSRAM(Non Volatile Static Random Access Memory)等のデータを書き換え可能な半導体メモリであってもよい。記憶部30は、論理関係認識装置10で実行されるOS(Operating System)や各種プログラムを記憶する。さらに、記憶部30は、プログラムの実行で用いられる各種情報を記憶する。また、記憶部30は、例えば列挙リスト301および包含グラフ302を記憶する。
【0028】
ここで、論理関係認識装置10による論理関係認識処理について説明するとともに、論理関係認識装置10の各部の詳細について説明する。抽出部201は、帳票の項目名または項目値を表す領域に関する情報をノードとして表し、ノード間の隣接関係をエッジとして表したグラフ、すなわち様式グラフを基に、ノードのうち、あらかじめ設定された条件を満たすノードを、項目名を表す領域のノードである項目名ノードとして抽出する。
【0029】
ここで、項目名ノードを抽出する際のルールは、解析部202によって作成される。解析部202は、あらかじめテキストファイル等として作成された解析前の視覚表現のルールを読み込み、読み込んだ視覚表現のルールから条件およびアクションを解析し、コンピュータで認識可能な視覚表現ルールを作成する。なお、以降の説明で、単に視覚表現ルールと呼ぶ場合は、解析後の視覚表現ルールのことを指すこととする。
【0030】
第1の削除部203は、1つのノードの所定の方向に、複数のノードが隣接している場合、1つのノードと複数のノードとの隣接関係を表すエッジを削除する。なお、第1の削除部203は、1つのノードの左側または上側に、複数のノードが隣接している場合、1つのノードと複数のノードとの隣接関係を表すエッジを削除するようにしてもよい。例えば、
図4の縦列挙と横列挙の複合型の場合、いずれのノードについても、左側または上側に複数ノードが隣接していないため、第1の削除部203はエッジを削除しない。また、例えば、
図8の列挙型入れ子構造の場合、ノードg6の上側に複数のノードが隣接しているため、第1の削除部203は、ノードg6と、ノードg1、g2、g3、g4およびg5との隣接関係を表すエッジを削除する。
【0031】
また、第2の削除部204は、項目名ノードのうち、所定の方向に項目値を表す領域のノードである項目値ノードが隣接している項目名ノードと、項目値ノードとの隣接関係を表すエッジを削除する。なお、第2の削除部204は、項目名ノードのうち、左側または上側に、項目値を表す領域のノードである項目値ノードが隣接している項目名ノードと、項目値ノードとの隣接関係を表すエッジを削除するようにしてもよい。例えば、
図4の縦列挙と横列挙の複合型の場合、項目名ノードc6の上側に項目値ノードc4が隣接しているため、第2の削除部204は、ノードc6とノードc4との隣接関係を表すエッジを削除する。また、例えば、
図6の列挙型入れ子構造の場合、項目名ノードe4の左側に項目値ノードe3およびe7が隣接しているため、第2の削除部204は、ノードe4と、ノードe3およびe7との隣接関係を表すエッジを削除する。
【0032】
そして、縦列挙取得部206および横列挙取得部207は、第1の削除部203および第2の削除部204によってエッジの削除が行われたグラフを基に、項目名ノードと項目値ノードとの間の論理関係を取得する。具体的に、縦列挙取得部206および横列挙取得部207は、論理関係を、
図10または11に示すようなリストとして取得し、取得したリストを列挙リスト301として記憶部30に格納する。
図10および11は、列挙リストの一例である。
【0033】
図10は、
図4の列挙の論理関係を表した列挙リストである。
図10のリストの1行目は、項目名ノードc1の横方向の子がノードc2であることを表している。また、
図10のリストの3行目は、項目名ノードc5の縦方向の子がノードc7であることを表している。
【0034】
図11は、
図7の列挙の論理関係を表した列挙リストである。
図11のリストの1行目は、項目名ノードf3の横方向の子がノードf4であることを表している。また、
図11のリストの2行目は、項目名ノードf9の横方向の子がノードf10であることを表している。
【0035】
また、例えば、
図8の列挙型入れ子構造の場合、第1の削除部203によって、ノードg6と、ノードg1、g2、g3、g4およびg5との隣接関係を表すエッジが削除されているため、縦列挙取得部206および横列挙取得部207が、項目名ノードg2の縦方向の子をg8とするような論理関係を取得することはない。
【0036】
また、例えば、
図8の列挙型入れ子構造の場合、第2の削除部204によって、ノードg14と、ノードg13およびg17との隣接関係を表すエッジが削除されているため、縦列挙取得部206および横列挙取得部207が、項目名ノードg12の横方向の子をg15とするような論理関係を取得することはない。
【0037】
包含関係取得部208は、第1の削除部203によってエッジの削除が行われたグラフを基に、項目名ノード間の包含関係を取得する。また、包含グラフ生成部209は、包含関係取得部208によって取得された包含関係を基に、
図12に示すようなグラフを生成し、生成したグラフを包含グラフ302として記憶部30に格納する。
図12は、包含グラフについて説明するための図である。
図12の破線は縦方向の包含関係を表している。また、
図12の実線は横方向の包含関係を表している。以後、対象ノードが縦方向(または横方向)に他のノードを1つ以上包含する場合、対象ノードを縦方向(または横方向)の包含ノードと呼ぶ。また、包含関係のあるノードのうち、他のノードに包含されないノードを主のノード、包含される他のノードを従のノードと呼ぶ。
【0038】
図12の包含グラフは、
図7の列挙型入れ子構造に対応したものである。
図7および12に示すように、ノードf2は、ノードf3、f5、f7、f9およびf11を横方向に包含している。また、ノードf13は、ノードf14、f16、f18、f20、f22およびf24を横方向に包含している。また、ノードf1は、ノードf2およびf13を縦方向に包含している。また、f1が主のノード、f2、f3、f5、f7、f9、f11、f13、f14、f16、f18、f20、f22、f2が従のノードとなる。
【0039】
具体的に、包含関係取得部208は、第1の項目名ノードの右側に隣接する第1のノード群のうち少なくとも1つが項目名ノードであり、かつ、第1のノード群に含まれる全てのノードの高さが第1の項目名ノードの高さ以下であり、かつ、第1のノード群の左上端のノードの頂点と、第1の項目名ノードの頂点が重なっている場合、第1の項目名ノードが第1のノード群を横方向に包含していると判定する。また、包含関係取得部208は、第2の項目名ノードの下側に隣接する第2のノード群のうち少なくとも1つが項目名ノードであり、かつ、第2のノード群に含まれる全てのノードの幅が第2の項目名ノードの幅以下であり、かつ、第2のノード群の左上端のノードの頂点と、第1の項目名ノードの頂点が重なっている場合、第2の項目名ノードが第2のノード群を縦方向に包含していると判定する。
【0040】
例えば、
図7に示すように、項目名ノードf2の右側に隣接するノード群のうち、少なくともノードf3は項目名ノードである。また、項目名ノードf2の右側に隣接するノード群に含まれる全てのノードの高さは、全て項目名ノードf2の高さ以下である。また、項目名ノードf2の右側に隣接するノード群の左上端のノード、すなわちノードf3の頂点は、項目名ノードf2の頂点と重なり、かつ項目名ノードf2の右側に隣接するノード群の左下端のノード、すなわちノードf4の頂点は項目名ノードf2の頂点と重なる。これより、包含関係取得部208は、項目名ノードf2が、項目名ノードf2の右側に隣接するノード群を包含していると判定する。
【0041】
なお、包含関係取得部208の処理対象となる様式グラフは、第1の削除部203によるエッジの削除は行われているが、第2の削除部204によるエッジの削除は行われていないものである。このため、例えば、ノードf4と、ノードf5およびf7との間の隣接関係を表すエッジは削除されていない。そのため、包含関係取得部208は、項目名ノードf2が、ノードf5およびf7を横方向に包含していると判定する。
【0042】
項目名間合成部210は、包含グラフを、
図13に示すような、木構造のデータとして表す。
図13は、包含グラフについて説明するための図である。そして、項目名間合成部210および列挙合成部211は、縦列挙取得部206および横列挙取得部207によって取得された論理関係と、包含関係取得部208によって取得された包含関係と、を合成した木構造のデータを作成する。また、追加部212は、項目名間合成部210および列挙合成部211によって作成された木構造のデータに、当該木構造を定義する根ノードを追加する。
【0043】
例えば、列挙合成部211は、
図10のリストを基に、
図14に示す木構造のデータを作成する。そして、追加部212は、当該木構造のデータに根ノード「form1」を追加する。
図14は、木構造のデータの一例である。なお、この場合、
図4の列挙には包含関係が存在しないため、項目名間合成部210は、包含グラフを作成しない。
【0044】
また、例えば、列挙合成部211は、
図11のリストおよび
図13の包含グラフを基に、
図15に示す木構造のデータを作成する。そして、追加部212は、当該木構造のデータに根ノード「form2」を追加する。
図15は、木構造のデータの一例である。なお、根ノードは様式を構成する論理関係を示すために追加しているため、様式を構成する情報が必要なければ追加部212は必須ではない。
【0045】
なお、木構造データの各ノードである木ノードは、例えば項目名または項目値の文字列等の帳票の書式情報から取得された情報の他に、子や親のノードを識別する情報、子や親のノードとの隣接方向、および当該木ノードが列挙に含まれるものであることを示す情報等を有する。
【0046】
[第1の実施形態の処理]
次に、論理関係認識装置10の処理の流れについて説明する。まず、
図16を用いて抽出部201の処理について説明する。
図16は、抽出部の処理の流れを示すフローチャートである。
図16に示すように、まず、抽出部201は、様式グラフおよび解析後視覚表現ルールを読み込む(ステップS11)。次に、抽出部201は、様式グラフから解析後視覚表現ルールの条件を満たすノード群を選択する(ステップS12)。次に、抽出部201は、選択したノード群の項目名属性を項目名に設定、すなわち項目名であることを示すフラグの値をtrueにする(ステップS13)。最後に、抽出部201は、様式グラフとGとして返す(ステップS14)。
【0047】
次に、
図17を用いて解析部202の処理について説明する。
図17は、解析部の処理の流れを示すフローチャートである。解析部202は、視覚表現ルールを基に解析後視覚表現ルールを作成する。まず、解析部202は、視覚表現ルール群を読み込む(ステップS21)。次に、解析部202は、ArrayまたはHash型の変数rule_listを生成する(ステップS22)。以降、解析部202は、読み込んだ視覚表現ルールを1つずつ処理する(ステップS23、S27)。
【0048】
まず、解析部202は、視覚表現ルールの条件を解析する(ステップS24)。次に、解析部202は、視覚表現ルールのアクションを解析する(ステップS25)。そして、解析部202は、解析した条件およびアクションを解析後視覚表現ルールとしてrule_listに格納する(ステップS26)。解析部202は、全ての視覚表現ルールについて処理を行った後、解析後視覚表現ルール群が格納されたrule_listを出力する(ステップS28)。
【0049】
次に、
図18を用いて、第1の削除部203の処理について説明する。
図18は、第1の削除部の処理の流れを示すフローチャートである。まず、第1の削除部203は、様式グラフを読み込む(ステップS31)。
【0050】
次に、第1の削除部203は、様式グラフの各ノードについて、以下の処理を行う(ステップS32、S37)。まず、左方向に隣接するノードの本数が2本以上である場合(ステップS33、true)、第1の削除部203は、左方向に隣接するノードと対象ノードの隣接関係を削除する(ステップS34)。また、左方向に隣接するノードの本数が2本以上でない場合(ステップS33、false)、第1の削除部203は、隣接関係を削除しない。
【0051】
次に、上方向に隣接するノードの本数が2本以上である場合(ステップS35、true)、第1の削除部203は、上方向に隣接するノードと対象ノードの隣接関係を削除する(ステップS36)。また、上方向に隣接するノードの本数が2本以上でない場合(ステップS35、false)、第1の削除部203は、隣接関係を削除しない。第1の削除部203は、全ての対象ノードについて処理を行った後、様式グラフを出力する(ステップS38)。
【0052】
例えば、
図8の例では、第1の削除部203は、ノードg1、g2、g3、g4およびg5と、ノードg6との隣接関係や、ノードg13およびg17と、ノードg14との隣接関係を表すエッジを削除する。
【0053】
次に、
図19を用いて、第2の削除部204の処理について説明する。
図19は、第2の削除部の処理の流れを示すフローチャートである。まず、第2の削除部204は、様式グラフおよび項目名ノードリストを読み込む(ステップS41)。なお、項目名ノードリストは、抽出部201によって抽出された項目名ノードのリストである。
【0054】
次に、第2の削除部204は、項目名ノードのリストの各項目名ノードについて、以下の処理を行う(ステップS42、S47)。まず、左方向に項目値ノードが隣接する場合(ステップS43、true)、第2の削除部204は、左方向に隣接するノードと対象ノードの隣接関係を削除する(ステップS44)。また、左方向に項目値ノードが隣接しない場合(ステップS43、false)、第2の削除部204は、隣接関係を削除しない。
【0055】
次に、上方向に項目値ノードが隣接する場合(ステップS45、true)、第2の削除部204は、上方向に隣接するノードと対象ノードの隣接関係を削除する(ステップS46)。また、上方向に項目値ノードが隣接しない場合(ステップS45、false)、第2の削除部204は、隣接関係を削除しない。第2の削除部204は、全ての対象ノードについて処理を行った後、様式グラフを出力する(ステップS48)。
【0056】
例えば、
図8の例では、第2の削除部204は、ノードg3とノードg4との隣接関係や、ノードg8と、ノードg12およびg13との隣接関係や、ノードg14およびg17と、ノードg15との隣接関係を表すエッジを削除する。
【0057】
次に、
図20を用いて、分類部205の処理について説明する。
図20は、分類部の処理の流れを示すフローチャートである。以後、対象ノードから右側に隣接しているノードを辿って得られるノードとの関係を「右側に接続する」、対象ノードから下側に隣接しているノードを辿って得られるノードとの関係を「下側に接続する」と呼ぶ。
図20に示すように、まず、分類部205は、様式グラフおよび対象ノードを読み込む(ステップS51)。ここで、対象ノードが項目名でない場合(ステップS52、true)、分類部205は、列挙フラグを「列挙なし」に設定する(ステップS58)。なお、列挙フラグは、各対象ノードの分類を「縦列挙」、「横列挙」および「列挙なし」のうちのいずれかで示す変数である。また、列挙には、縦列挙と横列挙の複合型や、列挙入れ子構造も存在するが、これらの列挙は、縦列挙および横列挙の組み合わせで表現することができる。
【0058】
また、対象ノードが項目名である場合(ステップS52、false)、分類部205は、対象ノードの下側に接続するノード群をbottomsに格納し、対象ノードの右側に接続するノード群をrightsに格納する(ステップS53)。
【0059】
ここで、rightsに項目名が含まれず、rightsの個数が1である場合(ステップS54、true)、分類部205は、列挙フラグを「横列挙」に設定する(ステップS55)。また、rightsに項目名が含まれる場合、またはrightsの個数が1でない場合(ステップS54、false)、分類部205は、以下の処理を行う。
【0060】
bottomsに項目名が含まれず、bottomsの個数が1である場合(ステップS56、true)、分類部205は、列挙フラグを「縦列挙」に設定する(ステップS57)。bottomsに項目名が含まれる場合、または、bottomsの個数が1でない場合(ステップS56、false)、分類部205は、列挙フラグを「列挙なし」に設定する(ステップS58)。最後に、分類部205は、列挙フラグを出力する(ステップS59)。
【0061】
例えば、
図6の例では、対象ノードがノードe1である場合、分類部205は、列挙フラグを「列挙なし」にする。また、対象ノードがノードe4である場合、分類部205は、列挙フラグを「横列挙」にする。
【0062】
次に、
図21を用いて、縦列挙取得部206の処理について説明する。
図21は、縦列挙取得部の処理の流れを示すフローチャートである。
図21に示すように、まず、縦列挙取得部206は、様式グラフおよび対象ノードを読み込む(ステップS61)。次に、縦列挙取得部206は、bottomsに対象ノードの下側に接続するノード群を格納する(ステップS62)。ここで、bottomsに項目名が含まれている場合(ステップS63、true)、縦列挙取得部206は、処理を終了する。また、bottomsに項目名が含まれていない場合(ステップS63、false)、縦列挙取得部206は、親を対象ノード、子をbottoms、方向を縦とする論理関係を取得する(ステップS64)。そして、縦列挙取得部206は、取得した論理関係を列挙リスト301に追加する(ステップS65)。
【0063】
例えば、
図2の例では、対象ノードがノードa1である場合、縦列挙取得部206は、bottomsにはノードa2およびa3を格納し、親をノードa1、子をノードa2およびa3、方向を縦とする論理関係を取得する。また、対象ノードがノードa4である場合、縦列挙取得部206は、bottomsにはノードa5を格納し、親をノードa4、子をノードa5、方向を縦とする論理関係を取得する。
【0064】
次に、
図22を用いて、横列挙取得部207の処理について説明する。
図22は、横列挙取得部の処理の流れを示すフローチャートである。
図22に示すように、まず、横列挙取得部207は、様式グラフおよび対象ノードを読み込む(ステップS71)。次に、横列挙取得部207は、rightsに対象ノードの右側に接続するノード群を格納する(ステップS72)。ここで、rightsに項目名が含まれている場合(ステップS73、true)、横列挙取得部207は、処理を終了する。また、rightsに項目名が含まれていない場合(ステップS73、false)、横列挙取得部207は、親を対象ノード、子をrights、方向を横とする論理関係を取得する(ステップS74)。そして、横列挙取得部207は、取得した論理関係を列挙リスト301に追加する(ステップS75)。
【0065】
例えば、
図3の例では、対象ノードがノードb1である場合、横列挙取得部207は、rightsにノードb2を格納し、親をノードb1、子をノードb2、方向を横とする論理関係を取得する。また、対象ノードがノードb3である場合、横列挙取得部207は、rightsにノードb4を格納し、親ノードをb3、子をb4、方向を横とする論理関係を取得する。
【0066】
次に、
図23を用いて、包含関係取得部208の処理について説明する。
図23は、包含関係取得部の処理の流れを示すフローチャートである。包含関係取得部208は、まず、様式グラフを読み込む(ステップS81)。
【0067】
ここで、包含関係取得部208は、様式グラフに含まれる各ノードについて、以下の処理を行う(ステップS82、S87)。まず、ノード自身が項目名、かつ右方向に隣接するノードに項目名のノードを含む場合(ステップS83、true)、包含関係取得部208は、右側の包含関係を取得する(ステップS84)。右側の包含関係を取得する処理の詳細については後述する。また、ノード自身が項目名でない場合、または右方向に隣接するノードに項目名のノードを含まない場合(ステップS83、false)、包含関係取得部208は、右側の包含関係を取得しない。
【0068】
次に、ノード自身が項目名、かつ下方向に隣接するノードに項目名のノードを含む場合(ステップS85、true)、包含関係取得部208は、下側の包含関係を取得する(ステップS86)。下側の包含関係を取得する処理の詳細については後述する。また、ノード自身が項目名でない場合、または下方向に隣接するノードに項目名のノードを含まない場合(ステップS85、false)、包含関係取得部208は、右側の包含関係を取得しない。包含関係取得部208は、全てのノードについて処理を行った後、取得した包含関係を包含関係リストとして出力する(ステップS88)。
【0069】
次に、
図24を用いて、右側の包含関係を取得する処理について説明する。
図24は、右側の包含関係を取得する処理の流れを示すフローチャートである。
図24に示すように、まず、包含関係取得部208は、対象ノードおよび様式グラフを読み込む(ステップS101)。次に、包含関係取得部208は、min_yに、対象ノードの右側にあるノード群のy座標の最小値を格納し、max_yに、対象ノードの右側にあるノード群のy座標の最大値を格納する(ステップS102)。
【0070】
ここで、対象ノードのy座標の範囲が対象ノードの右側のノード群のy座標の範囲と一致する場合(ステップS103、true)、包含関係取得部208は、listに、対象ノードの右側のノード群を格納する(ステップS107)。なお、包含関係取得部208は、対象ノードの右側のノード群のy座標の範囲を、min_yおよびmax_yを用いて計算する。そして、包含関係取得部208は、listに含まれるノードそれぞれについて以下の処理を行う(ステップS108、S110)。包含関係取得部208は、それぞれのノードrを対象ノードとするたびに、ステップS102に戻り再帰処理を実行する(ステップS109)。
【0071】
また、対象ノードのy座標の範囲が対象ノードの右側のノード群のy座標の範囲と一致しない場合(ステップS103、false)であって、包含するノードの中に項目値が含まれない場合(ステップS104、false)、包含関係取得部208は、右側に包含する従のノード集合(list)を初期化する(ステップS105)。また、包含するノードの中に項目値が含まれる場合(ステップS104、true)、包含関係取得部208は、初期化を行わない。最後に、包含関係取得部208は、listを出力する(ステップS106)。
【0072】
次に、
図25を用いて、下側の包含関係を取得する処理について説明する。
図25は、下側の包含関係を取得する処理の流れを示すフローチャートである。
図25に示すように、まず、包含関係取得部208は、対象ノードおよび様式グラフを読み込む(ステップS151)。次に、包含関係取得部208は、min_xに、対象ノードの下側にあるノード群のx座標の最小値を格納し、max_xに、対象ノードの下側にあるノード群のx座標の最大値を格納する(ステップS152)。
【0073】
ここで、対象ノードのx座標の範囲が対象ノードの下側のノード群のx座標の範囲と一致する場合(ステップS153、true)、包含関係取得部208は、listに、対象ノードの下側のノード群を格納する(ステップS157)。なお、包含関係取得部208は、対象ノードの下側のノード群のy座標の範囲を、min_xおよびmax_xを用いて計算する。そして、包含関係取得部208は、listに含まれるノードそれぞれについて以下の処理を行う(ステップS158、S160)。包含関係取得部208は、それぞれのノードrを対象ノードとするたびに、ステップS152に戻り再帰処理を実行する(ステップS159)。
【0074】
また、対象ノードのx座標の範囲が対象ノードの下側のノード群のx座標の範囲と一致しない場合(ステップS153、false)であって、包含するノードの中に項目値が含まれない場合(ステップS154、false)、包含関係取得部208は、下側に包含する従のノード集合(list)を初期化する(ステップS155)。また、包含するノードの中に項目値が含まれる場合(ステップS154、true)、包含関係取得部208は、初期化を行わない。最後に、包含関係取得部208は、listを出力する(ステップS156)。
【0075】
次に、
図26を用いて、包含グラフ生成部209の処理について説明する。
図26は、包含グラフ生成部の処理の流れを示すフローチャートである。
図26に示すように、まず、包含グラフ生成部209は、様式グラフおよび包含関係リストを読み込む(ステップS201)。次に、包含グラフ生成部209は、Nvに、包含関係リストから取得した縦方向の包含ノードを格納し、Nhに、包含関係リストから取得した横方向の包含ノードを格納し、IGに、新規包含グラフ集合を格納する(ステップS202)。
【0076】
ここで、包含グラフ生成部209は、NvおよびNhに含まれる各包含ノードiについて、以下の処理を行う(ステップS203、S213)。以後、他のノードの包含関係から、包含グラフに対象ノードが既に割り当てられている場合、対象ノードを「分割済みのノード」と呼ぶ。まず、包含ノードiが分割済みである場合(ステップS204、true)、包含グラフ生成部209は、次の包含ノードの処理に進む。また、包含ノードiが分割済みでない場合(ステップS204、false)、包含グラフ生成部209は、incに包含ノードiおよび従の項目名ノード集合を格納する(ステップS205)。
【0077】
ここで、incの中で分割済みのノードがある場合(ステップS206、true)、包含グラフ生成部209は、生成済包含グラフから従のノードが重なっているグラフを探し、当該包含ノードをnに格納する(ステップS207)。次に、包含グラフ生成部209は、包含ノードnを起点とする包含グラフ内にあるノードに追加されていないノード群を追加する(ステップS208)。そして、包含グラフ生成部209は、包含ノードの包含する方向、または項目名の並びから包含方向を設定する(ステップS209)。
【0078】
一方、incの中で分割済みのノードがない場合(ステップS206、false)、包含グラフ生成部209は、新規包含グラフを生成する(ステップS210)。そして、包含グラフ生成部209は、主のノードが包含する方向、または項目名の並びから包含方向を設定し(ステップS211)、新規包含グラフを包含グラフ集合IGに追加する(ステップS212)。包含グラフ生成部209は、全てのiについて処理を行った後、包含グラフ集合IGを出力する(ステップS214)。
【0079】
このように、包含グラフ生成部209は、包含関係のあるノードのうち、包含するノードの数が多いものを優先して処理していく。包含グラフ生成部209は、まず、様式グラフ内の全ての包含関係を取得し、包含方向にノードを探索していく。また、例えば、
図7の例では、
図12に示すような包含グラフが生成される。また、
図8の例では、g1はg6に包含されていないため、g6を起点とした包含グラフとは別に、g1を起点とした包含グラフが生成される。
【0080】
次に、
図27を用いて、項目名間合成部210の処理について説明する。
図27は、項目名間合成部の処理の流れを示すフローチャートである。
図27に示すように、まず、項目名間合成部210は、様式グラフ、包含グラフ302、列挙リスト301および始点ノード群を読み込む(ステップS301)。次に、項目名間合成部210は、新規木構造Tを生成する(ステップS302)。なお、始点ノード群は、包含グラフの起点となるノードの集合である。
【0081】
ここで、項目名間合成部210は、始点ノード群に含まれる各始点ノードについて、以下の処理を行う(ステップS303、S319)。まず、項目名間合成部210は、包含グラフからノードが項目名のノード群を求め、childrenに格納する(ステップS304)。次に、項目名間合成部210は、子をchildren、親をなしとする始点ノード用の新規木ノードtを生成する(ステップS305)。そして、項目名間合成部210は、対象木ノードをtとする(ステップS306)。そして、項目名間合成部210は、対象木ノードの種類を設定せずに木構造に追加する(ステップS307)。
【0082】
ここで、対象木ノードが列挙リストにある場合(ステップS308、false)、項目名間合成部210は、次の始点ノードの処理に移行する。対象木ノードが列挙リストにない場合(ステップS308、true)であって、さらに、対象木ノードが横方向に包含するノード集合が存在する場合(ステップS309、true)、項目名間合成部210は、対象木ノードの種類を包含に設定する(ステップS310)。そして、項目名間合成部210は、横に包含するノード集合の次のノードを対象ノードとし、ステップS307へ戻り、再帰処理を行う(ステップS311、S312、S313)。
【0083】
対象木ノードが列挙リストにない場合(ステップS308、true)であって、さらに、対象木ノードが横方向に包含するノード集合が存在せず(ステップS309、false)、対象木ノードが縦方向に包含するノード集合が存在する場合(ステップS314、true)、項目名間合成部210は、対象木ノードの種類を包含に設定する(ステップS315)。そして、項目名間合成部210は、横に包含するノード集合の次のノードを対象ノードとし、ステップS307へ戻り、再帰処理を行う(ステップS316、S317、S318)。項目名間合成部210は、全ての始点ノードについて処理を行った後、木構造データを出力する(ステップS320)。
【0084】
なお、対象木ノードが列挙リストにない場合(ステップS308、true)であって、さらに、対象木ノードが横方向に包含するノード集合が存在せず(ステップS309、false)、対象木ノードが縦方向に包含するノード集合が存在しない場合(ステップS314、false)、項目名間合成部210は、次の始点ノードの処理に移行する。
【0085】
次に、
図28を用いて、列挙合成部211の処理について説明する。
図28に示すように、列挙合成部211は、まず、様式グラフ、列挙リスト301および木構造データを読み込む(ステップS341)。
【0086】
そして、列挙合成部211は、列挙リスト301の各ノードごとに以下の処理を行う(ステップS342、S347)。まず、列挙合成部211は、新規木ノードを生成する(ステップS343)。次に、列挙合成部211は、木ノードの子を列挙リストの子に設定する(ステップS344)。そして、列挙合成部211は、木ノードを木構造データに合成する(ステップS346)。列挙合成部211は、以上の処理を全てのノードについて行った後、木構造データを出力する(ステップS348)。例えば、
図7の例では、
図13に示すような木構造データが出力される。
【0087】
次に、
図29を用いて、追加部212の処理について説明する。
図29は、追加部の処理の流れを示すフローチャートである。
図29に示すように、まず、追加部212は、様式グラフおよび木構造データを読み込み、Sに木構造データを格納し、Gに様式グラフを格納する(ステップS351)。次に、追加部212は、ndsに親なしのノード集合を格納し、strに任意の文字列を格納する(ステップS352)。ここで、追加部212は、ndsの左または上方向にある罫線枠外の文字列が取得できれば、取得した文字列をstrに格納する(ステップS353)。
【0088】
罫線枠外の文字列が発見されなかった場合(ステップS354、false)、追加部212は、strに格納した任意の文字列を有し、種類を様式とする木ノードをndsの親として木構造データに追加する(ステップS355)。また、罫線枠外の文字列が発見された場合(ステップS354、true)、追加部212は、strに格納した任意の文字列を有し、種類を様式とする木ノードをndsの親として木構造データに追加する(ステップS356)。最後に、追加部212は、木構造データを出力する(ステップS357)。
【0089】
なお、任意の文字列としては、form#(i)のように、カウントに合わせて文字列が変わるようにしてもよい。この場合、(i)の部分がカウントに合わせて変化するため、根ノードの文字列は「form1」、「form2」のようになる。また、表の左または上方向の罫線枠外に、「○○直交表」のような記載があれば、根ノードの文字列を「○○直交表」のようにしてもよい。
【0090】
[第1の実施形態の効果]
抽出部201は、帳票の項目名または項目値を表す領域に関する情報をノードとして表し、ノード間の隣接関係をエッジとして表したグラフを基に、ノードのうち、あらかじめ設定された条件を満たすノードを、項目名を表す領域のノードである項目名ノードとして抽出する。また、第1の削除部203は、1つのノードの所定の方向に、複数のノードが隣接している場合、1つのノードと複数のノードとの隣接関係を表すエッジを削除する。また、第2の削除部204は、項目名ノードのうち、所定の方向に項目値を表す領域のノードである項目値ノードが隣接している項目名ノードと、項目値ノードとの隣接関係を表すエッジを削除する。
【0091】
縦列挙取得部206および横列挙取得部207は、第1の削除部203および第2の削除部204によってエッジの削除が行われたグラフを基に、項目名ノードと項目値ノードとの間の論理関係を取得する。また、包含関係取得部208は、第1の削除部203によってエッジの削除が行われたグラフを基に、項目名ノード間の包含関係を取得する。また、項目名間合成部210および列挙合成部211は、縦列挙取得部206および横列挙取得部207によって取得された論理関係と、包含関係取得部208によって取得された包含関係と、を合成した木構造のデータを作成する。
【0092】
このため、本実施形態によれば、帳票に縦列挙、横列挙、縦列挙と横列挙の複合型、または列挙型入れ子構造が含まれる場合であっても、帳票の項目名間の論理関係、および項目名と項目値との間の論理関係を正確に認識することができるようになる。さらに、本実施形態では、論理関係を半自動的に取得することができるため、帳票の半構造データの取得および活用を効率的に行うことができるようになる。
【0093】
また、第1の削除部203は、1つのノードの左側または上側に、複数のノードが隣接している場合、1つのノードと複数のノードとの隣接関係を表すエッジを削除してもよい。また、第2の削除部204は、項目名ノードのうち、左側または上側に、項目値を表す領域のノードである項目値ノードが隣接している項目名ノードと、項目値ノードとの隣接関係を表すエッジを削除してもよい。一般的に帳票の項目名間や項目名と項目値との位置関係は、左から右、または上から下である場合が多い。このため、削除する隣接関係の方向を左側と上側に設定しておくことで、多くの帳票に対応するこが可能になる。
【0094】
包含関係取得部208は、第1の項目名ノードの右側に隣接する第1のノード群のうち少なくとも1つが項目名ノードであり、かつ、第1のノード群に含まれる全てのノードの高さが第1の項目名ノードの高さ以下であり、かつ、第1のノード群の左上端のノードの頂点と、第1の項目名ノードの頂点が重なっている場合、第1の項目名ノードが第1のノード群を包含していると判定する。また、包含関係取得部208は、第2の項目名ノードの下側に隣接する第2のノード群のうち少なくとも1つが項目名ノードであり、かつ、第2のノード群に含まれる全てのノードの幅が第2の項目名ノードの幅以下であり、かつ、第2のノード群の左上端のノードの頂点と、第1の項目名ノードの頂点が重なっている場合、第2の項目名ノードが第2のノード群を包含していると判定する。このように、ノードの隣接関係、高さおよび幅を利用することによって、包含関係を正確に認識することができる。
【0095】
[その他の実施形態]
論理関係認識の対象は、帳票形式に整形可能であれば、Web画面やシステムGUIであってもよい。例えば、
図30に示すようなWeb上で航空券を行うようなWeb画面から、項目名および項目値を取得し、帳票形式に整形することで、当該Web画面を論理関係認識処理の対象とすることができる。
図30は、その他の実施形態について説明するための図である。
【0096】
[システム構成等]
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行われる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【0097】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的に行われるものとして説明した処理の全部または一部を公知の方法で自動的に行うこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【0098】
[プログラム]
一実施形態として、論理関係認識装置10は、パッケージソフトウェアやオンラインソフトウェアとして上記の論理関係認識を実行する論理関係認識プログラムを所望のコンピュータにインストールさせることによって実装できる。例えば、上記の論理関係認識プログラムを情報処理装置に実行させることにより、情報処理装置を論理関係認識装置10として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やPHS(Personal Handyphone System)等の移動体通信端末、さらには、PDA(Personal Digital Assistant)等のスレート端末等がその範疇に含まれる。
【0099】
また、論理関係認識装置10は、ユーザが使用する端末装置をクライアントとし、当該クライアントに上記の論理関係認識に関するサービスを提供する論理関係認識サーバ装置として実装することもできる。例えば、論理関係認識サーバ装置は、帳票を入力とし、木構造データを出力とする論理関係認識サービスを提供するサーバ装置として実装される。この場合、論理関係認識サーバ装置は、Webサーバとして実装することとしてもよいし、アウトソーシングによって上記の論理関係認識に関するサービスを提供するクラウドとして実装することとしてもかまわない。
【0100】
図31は、プログラムが実行されることにより論理関係認識装置が実現されるコンピュータの一例を示す図である。コンピュータ1000は、例えば、メモリ1010、CPU1020を有する。また、コンピュータ1000は、ハードディスクドライブインタフェース1030、ディスクドライブインタフェース1040、シリアルポートインタフェース1050、ビデオアダプタ1060、ネットワークインタフェース1070を有する。これらの各部は、バス1080によって接続される。
【0101】
メモリ1010は、ROM(Read Only Memory)1011およびRAM1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1100に挿入される。シリアルポートインタフェース1050は、例えばマウス1110、キーボード1120に接続される。ビデオアダプタ1060は、例えばディスプレイ1130に接続される。
【0102】
ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093、プログラムデータ1094を記憶する。すなわち、論理関係認識装置10の各処理を規定するプログラムは、コンピュータにより実行可能なコードが記述されたプログラムモジュール1093として実装される。プログラムモジュール1093は、例えばハードディスクドライブ1090に記憶される。例えば、論理関係認識装置10における機能構成と同様の処理を実行するためのプログラムモジュール1093が、ハードディスクドライブ1090に記憶される。なお、ハードディスクドライブ1090は、SSDにより代替されてもよい。
【0103】
また、上述した実施形態の処理で用いられる設定データは、プログラムデータ1094として、例えばメモリ1010やハードディスクドライブ1090に記憶される。そして、CPU1020が、メモリ1010やハードディスクドライブ1090に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出して実行する。
【0104】
なお、プログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1090に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、プログラムモジュール1093およびプログラムデータ1094は、ネットワーク(LAN、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール1093およびプログラムデータ1094は、他のコンピュータから、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。