(57)【特許請求の範囲】
【請求項１】
ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、前記ソフトウェアのソースコードから抽出する抽出部と、
前記抽出部により抽出された前記対応情報に基づき特定される前記関係先エンティティに対応する前記関係元エンティティとの入次数に応じて前記依存関係に関する重みを算出する算出部と、
前記算出部により算出された前記依存関係に関する重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する分割部と、
を有することを特徴とする分割装置。
【請求項２】
前記分割部は、
各々エンティティを有する部分グラフの集合の中から選ばれた複数の部分グラフを併合し、前記部分グラフの集合について各部分グラフに含まれる前記依存関係に関する重みの合計と当該合計の期待値との差を前記各部分グラフについて合計した評価関数の値を、併合前後の部分グラフの集合について求め、併合前よりも併合後の評価関数の値が大きくなる併合がある場合に、併合後の部分グラフの集合を前記複数のクラスタとして出力することを特徴とする請求項１に記載の分割装置。
【請求項３】
前記算出部は、前記関係先エンティティと依存関係のある前記関係元エンティティの個数に基づいて前記入次数を算出する、請求項１に記載の分割装置。
【請求項４】
前記エンティティ群の中のあるエンティティが複数のエンティティを関係先とする依存関係を有する場合、前記あるエンティティと前記複数のエンティティの各々との依存関係に関する重みの合計に基づいて、前記あるエンティティについての前記複数のエンティティの各々に関する重みを補正する補償処理部を有し、
前記分割部は、
前記補償処理部によって補正された前記複数のエンティティの各々に関する重みを用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする請求項１に記載の分割装置。
【請求項５】
前記エンティティ群の各々が１以上のサブエンティティを含む場合、サブエンティティ群について依存関係により特定される関係元のサブエンティティと関係先のサブエンティティとを対応付けたサブエンティティに関する対応情報を参照して、前記エンティティ群のあるエンティティ内のサブエンティティが複数のエンティティ内のサブエンティティの関係先である場合、前記あるエンティティ内のサブエンティティの個数と、前記複数のエンティティの各々に包含されるサブエンティティが関係元となる前記あるエンティティ内のサブエンティティの個数と、に基づいて、前記複数のエンティティの各々についての前記あるエンティティに関する重みを算出するマルチレベル解析部を有し、
前記分割部は、
前記マルチレベル解析部によって得られた前記あるエンティティに関する重みを用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする請求項１に記載の分割装置。
【請求項６】
第１のエンティティに包含される第１のサブエンティティについての第２のエンティティに包含される第２のサブエンティティに関する重みと、前記第２のサブエンティティについての第３のエンティティに包含される第３のサブエンティティに関する重みと、を累積することにより第１の累積重みを求めるとともに、前記第１のエンティティについての前記第２のエンティティに関する重みと前記第２のエンティティについての前記第３のエンティティに関する重みとを累積することにより第２の累積重みを求め、前記第２の累積重みが前記第１の累積重みよりも小さい場合、前記第１のエンティティを関係元とし前記第３のエンティティを前記第１のエンティティに対する関係先とするあらたな対応情報を生成し、当該対応情報に前記第１の累積重みを関連付ける仮想パス解析部を有し、
前記分割部は、
前記仮想パス解析部によって前記あらたな対応情報に関連付けられた前記第１の累積重みを用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする請求項５に記載の分割装置。
【請求項７】
関係元と、関係先と、前記関係元が前記関係先に対して条件分岐先を指定する情報であるコンテクストと、を対応付けたコンテクスト依存情報から、複数のエンティティに共通の関係先に対応するコンテクストを前記複数のエンティティの各々について抽出し、前記共通の関係先から前記コンテクストが付加されたコンテクスト付きエンティティを生成し、前記複数のエンティティの各々を関係元とし当該関係元に対応するコンテクストが付加された前記コンテクスト付きエンティティを関係先とする対応情報を生成するコンテクスト依存解析部を有し、
前記算出部は、
前記コンテクスト依存解析部によって得られた対応情報を参照して、前記関係元についての前記関係先のコンテクスト付きエンティティに関する重みを算出し、
前記分割部は、
前記関係元についての前記関係先のコンテクスト付きエンティティに関する重みを用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする請求項１または４に記載の分割装置。
【請求項８】
前記コンテクスト依存解析部は、
前記コンテクスト付きエンティティを関係元とし、前記コンテクスト付きエンティティが有するコンテクストにより指定されるエンティティを関係先とする対応情報を生成し、
前記算出部は、
前記コンテクスト依存解析部によって得られた対応情報を参照して、前記関係元である前記コンテクスト付きエンティティについての前記関係先に関する重みを算出し、
前記分割部は、
前記関係元である前記コンテクスト付きエンティティについての前記関係先に関する重みを用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする請求項７に記載の分割装置。
【請求項９】
前記エンティティ群の各々が１以上のサブエンティティを含む場合に存在するサブエンティティ群について、依存関係により特定される関係元のサブエンティティと、関係先のサブエンティティと、前記関係元のサブエンティティが前記関係先のサブエンティティに対して条件分岐先を指定する情報であるコンテクストと、を対応付けたコンテクスト依存情報から、包含されるエンティティが異なる複数のサブエンティティに共通の関係先のサブエンティティに対応するコンテクストを前記複数のサブエンティティの各々について抽出し、前記共通の関係先のサブエンティティから、前記コンテクストが付加されたコンテクスト付きサブエンティティを生成し、前記複数のサブエンティティの各々のサブエンティティを関係元とし、当該サブエンティティに対応するコンテクストが付加された前記コンテクスト付きサブエンティティを関係先とする、サブエンティティに関する対応情報を生成するコンテクスト依存解析部を有し、
前記算出部は、
前記コンテクスト依存解析部によって得られた前記サブエンティティに関する対応情報を参照して、前記関係元のサブエンティティについての前記関係先のコンテクスト付きサブエンティティに関する重みを算出し、
前記分割部は、
前記関係元のサブエンティティについての前記関係先のコンテクスト付きサブエンティティに関する重みを用いることにより、前記サブエンティティ群を前記複数のクラスタに分割することを特徴とする請求項１に記載の分割装置。
【請求項１０】
前記コンテクスト依存解析部は、
前記コンテクスト付きサブエンティティを関係元のサブエンティティとし、前記コンテクスト付きサブエンティティが有するコンテクストにより指定されるサブエンティティを関係先のサブエンティティとする、サブエンティティに関する対応情報を生成し、
前記算出部は、
前記コンテクスト依存解析部によって得られたサブエンティティに関する対応情報を参照して、前記関係元である前記コンテクスト付きサブエンティティについての前記関係先のサブエンティティに関する重みを算出し、
前記分割部は、
前記関係元である前記コンテクスト付きサブエンティティについての前記関係先のサブエンティティに関する重みを用いることにより、前記サブエンティティ群を前記複数のクラスタに分割することを特徴とする請求項９に記載の分割装置。
【請求項１１】
前記エンティティ群の各エンティティ内に出現する単語とその出現回数を前記ソースコードから抽出する単語抽出部と、
前記複数のクラスタの各クラスタに属するエンティティ内に出現する単語とその出現回数に基づいて、前記各クラスタ内での前記単語の特徴量を算出し、前記特徴量に基づいて、前記各クラスタ内に出現する単語を出力する特徴量算出部と、
を有することを特徴とする請求項１〜１０のいずれか一つに記載の分割装置。
【請求項１２】
コンピュータが、
ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、記憶装置に記憶されている前記ソフトウェアのソースコードから抽出し、
抽出した前記対応情報に基づき特定される前記関係先エンティティに対応する前記関係元エンティティとの入次数に応じて前記依存関係に関する重みを算出し、
算出した前記重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する、
処理を実行することを特徴とする分割方法。
【請求項１３】
コンピュータに、
ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、記憶装置に記憶されている前記ソフトウェアのソースコードから抽出し、
抽出した前記対応情報に基づき特定される前記関係先エンティティに対応する前記関係元エンティティとの入次数に応じて前記依存関係に関する重みを算出し、
算出した前記重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する、
処理を実行させるための分割プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分割装置、分割方法、および分割プログラムに関する。
【背景技術】
【０００２】
ソフトウェアを開発・改良・保守するためにはソフトウェアの理解が必要となる。そのため、ソフトウェアを理解が容易な程度に小規模な部分集合に分割する必要がある。ソフトウェアの分割についてより具体的に述べる。なお、ソフトウェアを構成する要素を、「エンティティ」と称す。たとえば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどは、エンティティに該当する。
【０００３】
また、呼び出し関係や継承関係、包含関係、データアクセス関係などの関係を、エンティティ間の「依存関係」と称す。ソフトウェアは、エンティティを頂点とし、エンティティ間の関係を有向辺（以下、単に「辺」と略す。）とする有向グラフ構造（以下、単に「グラフ」と略す。）により表現することができる。ソフトウェアの分割とは、グラフを部分グラフに分割することである。部分グラフには、エンティティの集合が含まれる。
【０００４】
ソフトウェアの理解以外の目的としたソフトウェア分割技術は従来から多くの提案がなされている（たとえば、下記特許文献１を参照。）。特許文献１は、メモリ空間にロードするソフトウェアのメモリ使用量を削減するために、ソフトウェアを細かい構成要素に分割し、必要なものだけをロードする技術を開示している。
【０００５】
また、分割のために必要な情報を作成する作業を省くために、ソフトウェアの分割を自動的に行う技術の提案もなされている（たとえば、下記特許文献２を参照。）。特許文献２は、複数のソフトウェアのモジュールを組み合わせて動作させるソフトウェアにおいて、メモリ空間にロードするソフトウェアのメモリ使用量の削減のため、ソフトウェアを複数のグループに分割する技術である。特許文献２は、モジュール間の依存関係の強度を呼び出し箇所の数で表し、その強度を抑えるようにソフトウェアを分割することで自動分割を実現する。すなわち、特許文献２の自動分割は、高い頻度の呼び出し関係のあるモジュールを分割せずにまとめることにより、メモリへのロードを効率化している。
【０００６】
また、一般的に、ソフトウェアの分割問題は、分割の目的によって望ましい分割が変化するため、特定の目的に対応した自動分割の手法は別の目的には適用できない。このように、分析目的によって望ましい分割が変わるために、分割過程に人が介入し分割がその人の目的の沿うように導いていく手法が開示されている（たとえば、下記非特許文献１，２を参照。）。
【０００７】
また、ソフトウェアの理解の助けとするためには、ソフトウェアの分割がソフトウェアの実現する機能やタスク、業務などに沿っている必要がある。ここでは、機能やタスク、業務のことを総称して「役割」と呼ぶ。ソフトウェアの設計は、そのソフトウェアが果たす役割を抽出し、整理し、細分化することで進められる。ソフトウェアの理解とは、その設計の過程を逆に進めることであるから、役割を抽出して分解することはソフトウェア理解の過程の枢要である。
【０００８】
分割されたエンティティの部分集合が役割に沿っていると言えるためには、下記（１），（２）の要件を満たす必要がある。
（１）部分集合が意味する役割を表すための本筋となる重要なエンティティとエンティティ間の依存関係とが、その部分集合に含まれること。
（２）ソフトウェアの本筋の理解の妨げとなる枝葉末節のエンティティやエンティティ間の依存関係が、その部分集合を形成する際に軽視されること。
【０００９】
上記（２）の『ソフトウェアの本筋の理解の妨げとなる枝葉末節のエンティティやエンティティ間の依存関係』を除外する技術として、たとえば、下記非特許文献３が開示されている。非特許文献３は、ソフトウェア分割ではなく実行トレースログを要約する技術である。非特許文献３は、ログ処理や例外処理のようなソフトウェアの随所に現れる機能を「ユーティリティ」と称し、ユーティリティの呼び出し関係を削除することで理解のためのノイズを減らしている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００３−３０８２１６号公報
【特許文献２】特開２００９−１３４３７９号公報
【非特許文献】
【００１１】
【非特許文献１】S. Ducasse and D. Pollet, "Software Architecture Reconstruction: A Process-Oriented Taxonomy", IEEE Transactions on Software Engineering, vol. 35, no. 4, pp. 573-591, 2009.
【非特許文献２】L. O'Brien, D. Smith, and G. Lewis, "Supporting Migration to Services using Software Architecture Reconstruction", 13th IEEE International Workshop on Software Technology and Engineering Practice (STEP'05), pp. 81-91, 2005.
【非特許文献３】A. Hamou-Lhadj, and T. Lethbridge, "Summarizing the Content of Large Traces to Facilitate the Understanding of the Behaviour of a Software System", 14th International Conference on Program Comprehension (ICPC'06), pp. 181-190, 2006.
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、特許文献１は、分割に必要な情報はすべて与えられていることを前提としている。すなわち、分割対象のソフトウェアに関する情報が明らかになっている必要がある。ソフトウェアを理解しようという目的の場合、すなわち、ソフトウェアに関する情報が明らかになっていない場合には、ソフトウェアに関する情報を作成する作業が必要となり、その作業量はソフトウェアの規模に応じて大きくなるという問題がある。
【００１３】
また、特許文献２では、たとえば、ログ処理や例外処理など使用頻度の高い一般的な処理は、ソフトウェアの随所から呼び出されることになる。そのため、使用頻度の高い一般的な処理は、分割されずに同じグループに収められることとなる。しかしながら、使用頻度の高い一般的な処理は、ソフトウェアの本筋を理解するためには必要は無く、かえって理解のためのノイズとなり障害となるという問題がある。そのため、使用頻度の高い一般的な処理は、同じグループに含めるべきではない。
【００１４】
また、非特許文献１，２では、人が介在することは分析対象の規模に応じてより多くの作業が必要になるという問題がある。また、非特許文献３では、ソフトウェア内のある機能を無視してよいかどうかを正確に判定することは難しいため、誤って理解に必要な呼び出しを削除してしまう場合があるという問題がある。
【００１５】
本発明は、ソフトウェアの分割精度の向上を図ることを目的とする。
【課題を解決するための手段】
【００１６】
本発明の一側面によれば、ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、記憶装置に記憶されている前記ソフトウェアのソースコードから抽出し、抽出された対応情報により特定される前記依存関係に関する重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する、処理を実行する分割装置、分割方法、および分割プログラムが提案される。
【発明の効果】
【００１７】
本発明の一側面によれば、ソフトウェアの分割精度の向上を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１８】
【図１】図１は、グラフ化されたソフトウェアの一例を示す説明図である。
【図２】図２は、依存関係の一例を示す説明図である。
【図３】図３は、実施の形態１にかかる分割装置のハードウェア構成例を示すブロック図である。
【図４】図４は、実施の形態１にかかる分割装置の機能的構成例を示すブロック図である。
【図５】図５は、ソフトウェアのグラフ表現例を示す説明図である。
【図６】図６は、図５に示したソフトウェアのソースコード例を示す説明図である。
【図７】図７は、図５に示したソフトウェアに関する関係グラフ情報の一例を示す説明図である。
【図８】図８は、本質度情報の一例を示す説明図である。
【図９】図９は、ある有向グラフの分割例を示す説明図である。
【図１０】図１０は、図７に示した関係グラフ情報と図８に示した本質度情報を用いた場合の隣接行列Ａを示す説明図である。
【図１１】図１１は、図７に示した関係グラフ情報と図８に示した本質度情報を用いた場合のエンティティごとに、ｋjINとｋiOUTとを関連付けたパラメータテーブルを示す説明図である。
【図１２】図１２は、図７に示した関係グラフ情報と図８に示した本質度情報を用いた場合の本質度を用いたクラスタリングの処理過程を示す説明図である。
【図１３】図１３は、図１２のクラスタリングに基づく分析結果の一例を示す説明図である。
【図１４】図１４は、図１２のクラスタリングに基づく分析結果の他の例を示す説明図である。
【図１５】図１５は、実施の形態１にかかる分割装置による分割処理手順例を示すフローチャートである。
【図１６】図１６は、図１５に示した関係抽出処理（ステップＳ１５０１）の詳細な処理手順例を示すフローチャートである。
【図１７】図１７は、図１５に示した本質度算出処理（ステップＳ１５０２）の詳細な処理手順例を示すフローチャートである。
【図１８】図１８は、図１５に示したクラスタリング処理（ステップＳ１５０３）の詳細な処理手順例を示すフローチャートである。
【図１９】図１９は、重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）の詳細な処理手順例を示すフローチャートである。
【図２０】図２０は、実施の形態２にかかる本質度算出部の詳細な機能的構成例を示すブロック図である。
【図２１】図２１は、本質度の補償例を示す説明図である。
【図２２】図２２は、メソッドレベルグラフとクラスレベルグラフの一例を示す説明図である。
【図２３】図２３は、クラス・メソッド情報の一例を示す説明図である。
【図２４】図２４は、メソッドレベルグラフ情報の一例を示す説明図である。
【図２５】図２５は、仮想パス解析例を示す説明図である。
【図２６】図２６は、コンテクスト依存情報の一例を示す説明図である。
【図２７】図２７は、コンテクスト依存解析例を示す説明図である。
【図２８】図２８は、実施の形態２にかかる関係抽出部による関係抽出処理手順例を示すフローチャートである。
【図２９】図２９は、実施の形態２にかかる本質度算出部による本質度算出処理手順例を示すフローチャートである。
【図３０】図３０は、図２９に示した補償処理部による補償処理（ステップＳ２９０４）の詳細な処理手順例を示すフローチャートである。
【図３１】図３１は、図２９に示したコンテクスト依存解析部によるコンテクスト依存解析処理（ステップＳ２９０５）の詳細な処理手順例を示すフローチャートである。
【図３２】図３２は、図２９に示したマルチレベル解析部によるマルチレベル解析処理（ステップＳ２９０６）の詳細な処理手順例を示すフローチャートである。
【図３３】図３３は、図２９に示した仮想パス解析部による仮想パス解析処理（ステップＳ２９０７）の詳細な処理手順例を示すフローチャートである。
【図３４】図３４は、実施の形態３にかかる分割装置の機能的構成例を示すブロック図である。
【図３５】図３５は、キーワードリストの一例を示す説明図である。
【図３６】図３６は、実施の形態３にかかる分割処理手順例を示すフローチャートである。
【図３７】図３７は、単語抽出部による単語抽出処理（ステップＳ３６０４）の詳細な処理手順例を示すフローチャートである。
【図３８】図３８は、特徴量算出部による特徴量算出処理（ステップＳ３６０５）の詳細な処理手順例を示すフローチャートである。
【発明を実施するための形態】
【００１９】
以下に添付図面を参照して、この発明にかかる分割装置、分割方法、および分割プログラムの実施の形態を詳細に説明する。本実施の形態にかかる分割装置、分割方法、および分割プログラムは、ソフトウェアをその構成要素となるエンティティの集合として扱い、ソフトウェアを理解が容易な程度の部分集合に分割することにより、ソフトウェアの構造を明らかにする。これにより、ソフトウェアの直感的かつ容易な理解を可能にし、適切な単位での管理を可能にする。本発明は、ソフトウェア分析やリバースエンジニアリングの技術に用いられる。
【００２０】
（実施の形態１）
図１は、グラフ化されたソフトウェアの一例を示す説明図である。図１中、□の図形は、ソフトウェアの構成要素であるエンティティを示している。また、エンティティ間の矢印は、依存関係を示している。矢印の始端が関係元エンティティ、矢印の終端（矢印の先）が関係先エンティティとする。たとえば、依存関係が呼び出し関係を示す場合、関係元エンティティが関係先エンティティを呼び出すことになる。
【００２１】
実施の形態１にかかる分割装置、分割方法、および分割プログラムでのソフトウェア分割は、以下の性質（１）〜（３）を有する。
（１）ソフトウェア分割は、エンティティの集合であるソフトウェアにおいて、ソフトウェアの処理の本筋となるエンティティや依存関係を重視してエンティティをグループ化することにより実行される。
（２）ソフトウェア分割は、ユーティリティのような理解の妨げとなるエンティティや依存関係を軽視し、必要ならば分割されたグループから外すように実行される。
（３）ただし、ソフトウェア分割は、一見軽視されるようなエンティティであっても、分割されたグループを特徴付けるようなエンティティならば、当該グループに包含させるように実行される。
【００２２】
このようにして、実施の形態１にかかる分割装置、分割方法、および分割プログラムは、図１に示したようなエンティティの集合であるソフトウェアを理解が容易な程度の部分集合に分割することになる。なお、ソフトウェアをグラフで表現し、当該グラフを部分グラフに分割したとき、部分グラフまたは部分グラフに属するエンティティの集合のことを、グループまたはクラスタと呼ぶ。グラフをクラスタに分割することをクラスタリングと呼ぶ。
【００２３】
＜依存関係の一例＞
図２は、依存関係の一例を示す説明図である。エンティティ間の依存関係において、関係元エンティティが役割を果たすためにその依存関係がどれだけ本質的かを示す度合いを「本質度」と称す。本質度は、依存関係ごとに与えられ、依存関係に対応する辺の重みとして用いられる。本例では、本質度は、たとえば、下記式（１）のように表現される。
【００２４】
【数１】
0005899946.tif 000002
【００２５】
上記式（１）において、左辺のＥ（Ａ，Ｂ）は、エンティティＡからエンティティＢへの依存関係の本質度を示している。右辺の分母のｄin（Ｂ）は、エンティティＢの入次数（Ｂが関係先エンティティとなる辺の数、または被依存関係数）を意味する。右辺はここでは式（１）の形態を用いているが、たとえばエンティティＢの相対サイズ値や予め与えた重要度数値など別の形態であってもよい。
【００２６】
図２の（ａ）は、本質度の一例を示している。エンティティＡ１，Ａ２において、エンティティＡ１は関係先エンティティであり、エンティティＡ２は関係元エンティティである。エンティティＡ１がエンティティＡ２のみから依存されるため、エンティティＡ２にとってエンティティＡ１との依存関係はより本質的であるとして高い値になる。その理由は、エンティティＡ２が役割を果たすためにエンティティＡ１が作成されている可能性が高く、エンティティＡ１はエンティティＡ２にとって本質的であるとみなせるからである。具体的には、たとえば、辺の数は１本（入次数＝１）であるため、エンティティＡ１にとってエンティティＡ２との依存関係がどれだけ本質的かを示す本質度は「１」である。
【００２７】
図２の（ｂ）は、関係元エンティティが複数存在する場合の本質度の一例を示している。エンティティＤ１〜Ｄ４は、関係元エンティティであり、エンティティＢは、エンティティＤ１〜Ｄ４に共通の関係先エンティティである。この場合、エンティティＤ１にとってエンティティＢとの依存関係は本質的ではないとして低い値となる。その理由は、エンティティＤ１が役割を果たすためにエンティティＢが作成されているという可能性は低く、エンティティＢはエンティティＤ１にとって本質的とは言い難いからである。エンティティＤ２〜Ｄ４についても同様である。具体的には、たとえば、エンティティＢを関係元エンティティとする辺の数は４本（入次数＝４）であるため、エンティティＤ１〜Ｄ４の各々にとってエンティティＢとの依存関係がどれだけ本質的かを示す本質度は「１／４」である。
【００２８】
図２の（ｃ）は、（ｂ）の場合において、エンティティＢをエンティティＤ１〜Ｄ４が属するグループＤに含めるか否かを示している。エンティティＤ１からエンティティＢへの本質度は１／４と低いが、エンティティＤ１〜Ｄ４からなるグループＤからエンティティＢへの本質度の合計は「１」となるため、高い値となる。一方、グループＥの各エンティティＥ１〜Ｅ３からエンティティＢへの本質度は、いずれも「０」であるため、グループＥからエンティティＢへの本質度の合計も「０」であり、グループＤに比べて低い値となる。この場合、エンティティＢは、グループＥよりもグループＤに包含させるべきであり、上記性質（３）を満たすことになる。
【００２９】
＜分割装置のハードウェア構成例＞
図３は、実施の形態１にかかる分割装置のハードウェア構成例を示すブロック図である。図３において、分割装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、磁気ディスクドライブ３０４と、磁気ディスク３０５と、光ディスクドライブ３０６と、光ディスク３０７と、ディスプレイ３０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３０９と、キーボード３１０と、マウス３１１と、スキャナ３１２と、プリンタ３１３と、を備えている。また、各構成部はバス３００によってそれぞれ接続されている。
【００３０】
ここで、ＣＰＵ３０１は、分割装置の全体の制御を司る。ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される。磁気ディスクドライブ３０４は、ＣＰＵ３０１の制御にしたがって磁気ディスク３０５に対するデータのリード／ライトを制御する。磁気ディスク３０５は、磁気ディスクドライブ３０４の制御で書き込まれたデータを記憶する。
【００３１】
光ディスクドライブ３０６は、ＣＰＵ３０１の制御にしたがって光ディスク３０７に対するデータのリード／ライトを制御する。光ディスク３０７は、光ディスクドライブ３０６の制御で書き込まれたデータを記憶したり、光ディスク３０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３２】
ディスプレイ３０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ３０８は、たとえば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３３】
インターフェース（以下、「Ｉ／Ｆ」と略する。）３０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３１４に接続され、このネットワーク３１４を介して他の装置に接続される。そして、Ｉ／Ｆ３０９は、ネットワーク３１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３４】
キーボード３１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス３１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３５】
スキャナ３１２は、画像を光学的に読み取り、分割装置内に画像データを取り込む。なお、スキャナ３１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ３１３は、画像データや文書データを印刷する。プリンタ３１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ３０６、光ディスク３０７、ディスプレイ３０８、キーボード３１０、マウス３１１、スキャナ３１２、およびプリンタ３１３の少なくともいずれか１つは、なくてもよい。
【００３６】
＜分割装置の機能的構成例＞
図４は、実施の形態１にかかる分割装置の機能的構成例を示すブロック図である。分割装置４００は、関係抽出部４０１と、本質度算出部４０２と、分割部４０３と、を有する。関係抽出部４０１、本質度算出部４０２、および分割部４０３は、具体的には、たとえば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、磁気ディスク３０５、光ディスク３０７などの記憶装置に記憶されたプログラムをＣＰＵ３０１に実行させることにより、または、Ｉ／Ｆ３０９により、その機能を実現する。
【００３７】
関係抽出部４０１は、ソフトウェア内のエンティティ間の依存関係を抽出する。具体的には、たとえば、関係抽出部４０１は、ソースコードＤＢ（Ｄａｔａ  Ｂａｓｅ）４５０からソフトウェアのソースコードを読み込んで、既存の構文解析技術および静的解析技術により、ソースコードを解析する。ソースコードＤＢ４５０は、ソフトウェアのソースコードを記憶する。ソースコードＤＢ４５０は、記憶装置により構成される。
【００３８】
図５は、ソフトウェアのグラフ表現例を示す説明図である。図５のソフトウェアは、説明の便宜上、エンティティの数を１６個としている。各エンティティは、たとえば、Ｊａｖａ（登録商標）言語のクラスを示しており、エンティティの番号は図６のクラスの番号に対応する。たとえば、エンティティ＃（＃は数字の意味）は、クラスＣ＃に対応する。
【００３９】
図６は、図５に示したソフトウェアのソースコード例を示す説明図である。図６では、Ｊａｖａ言語のソースコードを例に挙げて説明している。図６の（ａ）は、クラスＣ２がクラスＣ５，Ｃ９，Ｃ１４，Ｃ１を呼び出すことを示すソースコードである。
【００４０】
図４に戻り、関係抽出部４０１は、解析されたソースコードからエンティティを抽出する。たとえば、関係抽出部４０１は、図６の（ａ）のソースコードから、クラスＣ２を関係元エンティティとして抽出する。また、関係抽出部４０１は、図６の（ａ）のソースコード６０１から、クラスＣ２の呼び出し先となるクラスＣ５，Ｃ９，Ｃ１４，Ｃ１を、クラスＣ２の関係先エンティティとして抽出する。これにより、関係元エンティティの依存関係が抽出されることになる。図６の（ｂ）のソースコード６０２についても同様に、関係抽出部４０１は、クラスＣ５を関係元エンティティとして抽出し、クラスＣ１を関係先エンティティとして抽出する。
【００４１】
関係抽出部４０１は、抽出した関係元エンティティとその関係先エンティティとの組を、関係グラフ情報４１０のレコードとして格納する。たとえば、関係抽出部４０１は、図６の（ａ）の場合、｛２，５｝，｛２，９｝，｛２，１４｝，｛２，１｝を関係グラフ情報４１０に格納する。｛ａ，ｂ｝は、関係元エンティティの番号ａとその関係先エンティティの番号ｂとの組を示す。これにより、関係グラフ情報４１０が生成される。
【００４２】
図７は、図５に示したソフトウェアに関する関係グラフ情報４１０の一例を示す説明図である。関係グラフ情報４１０は、関係元エンティティとその関係先エンティティとを関連付けて記憶するテーブルである。関係グラフ情報４１０は記憶装置に記憶される。
【００４３】
本質度算出部４０２は、関係元エンティティからその関係先エンティティへの本質度を算出する。具体的には、たとえば、本質度算出部４０２は、上述した式（１）により算出する。
【００４４】
図８は、本質度情報４２０の一例を示す説明図である。図８では、図７の関係グラフ情報４１０との対応関係を示すために、関係グラフ情報４１０も示している。本質度情報４２０は記憶装置に記憶される。本質度情報４２０において、本質度は、一例として、関係先エンティティへの入次数の逆数で表現される。たとえば、１行目の例では、関係グラフ情報４１０の関係元エンティティがＣ２、関係先エンティティがＣ１である。関係先エンティティであるＣ１の入次数となる辺の数は１５本であるため、本質度は「１／１５」となる。なお、図８では、一例として、関係グラフ情報４１０の行ごとにポインタにより関連付けることにより、本質度情報４２０は、関係グラフ情報４１０とは別のテーブルとして保持されている。
【００４５】
分割部４０３は、本質度を用いてソフトウェアをクラスタリングする。分割部４０３は、本質度を用いてソフトウェアのグラフを部分グラフに分割するクラスタリングを実行し、ソフトウェアの分割結果を分析結果４３０として出力する。また、分割部４０３は、上述した性質（１）〜（３）を満たすために、クラスタ内の辺の本質度の合計がその期待値より大きくなるように（または、部分グラフに属さない辺の本質度の合計が小さくなるように）クラスタリングを行う。性質（１）〜（３）を満たせば、クラスタを特徴付ける（すなわち、そのクラスタへの合計本質度が高い）エンティティはクラスタ内に含まれることになる。
【００４６】
分割部４０３では、性質（１）〜（３）を満たすクラスタリングアルゴリズムとして、次に示す技術を拡張したものを用いる。
【００４７】
（参考文献） M. E. J. Newman (2004). "Fast algorithm for detecting community structure in networks". Physical Review E 69 (6): 066133.
【００４８】
上記参考文献は、「Ｎｅｗｍａｎのグラフクラスタリングアルゴリズム」または「モジュラリティ最大化アルゴリズム」と呼ばれるアルゴリズムを提案している文献である。当該アルゴリズムは、グラフのクラスタリングの良さを示す尺度であるモジュラリティ評価関数（モジュール性とも呼ばれる）を用い、モジュラリティ評価関数が最大となるクラスタリング（クラスタへの分割）を貪欲法にて探索する。
【００４９】
ただし、上記アルゴリズムは、モジュラリティ評価関数が「重み無し」「無向」グラフを対象にしたアルゴリズムであるため、そのままでは本実施の形態では利用できない。そこで本実施の形態では、「重み付き」「有向」グラフに利用できるように拡張したモジュラリティ評価関数ＱDWが下記式（２）で定義される。
【００５０】
【数２】
0005899946.tif 000003
【００５１】
上記式（２）において、Ａijは、グラフの隣接行列Ａの要素である。添え字のｉは関係元エンティティである頂点の番号、添え字のｊは関係先エンティティである頂点の番号を示す。隣接行列Ａの要素の値は辺の重みであり、非負であり、０より大きい場合は辺有り、０の場合は辺無しを意味する。有向グラフであるため、隣接行列Ａは非対称行列である。
【００５２】
また、ｋiOUTは、頂点ｉが関係元エンティティとなる辺の重みの合計である。具体的には、下記式（３）により表される。
【００５３】
ｋOUTi＝ΣjＡij・・・・・・・・・・（３）
【００５４】
また、ｋjINは、頂点ｊが関係先エンティティとなる辺の重みの合計である。具体的には、下記式（４）により表される。
【００５５】
ｋjIN＝ΣiＡij・・・・・・・・・・（４）
【００５６】
また、ｍは、辺の重み（要素Ａij）の合計であり、隣接行列Ａの要素Ａijの総和である。具体的には、下記式（５）により表される。
【００５７】
ｍ＝ΣiΣjＡij・・・・・・・・・・（５）
【００５８】
また、ｃiは、頂点ｉが属するクラスタを示す。すべての頂点はいずれかのクラスタに属するものとする。
【００５９】
δ（ｃi，ｃj）は、クロネッカーのデルタ関数である。すなわち、クラスタｃiとクラスタｃjが同じならばδ（ｃi，ｃj）＝１、異なるならδ（ｃi，ｃj）＝０となる。
【００６０】
モジュラリティ評価関数ＱDWの値域は［−１，１］となり、大きいほどよいクラスタリングであることを意味し、小さいほど悪いクラスタリングであることを意味する。ただし、実際の上限値と下限値はグラフに依存し、実際には上限値が１近くになることはめったに無い。
【００６１】
上記式（２）の意図を説明する。クロネッカーのデルタ関数δ（ｃi，ｃj）は、クラスタ内の辺のみを考慮しクラスタ外の辺を無視するための関数である。クロネッカーのデルタ関数δ（ｃi，ｃj）は、各クラスタ内にある辺についての式となる。すなわち、クラスタｃiとクラスタｃjが異なるならδ（ｃi，ｃj）＝０となるため、モジュラリティ評価関数ＱDWへの寄与は０となる。
【００６２】
隣接行列Ａijは頂点ｉから頂点ｊへの辺の重みである。頂点ｉから辺が出る重み付き確率の期待値はｋiOUT／ｍであり、頂点ｊへ辺が入る重み付き確率の期待値はｋjIN／ｍであるため、エンティティｉからエンティティｊへの辺の重みの期待値は、下記式（６）で表される。
【００６３】
ｍ・（ｋiOUT／ｍ）・（ｋjIN／ｍ）＝ｋiOUT・ｋjIN／ｍ・・・（６）
【００６４】
上記式（６）の右辺は式（２）の一部である。すなわち、式（２）のモジュラリティ評価関数ＱDWは、各クラスタに属する辺の本質度の合計とその期待値との差をクラスタについて合計したものを、値域が［１，−１］になるように正規化したものである。
【００６５】
より直観的な表現で表すと、モジュラリティ評価関数ＱDWは、クラスタ内の辺の本質度の合計がその期待値より大きい場合に高くなると言える。言い換えれば、クラスタ内の辺の本質度の密度が高い場合に高くなる、また、クラスタ外の辺の本質度の合計が少ない場合に高くなると言える。
【００６６】
図９は、ある有向グラフの分割例を示す説明図である。図９では、説明を単純化するため、６個の頂点からなる有向グラフを用いて説明する。なお、説明を単純化するため、すべての辺の重みは「１」である。分割例（１）は、グラフを全く分割しない場合でこのときＱDW＝０である。また、分割例（２）は、最適な分割を行った場合でＱDW＝０．３６７であり、直感的な分割と一致している。分割例（３）は最適ではないがそれに近い分割で、ＱDW＝０．１２２と最適値からの若干の悪化を示している。
【００６７】
分割例（４）と分割例（５）は敢えて非合理的な分割を行った例で、この場合、ＱDWは負値となり、数値の悪さと直感が一致している。分割例（６）は完全分割でこのとき、ＱDW＝−０．１６３となり、過度の分割がかえって悪い結果となることが数値として表れている。分割例（１）〜（６）から、直感とモジュラリティ評価関数ＱDWとが整合することがわかる。
【００６８】
図１０は、図７に示した関係グラフ情報４１０と図８に示した本質度情報４２０を用いた場合の隣接行列Ａを示す説明図である。隣接行列Ａの要素Ａijは、関係元エンティティである頂点ｉから関係先エンティティである頂点ｊへの本質度を示している。
【００６９】
図１１は、図７に示した関係グラフ情報４１０と図８に示した本質度情報４２０を用いた場合のエンティティごとに、ｋINjとｋOUTiとを関連付けたパラメータテーブルを示す説明図である。パラメータテーブル１１００は、モジュラリティ評価関数ＱDWの計算途中で生成されるテーブルである。なお、本例では、ｍ＝１０となる。
【００７０】
本質度を用いたクラスタリングの処理過程について説明する。まず、本質度を用いたクラスタリングの処理過程で用いる記号の定義と表記法について説明する。グラフのすべての頂点の集合をＶとする。頂点はエンティティを示す。頂点は１以上の連番の整数で表し、頂点数をｎとする。すなわち、Ｖ＝｛１，２，…，ｎ｝である。Ｖのある分割をＤで表す。Ｄは、空集合でない互いに素なＶの部分集合Ｓiを要素とする集合であり、Ｄ＝｛Ｓ1，Ｓ2，…，Ｓ|D|｝と表す。｜Ｄ｜は分割Ｄの要素数を意味する。
【００７１】
このとき、集合Ｖは、下記式（７）によって表される。
【００７２】
Ｓ1∪Ｓ2∪…∪Ｓ|D|＝Ｖ・・・・・（７）
【００７３】
頂点ｉがＳxの要素である場合、頂点ｉのクラスタｃiはｘと求まる。すなわち、分割Ｄを定めるとモジュラリティ評価関数ＱDWの値が定まる。この場合、ＱDW（Ｄ）と表す。また、分割Ｄ内の異なる２つの要素Ｓi，Ｓjを併合させたＤ［ｉ，ｊ］を下記式（８）で定義する。
【００７４】
Ｄ［ｉ，ｊ］＝（Ｄ−｛Ｓi｝−｛Ｓj｝）∪｛Ｓi∪Ｓj｝・・・・・・（８）
【００７５】
ここで、式（８）中、Ａ−Ｂは集合Ａから集合Ｂの要素を除いた差集合を意味する。ある状態ｋのときの分割Ｄを、Ｄ(k)＝｛Ｓ(k)1，Ｓ(k)2，…，Ｓ(k)|D(k)|｝とする。たとえば、Ｄ＝｛Ｓ1，Ｓ2，Ｓ3，Ｓ4｝において、部分集合Ｓ1，Ｓ2を併合する場合、併合後の分割Ｄ［ｉ，ｊ］は、Ｄ［ｉ，ｊ］＝Ｄ［１，２］＝｛Ｓ1∪Ｓ2，Ｓ3，Ｓ4｝となる。Ｓ1∪Ｓ2は、部分集合Ｓ1，Ｓ2の和集合である。
【００７６】
図１２は、図７に示した関係グラフ情報４１０と図８に示した本質度情報４２０を用いた場合の本質度を用いたクラスタリングの処理過程を示す説明図である。なお、状態ｋでの分割Ｄのモジュラリティ評価関数ＱDWをＱDW（Ｄ(k)）とする。
【００７７】
（Ａ）は、初期状態（ｋ＝０）の分割Ｄ(0)を示している。初期状態では、１つの頂点が１つのクラスタとなる。この場合のモジュラリティ評価関数ＱDW（Ｄ(0)）は、ＱDW（Ｄ(0)）＝−０．０４５である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝１）とする。この場合、部分集合｛６｝と｛１４｝の併合が、ＱDWが最も高くなる併合である。
【００７８】
（Ｂ）は、（Ａ）の次状態（ｋ＝１）の分割Ｄ(1)を示している。この場合のモジュラリティ評価関数ＱDW（Ｄ(1)）は、ＱDW（Ｄ(1)）＝０．０７５である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝２）とする。この場合、部分集合｛６，１４｝と｛１１｝の併合がＱDWが最も高くなる併合である。
【００７９】
（Ｃ）は、（Ｂ）の次状態（ｋ＝２）の分割Ｄ(2)を示している。この場合のモジュラリティ評価関数ＱDW（Ｄ(2)）は、ＱDW（Ｄ(2)）＝０．１３８である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝３）とする。このような処理が繰り返し行われる。
【００８０】
（Ｄ）は、初期状態から１３回反復された場合のｋ＝１３のときの状態の分割Ｄ(13)を示している。ＱDW（Ｄ(13)）＝０．４８１である。この状態から、総当りで２つの部分集合が併合される。ｋ＝１３では、部分集合｛２，５，６，１１，１４｝と｛１，７，９，１０，１５，１６｝との併合、部分集合｛２，５，６，１１，１４｝と｛３，４，８，１２，１３｝との併合、部分集合｛１，７，９，１０，１５，１６｝と｛３，４，８，１２，１３｝との併合がある。いずれの併合も、ＱDW（Ｄ(13)）＝０．４８１を下回るため、分割Ｄ(13)でクラスタリングが終了する。これにより、ソフトウェアは、３個の部分集合｛２，５，６，１１，１４｝，｛１，７，９，１０，１５，１６｝，｛３，４，８，１２，１３｝に分割されたことになる。
【００８１】
図１３は、図１２のクラスタリングに基づく分析結果４３０の一例を示す説明図である。図１２では、３個の部分集合に分割されているため、部分集合｛２，５，６，１１，１４｝はクラスタ番号：１、部分集合｛１，７，９，１０，１５，１６｝にはクラスタ番号：２、部分集合｛３，４，８，１２，１３｝にはクラスタ番号：３が割り当てられている。これにより、たとえば、１行目では、頂点１はクラスタ２に属していることがわかる。なお、分析結果４３０は、図１１のような表データに限らず、図１０に示した併合過程を木構造表現したデータでもよく、また、関係グラフ情報４１０と本質度情報４２０が付加されていてもよい。
【００８２】
図１４は、図１２のクラスタリングに基づく分析結果の他の例を示す説明図である。
図１４のグラフは、図１３の分析結果４３０による自動分割に従って整理を行った図５のグラフと同一論理構造のグラフである。図１４において、太い破線の囲みがソフトウェアの分割である。矢印が、太い直線、中間の点線、細い一点鎖線の３種の線で描かれているが、依存関係を本質度の強中弱で分別したものである。図１４のグラフを見ることにより、ユーザは、ソフトウェアの構造が容易に見て取れることがわかる。また、ユーザは、得られた３つの分割が合理的であることもわかる。このように、本実施の形態によれば、上述した性質（１）〜（３）を満たすソフトウェアの分析が実現できる。
【００８３】
＜分割処理手順例＞
図１５は、実施の形態１にかかる分割装置４００による分割処理手順例を示すフローチャートである。分割装置４００は、関係抽出部４０１による関係抽出処理（ステップＳ１５０１）、本質度算出部４０２による本質度算出処理（ステップＳ１５０２）、分割部４０３によるクラスタリング処理（ステップＳ１５０３）を実行する。これにより、図１４に示したような分析結果４３０が得られることになる。
【００８４】
図１６は、図１５に示した関係抽出処理（ステップＳ１５０１）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、ソフトウェアのソースコードをソースコードＤＢ４５０から読み込む（ステップＳ１６０１）。つぎに、分割装置４００は、読み込んだソースコードを構文解析技術および静的解析技術を用いて解析する（ステップＳ１６０２）。そして、分割装置４００は、解析されたソースコードからエンティティを抽出するとともに（ステップＳ１６０３）、エンティティ間の依存関係を抽出する（ステップＳ１６０４）。
【００８５】
このあと、分割装置４００は、抽出により得られた関係元エンティティと関係先エンティティの組を関係グラフ情報４１０のレコードとして格納して（ステップＳ１６０５）、関係抽出処理（ステップＳ１５０１）を終了する。これにより、関係グラフ情報４１０が生成される。
【００８６】
図１７は、図１５に示した本質度算出処理（ステップＳ１５０２）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、関係グラフ情報４１０を読み込み（ステップＳ１７０１）、未選択の関係先エンティティがあるか否かを判断する（ステップＳ１７０２）。未選択の関係先エンティティがある場合（ステップＳ１７０２：Ｙｅｓ）、分割装置４００は、未選択の関係先エンティティを１つ選択する（ステップＳ１７０３）。
【００８７】
そして、分割装置４００は、式（１）を用いて、選択エンティティの辺ごとに、本質度を算出する（ステップＳ１７０４）。そして、分割装置４００は、辺ごとに算出された本質度を、本質度情報４２０に格納して（ステップＳ１７０５）、ステップＳ１７０２に戻る。ステップＳ１７０２において、分割装置４００は、未選択の関係先エンティティがないと判断された場合（ステップＳ１７０２：Ｎｏ）、本質度算出処理（ステップＳ１５０２）を終了する。これにより、本質度情報４２０が生成される。
【００８８】
図１８は、図１５に示したクラスタリング処理（ステップＳ１５０３）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、関係グラフ情報４１０および本質度情報４２０を読み込み（ステップＳ１８０１）、隣接行列Ａを生成する（ステップＳ１８０２）。また、分割装置４００は、隣接行列Ａの要素Ａｉｊである辺の重みを合計することにより、モジュラリティ評価関数ＱDWのパラメータｍの値を算出する（ステップＳ１８０３）。また、分割装置４００は、モジュラリティ評価関数ＱDWのパラメータｋiOUT，ｋjIN＝も算出する（ステップＳ１８０４）。
【００８９】
このあと、分割装置４００は、重み付き有向モジュラリティ最大化処理を実行する（ステップＳ１８０５）。重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）では、分割装置４００は、モジュラリティ評価関数ＱDWを用いてモジュラリティ評価関数ＱDWの値が最大となるように部分集合を併合していく。重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）の詳細は図１９で説明する。
【００９０】
そして、分割装置４００は、重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）で得られた分割結果を、分析結果４３０として出力する（ステップＳ１８０６）。たとえば、分割装置４００は、図１４に示したような分析結果４３０をディスプレイ３０８に表示したり、プリンタ３１３に印刷出力したり、他の装置に送信したり、分割装置４００内の記憶装置に格納したりする。これにより、クラスタリング処理（ステップＳ１５０３）を終了する。
【００９１】
図１９は、重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、状態ｋをｋ＝０に設定し、分割Ｄ(k)＝Ｄ(0)＝｛Ｓ(0)1，Ｓ(0)2，…，Ｓ(0)n｝を設定する（ステップＳ１９０１）。つぎに、分割装置４００は、｜Ｄ(k)｜＝１であるか否かを判断する（ステップＳ１９０２）。
【００９２】
｜Ｄ(k)｜＝１でない場合（ステップＳ１９０２：Ｎｏ）、分割装置４００は、分割Ｄ(k)に対し、モジュラリティ評価関数ＱDWの値が最大となるｉとｊの組を求め、そのときの分割Ｄ(k)［ｉ，ｊ］をＤ(k+1)とする（ステップＳ１９０３）。そして、分割装置４００は、ＱDW（Ｄ(k)）とＱDW（Ｄ(k+1)）とを比較する（ステップＳ１９０４）。そして、ＱDW（Ｄ(k+1)）＞ＱDW（Ｄ(k)）の場合（ステップＳ１９０４：Ｙｅｓ）、まだ、ＱDWが増加できる余地があるとして、分割装置４００は、ｋをインクリメントして（ステップＳ１９０５）、ステップＳ１９０２に戻る。図１２に示した内容が、ステップＳ１９０２〜Ｓ１９０５のループに相当する。
【００９３】
そして、ステップＳ１９０２において、｜Ｄ(k)｜＝１である場合（ステップＳ１９０２：Ｙｅｓ）、これ以上分割する必要がないため、ステップＳ１９０６に移行する。また、ステップＳ１９０４において、ＱDW（Ｄ(k+1)）＞ＱDW（Ｄ(k)）でない場合（ステップＳ１９０４：Ｎｏ）、ＱDWが増加できる余地がないとして、ステップＳ１９０６に移行する。
【００９４】
ステップＳ１９０６では、分割装置４００は、分割Ｄ(k)による分割処理をおこなう（ステップＳ１９０６）。たとえば、分割装置４００は、分割Ｄ(k)を用いて図１３や図１４に示した分析結果４３０を生成する。これにより、重み付き有向モジュラリティ最大化処理（ステップＳ１８０５）を終了する。
【００９５】
このように、実施の形態１によれば、ソフトウェアをその構成要素となるエンティティの集合として扱い、ソフトウェアを理解が容易な程度の部分集合に分割することができ、分割精度の向上を図ることができる。したがって、ユーザにとっては、ソフトウェアの構造が直感的かつ容易に理解が可能となる。
【００９６】
（実施の形態２）
つぎに、実施の形態２について説明する。実施の形態２は、実施の形態１で説明した本質度を、「本質度」がより実践に即した内容として定義する。具体的には、実施の形態２では、「本質度の補償」、「マルチレベル解析」、「仮想パス解析」、および「コンテクスト依存解析」の各機能が、実施の形態１の本質度算出部４０２に追加される。
【００９７】
＜本質度算出部４０２の機能的構成例＞
図２０は、実施の形態２にかかる本質度算出部４０２の詳細な機能的構成例を示すブロック図である。本質度算出部４０２は、基本解析部２００１と、補償処理部２００２と、マルチレベル解析部２００３と、仮想パス解析部２００４と、コンテクスト依存解析部２００５と、を有する。また、実施の形態２では、関係抽出部４０１は、関係グラフ情報４１０だけではなく、クラス・メソッド情報２０１１、メソッドレベルグラフ情報２０１２、コンテクスト依存情報２０１３を、本質度算出部４０２に与える。また、実施の形態２では、補償処理部２００２、マルチレベル解析部２００３、仮想パス解析部２００４、およびコンテクスト依存解析部２００５のうち少なくともいずれか１つ備わっていればよい。
【００９８】
基本解析部２００１、補償処理部２００２、マルチレベル解析部２００３、仮想パス解析部２００４、コンテクスト依存解析部２００５は、具体的には、たとえば、図１３に示したＲＯＭ３０２、ＲＡＭ３０３、磁気ディスク３０５、光ディスク３０７などの記憶装置に記憶されたプログラムをＣＰＵ３０１に実行させることにより、または、Ｉ／Ｆ３０９により、その機能を実現する。以下、図２０について詳細に説明する。
【００９９】
基本解析部２００１は、実施の形態１の本質度算出部４０２の機能そのものである。したがって、基本解析部２００１は、式（１）を用いて各辺の本質度を算出する。また、基本解析部２００１は、後述するように、メソッドのようなサブエンティティについても、エンティティと同様に本質度を算出することができる。
【０１００】
補償処理部２００２は、エンティティ群の中のあるエンティティが複数のエンティティを関係先とする依存関係を有する場合、あるエンティティと複数のエンティティの各々との依存関係に関する本質度の合計に基づいて、あるエンティティについての複数のエンティティの各々に関する本質度を補正する。具体的には、たとえば、関係元エンティティが複数のエンティティに関係する場合、何れかのエンティティは自エンティティにとって本質的である可能性がある。このことを仮定すると、関係元エンティティからの依存関係の本質度の合計が低い場合、補償する必要がある。
【０１０１】
図２１は、本質度の補償例を示す説明図である。図２１において、エンティティＡは関係元エンティティであり、エンティティＢ，Ｃ，Ｄ，Ｆ，Ｇは、それぞれエンティティＡの関係先エンティティである。
【０１０２】
ここで、Ｅ’（Ａ，Ｘ）を補償前の本質度とする。Ｘは関係先エンティティの総称である。図２１の場合は、Ｘ＝Ｂ，Ｃ，Ｄ，Ｆ，またはＧとなる。Ｅ’（Ａ，Ｘ）は、補償前においてエンティティＡからエンティティＸへの依存関係の本質度を示している。エンティティＡに関する補償は以下の手順で行う。
【０１０３】
（１）エンティティＡが関係元となるすべての依存関係の関係先エンティティへの本質度の合計Ｔ＝ΣXＥ’（Ａ，Ｘ）を求める。図２１の例では、エンティティＡからエンティ
ティＢ，Ｃ，Ｄ，Ｆ，Ｇへの各本質度を合計することにより、本質度の合計Ｔが求まる。
【０１０４】
（２）Ｔ＜１の場合、補償された本質度Ｅ（Ａ，Ｘ）を、下記式（９）により求める。
【０１０５】
Ｅ（Ａ，Ｘ）＝Ｅ’（Ａ，Ｘ）／Ｔ・・・（９）
【０１０６】
上記式（９）はＴ＜１の場合に適用されるため、補償後の本質度Ｅ（Ａ，Ｘ）は、補償前の本質度Ｅ’（Ａ，Ｘ）よりも高くなる。一方、Ｔ≧１の場合、補償前の本質度Ｅ’（Ａ，Ｘ）を、補償された本質度Ｅ（Ａ，Ｘ）にする。すなわち、補償前後で本質度は変わらない。このような補償は、関係元エンティティごとに実行される。補償後の本質度は、図８に示した本質度情報４２０として、補償前の本質度の代わりに格納される。これにより、分割部４０３は、補償処理部２００２で得られた補償後の本質度を用いてクラスタリング処理を実行することができる。
【０１０７】
つぎに、マルチレベル解析部２００３について説明する。マルチレベル解析部２００３は、クラス間の関係を分析する際に、より詳細なメソッド間の関係を用いて解析を行い、それを抽象度レベルが上のクラス間の関係に要約する。これにより、より高精度な分析が可能な本質度を求めることができる。
【０１０８】
ここで、ソフトウェアに含まれているクラスをエンティティとしたグラフを、クラスレベルグラフと呼ぶ。また、クラスに含まれているメソッドをエンティティとしたグラフをメソッドレベルグラフと呼ぶ。メソッドはクラスに属する。すなわち、クラスをエンティティとする立場ではメソッドはその構成要素となるサブエンティティである。
【０１０９】
図２２は、メソッドレベルグラフとクラスレベルグラフの一例を示す説明図である。メソッドレベルグラフにおいて、クラスＡはメソッドＡ．ａ，Ａ．ｂを含む。クラスＢはメソッドＢ．ｃ，Ｂ．ｄ，Ｂ．ｅを含む。クラスＣはメソッドＣ．ｆ，Ｃ．ｇを含む。クラスとメソッドとの関係は、クラス・メソッド情報で保持されている。
【０１１０】
図２３は、クラス・メソッド情報２０１１の一例を示す説明図である。クラス・メソッド情報２０１１は、記憶装置に格納されており、クラスとそのクラスに属するメソッドとが対応付けられたテーブルである。また、メソッドレベルグラフ内の矢印は、実施の形態１と同様、依存関係を示している。たとえば、メソッドＡ．ａがメソッドＢ．ｃの関係元エンティティであり、メソッドＢ．ｃがメソッドＡ．ａの関係先エンティティである。クラス・メソッド情報２０１１は、関係抽出部４０１により抽出される。メソッド間の関係は、メソッドレベルグラフ情報２０１２により保持される。
【０１１１】
図２４は、メソッドレベルグラフ情報２０１２の一例を示す説明図である。メソッドレベルグラフ情報２０１２は、記憶装置に記憶される。メソッドレベルグラフ情報２０１２は、関係元メソッドとその関係先メソッドとが対応付けて記憶されている。図２２に戻り、クラスＢのメソッドＢ．ｃは、クラスＡのメソッドＡ．ａとクラスＣのメソッドＣ．ｆを関係元エンティティとしている。したがって、メソッドＡ．ａからメソッドＢ．ｃへの本質度Ｅ（Ａ．ａ，Ｂ．ｃ）は、Ｅ（Ａ．ａ，Ｂ．ｃ）＝１／２であり、同様に、メソッドＣ．ｆからメソッドＢ．ｃへの本質度Ｅ（Ｃ．ｆ，Ｂ．ｃ）もＥ（Ｃ．ｆ，Ｂ．ｃ）＝１／２である。
【０１１２】
また、クラスＢのメソッドＢ．ｄは、クラスＣのメソッドＣ．ｆのみを関係元エンティティとしている。したがって、メソッドＣ．ｆからメソッドＢ．ｄへの本質度Ｅ（Ｃ．ｆ，Ｂ．ｄ）はＥ（Ｃ．ｆ，Ｂ．ｄ）＝１である。また、クラスＢのメソッドＢ．ｅは、クラスＡのメソッドＡ．ｂとクラスＣのメソッドＣ．ｇを関係元エンティティとしている。したがって、メソッドＡ．ｂからメソッドＢ．ｅへの本質度Ｅ（Ａ．ｂ，Ｂ．ｅ）はＥ（Ａ．ｂ，Ｂ．ｅ）＝１／２であり、同様に、メソッドＣ．ｇからメソッドＢ．ｅへの本質度Ｅ（Ｃ．ｇ，Ｂ．ｅ）もＥ（Ｃ．ｇ，Ｂ．ｅ）＝１／２である。メソッドレベルグラフ情報２０１２は、関係抽出部４０１により抽出される。
【０１１３】
マルチレベル解析部２００３は、メソッドレベルグラフの同一クラスに属するメソッドをグループ化することにより、クラスレベルグラフにする。すなわち、クラスレベルグラフはメソッドレベルグラフの抽象度のレベルを上げたグラフとなる。抽象度を上げた場合、メソッドレベルでの本質度もクラスレベルにグループ化される。
【０１１４】
具体的には、下記式（１０）により、クラスレベルでの本質度Ｅ（Ａ，Ｂ）が求められる。
【０１１５】
【数３】
0005899946.tif 000004
【０１１６】
上記式（１０）において、ｘｄin（ｍi）は、あるメソッドｍiを呼び出す、別のクラスに属するメソッドの数である。ｉはメソッドを識別する番号である。ｍｘ（Ｂ）は、あるクラスＢに含まれる、別のクラスから呼ばれるメソッドの数である。また、あるクラスＡに属するメソッドがクラスＢに属するメソッドを呼び出す場合、呼び出されるクラスＢに属するメソッドの集合をＭABで表し、ＭAB＝｛ｍ1，ｍ2，…，ｍi，…，ｍn｝で表す。ｎは集合の要素の数でｎ≧１である。クラスＡに属するメソッドがクラスＢに属するメソッドを呼び出さない場合にはＥ（Ａ，Ｂ）＝０とする。
【０１１７】
図２２の例では、クラスレベルグラフでのクラスＡからクラスＢへの本質度Ｅ（Ａ，Ｂ）の計算は以下の通りとなる。クラスＢには、クラスＡ，Ｃから呼び出されるメソッドが３個あるため、ｍｘ（Ｂ）＝３となる。クラスＢのメソッドＢ．ｃは、クラスＡのメソッドＡ．ａとクラスＣのメソッドＣ．ｆの２個のメソッドから呼び出されるため、ｘｄin（Ｂ．ｃ）＝２である。同様に、ｘｄin（Ｂ．ｄ）＝１、ｘｄin（Ｂ．ｅ）＝２となる。また、呼び出されるクラスＢに属するメソッドの集合ＭABは、ＭAB＝｛Ｂ．ｃ，Ｂ．ｅ｝である。また、集合ＭABの要素数ｎはｎ＝２である。
【０１１８】
したがって、ｍｘ（Ｂ）＝３、ｘｄin（Ｂ．ｃ）＝２、ｘｄin（Ｂ．ｄ）＝１、ｘｄin（Ｂ．ｅ）＝２、ｎ＝２を上記式（１０）に与えることにより、図２２のクラスレベルグラフでのクラスＡからクラスＢへの本質度Ｅ（Ａ，Ｂ）は、Ｅ（Ａ，Ｂ）＝１／（２×３）＋１／（２×３）＝１／３となる。同様に、図２２のクラスレベルグラフでのクラスＣからクラスＢへの本質度Ｅ（Ｃ，Ｂ）は、Ｅ（Ｃ，Ｂ）＝１／（２×３）＋１／（１×３）＋１／（２×３）＝２／３となる。
【０１１９】
なお、参考までに、図２２のクラスレベルグラフについて、実施の形態１で本質度Ｅ（Ａ，Ｂ），Ｅ（Ｃ，Ｂ）を求めると、Ｅ（Ａ，Ｂ）＝Ｅ（Ｃ，Ｂ）＝１／２になり、上述したＥ（Ａ，Ｂ）＝１／３，Ｅ（Ｃ，Ｂ）＝２／３とは異なる。すなわち、クラスＢとクラスＣの結び付きがクラスＡとクラスＢの結び付きより強いことが、メソッドレベルまで解析すると判ることを示している。マルチレベル解析部２００３で得られた本質度Ｅ（Ａ，Ｂ）＝１／３，Ｅ（Ｃ，Ｂ）＝２／３は、図８に示した本質度情報４２０に格納される。これにより、分割部４０３は、マルチレベル解析部２００３で得られた本質度を用いてクラスタリング処理を実行することができる。
【０１２０】
このように、マルチレベル解析部２００３は、クラス間の関係を分析する際に、より詳細なメソッド間の関係情報を用いて解析を行い、それを抽象度レベルが上のクラス間関係に要約するため、より高精度な分析が可能な本質度を求めることができる。
【０１２１】
なお、マルチレベル解析部２００３は、関係グラフ情報４１０において、マルチレベル解析された関係元エンティティおよび関係先エンティティのレコードに、マルチレベル解析済みであることを識別するフラグを追加することとしてもよい。これにより、仮想パス解析部２００４は、どのレコードがマルチレベル解析されたかを、関係グラフ情報４１０を参照することで判別することができる。
【０１２２】
つぎに、仮想パス解析部２００４について説明する。仮想パス解析部２００４は、マルチレベル解析部２００３で要約する際に失われるメソッドレベルグラフの情報のうち重要な情報を、「仮想パス」を用いて表現することで再生する。ここで、隣接しない二つのエンティティの間の経路について、当該経路上の複数の辺について辺の本質度をすべて乗じた値を「累積本質度」と呼ぶ。
【０１２３】
図２５は、仮想パス解析例を示す説明図である。図２５において、（Ａ）はメソッドレベルグラフであり、（Ｂ）は、（Ａ）のメソッドレベルグラフをマルチレベル解析部２００３で要約したクラスレベルグラフである。クラスレベルグラフの各本質度Ｅ（Ａ，Ｘ），Ｅ（Ｂ，Ｘ），Ｅ（Ｃ，Ｘ），Ｅ（Ｘ，Ｄ），Ｅ（Ｘ，Ｅ），Ｅ（Ｘ，Ｆ）は、上述したマルチレベル解析部２００３で求められる。
【０１２４】
クラスレベルグラフにおいて、クラスＣからクラスＦへの累積本質度はＥ（Ｃ，Ｘ）×Ｅ（Ｘ，Ｆ）＝１／３となる。これに対し、メソッドレベルグラフで見ると、メソッドＦ．ｆの呼び出しは常にメソッドＣ．ｃから行われることがわかり、メソッドＦ．ｆからメソッドＣ．ｃの累積本質度は、Ｅ（Ｃ．ｃ，Ｘ．ｚ）×Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１となる。メソッドレベルで解析すると「１」である累積本質度が、クラスレベルでは「１／３」になるため、クラスレベルへ抽象化したことで情報が失われていることがわかる。そこで、失われた情報を補償するために、仮想的にクラスＣからクラスＦへ辺を追加する。追加された辺を「仮想パス」と呼ぶ。また、仮想パスを経由した本質度を「仮想本質度」と定義する。
【０１２５】
クラスＡからクラスＢへの仮想本質度Ｅｖ（Ａ，Ｂ）は、メソッドレベルグラフにおいて、クラスＡに属するメソッドからクラスＢに属するメソッドへのすべての組み合わせの累積本質度の平均と定義する。具体的には、仮想本質度Ｅｖ（Ａ，Ｂ）が、クラスＡからクラスＢへのクラスレベルグラフにおける累積本質度より大きい場合、クラスレベルグラフにクラスＡからクラスＢへの辺を仮想パスとして追加する。そして、追加後の本質度をＥｖ（Ａ，Ｂ）の値とする。
【０１２６】
上述したように、メソッドレベルグラフにおいて、本質度Ｅ（Ｃ．ｃ，Ｘ．ｚ）＝１、Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１であるため、メソッドＣ．ｃからメソッドＦ．ｆへの累積本質度は、Ｅ（Ｃ．ｃ，Ｘ．ｚ）×Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１×１＝１となる。したがって、仮想本質度Ｅｖ（Ｃ，Ｆ）は、Ｅｖ（Ｃ，Ｆ）＝（メソッドＣ．ｃからメソッドＦ．ｆへの累積本質度）／１＝１／１＝１となる。クラスＣに属するメソッドからクラスＦに属するメソッドの組み合わせは１つだけなので、分母が「１」となる。
【０１２７】
仮想本質度Ｅｖ（Ｃ，Ｆ）は、クラスＣからクラスＦへの累積本質度１／３より大きいため、図２５に示すように、クラスＣからクラスＦへ「仮想パス」として辺が加えられる。そして、追加された辺の本質度はＥｖ（Ｃ，Ｆ）＝１とする。仮想パス解析部２００４で得られた仮想パスは、関係グラフ情報４１０に格納される。また、仮想パス解析部２００４で得られた仮想本質度は、本質度情報４２０に格納される。たとえば、図２５の例では、関係元エンティティをクラスＣ、関係先エンティティをクラスＦとするレコードが関係グラフ情報４１０に追加される。また、当該レコードに対応して、本質度Ｅｖ（Ｃ，Ｆ）＝１が本質度情報４２０に追加される。これにより、分割部４０３は、仮想パス解析部２００４で得られた本質度を用いてクラスタリング処理を実行することができる。
【０１２８】
このような仮想パス解析部２００４により、マルチレベル解析部２００３で要約する際に失われたメソッドレベルグラフの情報を、「仮想パス」を用いて表現することで再生することができる。したがって、本質度の高精度化を図ることができる。
【０１２９】
つぎに、コンテクスト依存解析部２００５について説明する。本質度は、メソッドの引数によって条件分岐する呼び出しがあるような場合に望ましい値にならないことがある。コンテクスト依存解析部２００５は、呼び出し元からのコンテクスト情報を付加することで条件分岐がある場合でも望ましい本質度を求められるようにする処理である。
【０１３０】
ここで、メソッドの引数や呼び出し先など、条件分岐先を決定する情報をコンテクストと呼ぶ。コンテクストに依存して関係元と関係先の依存関係がどのように定まるかを示す情報が、コンテクスト依存情報２０１３である。コンテクスト依存情報２０１３は、関係グラフ情報４１０に含まれる。なお、メソッドレベルグラフがある場合にはメソッドレベルグラフが適用され、メソッドグラフレベルが無い場合はクラスレベルグラフが適用される。どちらの場合でも同じ処理となる。
【０１３１】
図２６は、コンテクスト依存情報２０１３の一例を示す説明図である。コンテクスト依存情報２０１３は、記憶装置に記憶される。コンテクスト依存情報２０１３は、関係元メソッドとその関係先メソッドとコンテクストとが対応付けて記憶されている。
【０１３２】
図２７は、コンテクスト依存解析例を示す説明図である。図２７では、メソッドレベルグラフを例に挙げて説明する。図２７において、（Ａ）はメソッドレベルグラフであり、（Ｂ）は、（Ａ）のメソッドレベルグラフについてコンテクスト解決後のメソッドレベルグラフである。図２７において、メソッドＸ．ｘは、与えられた引数によって内部で条件分岐し、どのメソッドを呼び出すかを決定する。ここでは単純に、引数が“Ｄ．ｄ”ならメソッドＤ．ｄが、“Ｅ．ｅ”ならメソッドＥ．ｅが、“Ｆ．ｆ”ならメソッドＦ．ｆが呼ばれるものとする。
【０１３３】
コンテクスト依存解析部２００５は、コンテクストが付加された関係先をそれぞれ関係先とコンテクストとの二つ組として新たに独立のエンティティとして扱い、グラフ上の頂点を分割することで、コンテクストを解決する。たとえば、図２７の（Ａ）のメソッドレベルグラフにおいて、コンテクスト依存解析部２００５は、図２６のコンテクスト依存情報２０１３を参照し、関係先メソッドＸ．ｘのコンテクスト“Ｄ．ｄ”、“Ｅ．ｅ”、“Ｆ．ｆ”を読み出す。
【０１３４】
そして、コンテクスト依存解析部２００５は、メソッドＸ．ｘを「Ｘ．ｘ＋コンテクスト」という３つのエンティティに分割する。ここでいう分割は、メソッドＸ．ｘのソースコードを分割しているのではなく、メソッドＸ．ｘを指定するエンティティを、メソッドＸ．ｘを「Ｘ．ｘ＋コンテクスト」という３つのエンティティに変換することを意味する。これにより、図２７の（Ｂ）に示したコンテクスト解決メソッドレベルグラフとなる。
【０１３５】
コンテクスト依存解析部２００５でのコンテクスト解決により、仮想パス解析部２００４において、クラスＣとクラスＦとの間に有効な仮想パスが存在することがわかり、仮想パスを加えることが可能になる。クラスＣとクラスＦとの間の有効な仮想パスの存在は、コンテクスト無しのメソッドレベルグラフからは判らない情報である。コンテクスト依存解析部２００５で分割したエンティティは、関係グラフ情報４１０および本質度情報４２０に反映される。
【０１３６】
たとえば、図２７の（Ａ）の状態では、メソッドＡ．ａを関係元エンティティ、メソッドＸ．ｘを関係先エンティティとして、関係グラフ情報４１０に登録されている。また、メソッドＸ．ｘを関係元エンティティ、メソッドＤ．ｄを関係先エンティティとして、関係グラフ情報４１０に登録されている。
【０１３７】
コンテクスト依存解析部２００５によりコンテクストが解決されると、図２７の（Ｂ）のように、メソッドＸ．ｘが分割される。したがって、たとえば、メソッドＡ．ａを関係元エンティティ、メソッドＸ．ｘを関係先エンティティとするレコードは、メソッドＡ．ａを関係元エンティティ、メソッドＸ．ｘ＋“Ｄ．ｄ”を関係先エンティティとするレコードに更新される。メソッドＸ．ｘ＋“Ｅ．ｅ”、メソッドＸ．ｘ＋“Ｆ．ｆ”についても同様である。
【０１３８】
また、メソッドＸ．ｘを関係元エンティティ、メソッドＤ．ｄを関係先エンティティとするレコードは、メソッドＸ．ｘ＋“Ｄ．ｄ”を関係元エンティティ、メソッドＤ．ｄを関係先エンティティとするレコードに更新される。メソッドＸ．ｘ＋“Ｅ．ｅ”、メソッドＸ．ｘ＋“Ｆ．ｆ”についても同様である。
【０１３９】
また、本質度もコンテクスト解決後に更新される。たとえば、図２７の（Ａ）では、メソッドＸ．ｘを関係元エンティティとした３個の辺の本質度は、それぞれ「１／３」である。これに対し、図２７の（Ｂ）の解決後では、コンテクスト“Ｄ．ｄ”、“Ｅ．ｅ”、“Ｆ．ｆ”ごとにメソッドＸ．ｘが分割されているため、各本質度は、「１」に更新される。これにより、分割部４０３は、コンテクスト依存解析部２００５で得られた本質度を用いてクラスタリング処理を実行することができる。
【０１４０】
＜分割処理手順例＞
つぎに、実施の形態２にかかる分割処理手順例について説明する。図１５に示した分割処理手順例のフローチャートのうち、関係抽出処理（ステップＳ１５０１）と本質度算出処理（ステップＳ１５０２）の詳細が実施の形態１と異なる。したがって、関係抽出処理（ステップＳ１５０１）と本質度算出処理（ステップＳ１５０２）について説明する。
【０１４１】
図２８は、実施の形態２にかかる関係抽出部４０１による関係抽出処理手順例を示すフローチャートである。分割装置４００は、まず、実施の形態１と同様、ステップＳ１６０１〜Ｓ１６０５までの処理を実行する。これにより、関係グラフ情報４１０が生成される。なお、ソースコードがクラスとメソッドとの階層関係を有する場合、関係グラフ情報４１０は、クラスについてレコードが生成され、メソッドについては、メソッドレベルグラフ情報２０１２として生成される。
【０１４２】
また、分割装置４００は、ソースコードにクラスとメソッドとの階層関係があるか否かを判断する（ステップＳ２８０１）。階層関係がない場合（ステップＳ２８０１：Ｎｏ）、ステップＳ２８０３に移行する。一方、階層関係がある場合（ステップＳ２８０１：Ｙｅｓ）、分割装置４００は、クラス・メソッド情報２０１１およびメソッドレベルグラフ情報２０１２を生成して関係グラフ情報４１０に付加して（ステップＳ２８０２）、ステップＳ２８０３に移行する。
【０１４３】
また、ステップＳ２８０３において、分割装置４００は、外部からコンテクスト依存情報２０１３が入力された場合（ステップＳ２８０３：Ｙｅｓ）、コンテクスト依存情報２０１３を関係グラフ情報４１０に付加して（ステップＳ２８０４）、関係抽出処理（ステップＳ１５０１）を終了する。また、分割装置４００は、外部からコンテクスト依存情報２０１３が入力されていない場合（ステップＳ２８０３：Ｎｏ）、関係抽出処理（ステップＳ１５０１）を終了する。このようにして、分割装置４００は、クラス・メソッド情報２０１１、メソッドレベルグラフ情報２０１２、コンテクスト依存情報２０１３を得ることができる。
【０１４４】
図２９は、実施の形態２にかかる本質度算出部４０２による本質度算出処理手順例を示すフローチャートである。まず、分割装置４００は、基本解析部２００１により基本解析処理を実行する（ステップＳ２９０１）。基本解析処理（ステップＳ２９０１）の処理内容は、図１７に示した内容と同一内容であるため説明を省略する。基本解析処理（ステップＳ２９０１）により、本質度情報４２０が生成される。
【０１４５】
基本解析処理（ステップＳ２９０１）のあと、分割装置４００は、関係グラフ情報４１０にコンテクスト依存情報２０１３が付加されているか否かを判断する（ステップＳ２９０２）。付加されていない場合（ステップＳ２９０２：Ｎｏ）、分割装置４００は、関係グラフ情報４１０にメソッドレベルグラフ情報２０１２が付加されているか否かを判断する（ステップＳ２９０３）。付加されていない場合（ステップＳ２９０３：Ｎｏ）、分割装置４００は、補償処理部２００２により補償処理を実行する（ステップＳ２９０４）。補償処理（ステップＳ２９０４）が終了すると、本質度算出処理を終了する。補償処理（ステップＳ２９０４）の詳細については、図３０で説明する。
【０１４６】
また、ステップＳ２９０２において、コンテクスト依存情報２０１３が付加されていると判断された場合（ステップＳ２９０２：Ｙｅｓ）、分割装置４００は、コンテクスト依存解析部２００５によりコンテクスト依存解析処理を実行する（ステップＳ２９０５）。コンテクスト依存解析処理（ステップＳ２９０５）の詳細については図３１で説明する。コンテクスト依存解析処理（ステップＳ２９０５）のあとは、ステップＳ２９０３に移行する。
【０１４７】
また、ステップＳ２９０３において、メソッドレベル情報２０１２が付加されていると判断された場合（ステップＳ２９０３：Ｙｅｓ）、分割装置４００は、マルチレベル解析部２００３によりマルチレベル解析処理を実行する（ステップＳ２９０６）。マルチレベル解析処理（ステップＳ２９０６）の詳細については図３２で説明する。マルチレベル解析処理（ステップＳ２９０６）のあとは、ステップＳ２９０７に移行する。
【０１４８】
また、分割装置４００は、ステップＳ２９０７において、仮想パス解析部２００４により仮想パス解析処理を実行する（ステップＳ２９０７）。仮想パス解析処理（ステップＳ２９０７）の詳細については図３３で説明する。仮想パス解析処理（ステップＳ２９０７）のあとは、ステップＳ２９０４に移行する。
【０１４９】
図３０は、図２９に示した補償処理部２００２による補償処理（ステップＳ２９０４）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、補償処理（ステップＳ２９０４）において、未選択の関係元エンティティがあるか否かを判断する（ステップＳ３００１）。未選択の関係元エンティティがある場合（ステップＳ３００１：Ｙｅｓ）、分割装置４００は、未選択の関係元エンティティを１つ選択する（ステップＳ３００２）。つぎに、分割装置４００は、関係グラフ情報４１０を参照して、ステップＳ３００２で選択された関係元エンティティ（以下、選択エンティティ）について関係先エンティティが複数あるか否かを判断する（ステップＳ３００３）。複数ない場合（ステップＳ３００３：Ｎｏ）、ステップＳ３００１に戻る。一方、複数ある場合（ステップＳ３００３：Ｙｅｓ）、分割装置４００は、選択エンティティから各関係先エンティティへの本質度を、本質度情報４２０から取得する（ステップＳ３００４）。
【０１５０】
そして、分割装置４００は、取得した本質度を合計する（ステップＳ３００５）。合計した本質度をＴとする。このあと、分割装置４００は、Ｔ＜１であるか否かを判断する（ステップＳ３００６）。Ｔ＜１でない場合（ステップＳ３００６：Ｎｏ）、ステップＳ３００１に戻る。一方、Ｔ＜１である場合（ステップＳ３００６：Ｙｅｓ）、分割装置４００は、ステップＳ３００５で取得した各本質度の補償処理を実行する（ステップＳ３００７）。
【０１５１】
具体的には、たとえば、分割装置４００は、式（９）により、取得した本質度ごとに、補償後の本質度を算出する。そして、分割装置４００は、本質度情報４２０に対し、算出した本質度を更新して（ステップＳ３００８）、ステップＳ３００１に戻る。また、ステップＳ３００１において、未選択の関係元エンティティがない場合（ステップＳ３００１：Ｎｏ）、補償処理（ステップＳ２９０４）を終了する。関係元エンティティが複数のエンティティに関係する場合、何れかのエンティティは自エンティティにとって本質的である可能性がある。したがって、分割装置４００は、関係先への本質度の合計ＴがＴ＜１の場合、本質度が低く見積もられていると仮定して、本質度を意図的に高くする。これにより、分割装置４００は、本質的であることを補償することができる。
【０１５２】
図３１は、図２９に示したコンテクスト依存解析部２００５によるコンテクスト依存解析処理（ステップＳ２９０５）の詳細な処理手順例を示すフローチャートである。まず、コンテクスト依存解析処理（ステップＳ２９０５）において、分割装置４００は、コンテクスト依存情報２０１３を読み込む（ステップＳ３１０１）。つぎに、分割装置４００は、コンテクスト依存解析処理（ステップＳ２９０５）において、未選択の関係先エンティティがあるか否かを判断する（ステップＳ３１０２）。未選択の関係先エンティティがある場合（ステップＳ３１０２：Ｙｅｓ）、分割装置４００は、未選択の関係先エンティティを１つ選択する（ステップＳ３１０３）。
【０１５３】
そして、分割装置４００は、コンテクスト依存情報２０１３を参照して、ステップＳ３１０３で選択された関係先エンティティにコンテクストがあるか否かを判断する（ステップＳ３１０４）。コンテクストがない場合（ステップＳ３１０４：Ｎｏ）、ステップＳ３１０２に戻る。一方、コンテクストがある場合（ステップＳ３１０４：Ｙｅｓ）、分割装置４００は、図２７の（Ｂ）に示したように、コンテクストごとに、選択したエンティティを分割する（ステップＳ３１０５）。
【０１５４】
そして、分割装置４００は、ステップＳ３１０５で分割された分割エンティティごとに、関係グラフ情報４１０を更新する（ステップＳ３１０６）。具体的には、上述したように、メソッドＡ．ａを関係元エンティティ、メソッドＸ．ｘを関係先エンティティとするレコードは、メソッドＡ．ａを関係元エンティティ、メソッドＸ．ｘ＋“Ｄ．ｄ”を関係先エンティティとするレコードに更新される。
【０１５５】
また、メソッドＸ．ｘを関係元エンティティ、メソッドＤ．ｄを関係先エンティティとするレコードは、メソッドＸ．ｘ＋“Ｄ．ｄ”を関係元エンティティ、メソッドＤ．ｄを関係先エンティティとするレコードに更新される。
【０１５６】
また、分割装置４００は、関係グラフ情報４１０についてステップＳ３１０６で更新されたレコードについて本質度を更新する（ステップＳ３１０７）。具体的には、上述したように、図２７の（Ａ）では、メソッドＸ．ｘを関係元エンティティとした３個の辺の本質度は、それぞれ「１／３」である。これに対し、図２７の（Ｂ）の解決後では、コンテクスト“Ｄ．ｄ”、“Ｅ．ｅ”、“Ｆ．ｆ”ごとにメソッドＸ．ｘが分割されているため、各本質度は、「１」に更新される。
【０１５７】
このあと、ステップＳ３１０２に戻る。分割装置４００は、ステップＳ３１０２において、未選択の関係先エンティティがない場合（ステップＳ３１０２：Ｎｏ）、コンテクスト依存解析処理（ステップＳ２９０５）を終了する。これにより、関係グラフ情報４１０および本質度情報４２０に対し、コンテクスト解決内容を反映することができる。
【０１５８】
これにより、分割装置４００は、呼び出し元からのコンテクストを付加することで、コンテクスト解決により、条件分岐がある場合でも望ましい本質度を求めることができる。また、コンテクスト解決により、仮想パス解析部２００４による仮想パスの追加の機会が増加する。
【０１５９】
図３２は、図２９に示したマルチレベル解析部２００３によるマルチレベル解析処理（ステップＳ２９０６）の詳細な処理手順例を示すフローチャートである。まず、マルチレベル解析処理（ステップＳ２９０６）において、分割装置４００は、メソッドレベルグラフ情報２０１２およびクラス・メソッド情報２０１１を読み込む（ステップＳ３２０１）。つぎに、分割装置４００は、マルチレベル解析処理（ステップＳ２９０６）において、メソッドレベルグラフ情報２０１２を参照して、未選択の関係先エンティティとなるメソッド（以下、関係先メソッド）があるか否かを判断する（ステップＳ３２０２）。関係先メソッドがある場合（ステップＳ３２０２：Ｙｅｓ）、分割装置４００は、未選択の関係先メソッドを１つ選択する（ステップＳ３２０３）。
【０１６０】
つぎに、分割装置４００は、選択した関係先メソッドが所属するクラスを、クラス・メソッド情報２０１１から特定し、特定したクラス（以下、自クラス）内のメソッドをクラス・メソッド情報２０１１から特定する（ステップＳ３２０４）。たとえば、選択された関係先メソッドがメソッドＢ．ｃである場合、メソッドＢ．ｃが属するクラスはクラスＢである。したがって、クラスＢに属するメソッドＢ．ｄ，Ｂ．ｅが特定される。
【０１６１】
また、分割装置４００は、自クラス内のメソッドの関係元エンティティとなるメソッド（以下、関係元メソッド）を、メソッドレベルグラフ情報２０１２から特定する（ステップＳ３２０５）。たとえば、ステップＳ３２０４で自クラス内のメソッドＢ．ｃ，Ｂ．ｄ，Ｂ．ｅが特定されている。したがって、分割装置４００は、メソッドＢ．ｃ，Ｂ．ｄ，Ｂ．ｅの関係元メソッドＡ．ａ，Ａ．ｂ，Ｃ．ｆ，Ｃ．ｇを、メソッドレベルグラフ情報２０１２から特定する。
【０１６２】
そして、分割装置４００は、自クラスのメソッドごとに、関係元メソッドからの本質度を算出する（ステップＳ３２０６）。たとえば、関係先メソッドＢ．ｃ，Ｂ．ｄ，Ｂ．ｅの本質度Ｅ（Ａ．ａ，Ｂ．ｃ），Ｅ（Ａ．ｂ，Ｂ．ｅ），Ｅ（Ｃ．ｆ，Ｂ．ｃ），Ｅ（Ｃ．ｆ，Ｂ．ｄ），Ｅ（Ｃ．ｇ，Ｂ．ｅ）を、式（１）により算出する。
【０１６３】
このあと、分割装置４００は、関係先メソッドが属するクラス（以下、関係先クラス）ごとに、関係先クラスから自クラスへのクラスレベルの本質度を式（１０）により算出する（ステップＳ３２０７）。上記の例では、関係先クラスＡから自クラスＢへのクラスレベルでの本質度Ｅ（Ａ，Ｂ）が算出され、関係先クラスＣから自クラスＢへのクラスレベルでの本質度Ｅ（Ｃ，Ｂ）が算出される。
【０１６４】
このあと、分割装置４００は、本質度情報４２０を更新して（ステップＳ３２０８）、ステップＳ３２０２に戻る。上記の例では、クラスＡを関係先エンティティとし、クラスＢを関係元エンティティとするレコードに対応する本質度が、ステップＳ３２０７で算出されたクラスレベルでの本質度に更新される。クラスＣを関係先エンティティとし、クラスＢを関係元エンティティとするレコードについても同様である。
【０１６５】
また、ステップＳ３２０２において、未選択の関係先メソッドがない場合（ステップＳ３２０２：Ｎｏ）、マルチレベル解析処理（ステップＳ２９０６）を終了する。このマルチレベル解析処理（ステップＳ２９０６）を実行することにより、抽象度レベルが上のクラス間関係に要約することができ、より高精度な分析が可能な本質度を求めることができる。
【０１６６】
図３３は、図２９に示した仮想パス解析部２００４による仮想パス解析処理（ステップＳ２９０７）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、仮想パス解析処理（ステップＳ２９０７）において、未選択のエンティティがあるか否かを判断する（ステップＳ３３０１）。未選択のエンティティがある場合（ステップＳ３３０１：Ｙｅｓ）、分割装置４００は、未選択のエンティティを１つ選択する（ステップＳ３３０２）。そして、分割装置４００は、選択されたエンティティがマルチレベル解析済みのエンティティであるか否かを、関係グラフ情報４１０に追加されたマルチレベル解析済みのフラグを参照することで判断する（ステップＳ３３０３）。
【０１６７】
マルチレベル解析済みでない場合（ステップＳ３３０３：Ｎｏ）、ステップＳ３３０１に戻る。一方、マルチレベル解析済みである場合（ステップＳ３３０３：Ｙｅｓ）、分割装置４００は、選択されたエンティティであるクラスについて、関係元エンティティとなるクラスおよび関係先エンティティとなるクラスがあるか否かを判断する（ステップＳ３３０４）。たとえば、図２５のクラスＸがマルチレベル解析済みのクラスである場合、分割装置４００は、クラスＸの関係元エンティティであるクラスＡ，Ｂ，Ｃと、クラスＸの関係先エンティティであるクラスＤ，Ｅ，Ｆを特定する。
【０１６８】
関係元エンティティとなるクラスおよび関係先エンティティとなるクラスがない場合（ステップＳ３３０４：Ｎｏ）、ステップＳ３３０１に戻る。一方、関係元エンティティとなるクラスおよび関係先エンティティとなるクラスがある場合（ステップＳ３３０４：Ｙｅｓ）、分割装置４００は、関係元エンティティであるクラス内のメソッドと、関係先エンティティであるクラス内のメソッドと、を特定する（ステップＳ３３０５）。
【０１６９】
図２５の例では、クラスＸの関係元エンティティであるクラスＡ，Ｂ，Ｃと、クラスＸの関係先エンティティであるクラスＤ，Ｅ，Ｆが特定される。したがって、クラスＡのメソッドＡ．ａ，クラスＢのメソッドＢ．ｂ，クラスＣのメソッドＣ．ｃ，クラスＤのメソッドＤ．ｄ，クラスＥのメソッドＥ．ｅ，クラスＦのメソッドＦ．ｆが特定される。
【０１７０】
このあと、分割装置４００は、クラスレベルでの累積本質度と、メソッドレベルでの累積本質度を算出する（ステップＳ３３０６）。図２５の例では、たとえば、メソッドＸ．ｚについては、メソッドレベルグラフにおいて、本質度Ｅ（Ｃ．ｃ，Ｘ．ｚ）＝１、Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１である。したがって、メソッドＣ．ｃからメソッドＦ．ｆへの累積本質度は、Ｅ（Ｃ．ｃ，Ｘ．ｚ）×Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１×１＝１となる。これに対し、クラスレベルグラフにおいて、クラスＣからクラスＦへの累積本質度はＥ（Ｃ，Ｘ）×Ｅ（Ｘ，Ｆ）＝１／３となる。分割装置４００は、メソッドＸ．ｘ，Ｘ．ｙについても同様に算出する。
【０１７１】
つぎに、分割装置４００は、メソッドレベルでの累積本質度が、クラスレベルでの累積本質度より大きいか否かを判断する（ステップＳ３３０７）。大きくない場合（ステップＳ３３０７：Ｎｏ）、ステップＳ３３０１に戻る。一方、大きい場合（ステップＳ３３０７：Ｙｅｓ）、マルチレベル解析により、クラスレベルへ抽象化したことで情報が失われていることがわかる。上記の例では、メソッドＣ．ｃからメソッドＦ．ｆへの累積本質度は、Ｅ（Ｃ．ｃ，Ｘ．ｚ）×Ｅ（Ｘ．ｚ，Ｆ．ｆ）＝１であり、クラスＣからクラスＦへの累積本質度はＥ（Ｃ，Ｘ）×Ｅ（Ｘ，Ｆ）＝１／３である。したがって、メソッドレベルの累積本質度の方が大きいと判断される。
【０１７２】
そして、分割装置４００は、メソッドレベルでの累積本質度が、クラスレベルでの累積本質度より大きいと判断された場合（ステップＳ３３０７：Ｙｅｓ）、仮想パスを設定する（ステップＳ３３０８）。上記の例では、クラスレベルへ抽象化したことで情報を補償するために、分割装置４００は、仮想的にクラスＣからクラスＦへの辺を仮想パスとして設定する。分割装置４００は、メソッドレベルでの累積本質度が、クラスレベルでの累積本質度より大きい場合には、クラスＡからクラスＤへの辺、クラスＢからクラスＥへの辺についても仮想パスを設定する。仮想パスは関係グラフ情報４１０のレコードとして追加される。
【０１７３】
また、分割装置４００は、仮想パスを経由した仮想本質度を算出する（ステップＳ３３０９）。上記の例では、仮想本質度Ｅｖ（Ｃ，Ｆ）として、Ｅｖ（Ｃ，Ｆ）＝（メソッドＣ．ｃからメソッドＦ．ｆへの累積本質度）＝１が算出される。分割装置４００は、クラスＡからクラスＤへの辺、クラスＢからクラスＥへの辺についても仮想パスが設定されている場合、仮想本質度Ｅｖ（Ａ，Ｄ），仮想本質度Ｅｖ（Ｂ，Ｅ）についても同様に算出する。このあと、ステップＳ３３０１に戻る。
【０１７４】
また、ステップＳ３３０１において、未選択のエンティティがない場合（ステップＳ３３０１：Ｎｏ）、仮想パス解析処理（ステップＳ２９０７）を終了する。この仮想パス解析処理（ステップＳ２９０７）を実行することにより、マルチレベル解析部２００３で要約する際に失われたメソッドレベルグラフの情報を、「仮想パス」を用いて表現することで再生することができる。したがって、本質度の高精度化を図ることができる。
【０１７５】
このように、実施の形態２では、関係元エンティティが複数のエンティティに関係する場合、何れかのエンティティは自エンティティにとって本質的である可能性があるため、関係元エンティティからの依存関係の本質度の合計が低い場合に補償することができる。また、コンテクスト解決により、条件分岐がある場合でも望ましい本質度を求めることができる。また、抽象度レベルが上のクラス間関係に要約することができ、より高精度な分析が可能な本質度を求めることができる。
【０１７６】
また、マルチレベル解析部２００３で要約する際に失われたメソッドレベルグラフの情報を、「仮想パス」を用いて表現することで再生することができる。このように、実施の形態２では、本質度の精度が向上するため、ソフトウェアの分割精度の向上を図ることができる。
【０１７７】
（実施の形態３）
つぎに、実施の形態３について説明する。実施の形態３は、実施の形態１，２で求められたソフトウェアの分割であるエンティティ集合に対し、分析の助けとなるようにその分割を特徴付ける単語リストを付加する例である。
【０１７８】
＜分割装置４００の機能的構成例＞
図３４は、実施の形態３にかかる分割装置４００の機能的構成例を示すブロック図である。図３４において、実施の形態３にかかる分割装置４００は、実施の形態１の分割装置４００に対し、単語抽出部３４０１と特徴量算出部３４０２が追加された構成である。単語抽出部３４０１および特徴量算出部３４０２は、具体的には、たとえば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、磁気ディスク３０５、光ディスク３０７などの記憶装置に記憶されたプログラムをＣＰＵ３０１に実行させることにより、または、Ｉ／Ｆ３０９により、その機能を実現する。なお、図３４では、実施の形態１の分割装置４００に単語抽出部３４０１と特徴量算出部３４０２を追加した例について説明したが、実施の形態２の分割装置４００でも同様に追加することができる。
【０１７９】
単語抽出部３４０１は、ソフトウェアのソースコードをソースコードＤＢ４５０から読み込み、既存の字句解析技術、構文解析技術および自然言語処理技術を用いてソースコードを解析し、単語を抽出する。そして、単語抽出部３４０１は、エンティティ毎に単語の使用回数を単語リストに記録する。単語リストは、エンティティ、単語名、回数の３項目からなるテーブルである。単語リストは、記憶装置に記憶される。
【０１８０】
特徴量算出部３４０２は、クラスタリングにより得られた分析結果４３０から、各クラスタに属するエンティティの情報を取得する。そして、特徴量算出部３４０２は、各クラスタについて、クラスタに属するエンティティを調べ、単語抽出部３４０１で作成した単語リストを用いて、クラスタ毎の単語の使用回数を調べ、クラスタ単語リストに記録する。クラスタ単語リストは、クラスタ、単語名、回数の３項目からなるテーブルである。クラスタ単語リストは、記憶装置に記憶される。
【０１８１】
また、特徴量算出部３４０２は、単語の特徴量を計算する。特徴量は、たとえば、頻度（使用回数）や、ｔｆ（ｔｅｒｍ  ｆｒｅｑｕｅｎｃｙ）−ｉｄｆ（ｉｎｖｅｒｓｅ  ｄｏｃｕｍｅｎｔ  ｆｒｅｑｕｅｎｃｙ）値などである。ｔｆ−ｉｄｆ値は、一般に、文書中に出現した特定の単語がどのくらい特徴的であるかを識別するための指標のことである。実施の形態３の場合、たとえば、１つのクラスタを１つの文書として扱う。したがって、ｔｆ−ｉｄｆ値は、クラスタ内に出現した単語がソフトウェアのソースコードにおいてどのくらい特徴的かを識別する指標となる。
【０１８２】
具体的な求め方としては、たとえば、ある単語ｉのあるクラスタｊでのｔｆijは、単語ｉのクラスタｊでの出現回数を各単語のクラスタｊでの出現回数で割ることにより、求められる。また、単語ｉのｉｄｆiは、クラスタ総数を単語ｉを含むクラスタ数で割った値の対数をとることにより、求められる。そして、特徴量算出部３４０２は、ｔｆijとｉｄｆiとを乗算することにより、ある単語ｉについてのｔｆ−ｉｄｆ値を求めることができる。
【０１８３】
このあと、特徴量算出部３４０２は、各クラスタについて、特徴量が上位の単語を抽出して上位リストを作成し、キーワードリストとして出力する。どの程度を上位の単語とするかは、ユーザにより設定可能である。たとえば、特徴量がしきい値以上の単語としたり、特徴量が大きい順に上位５０位までの単語としたりすることができる。また、キーワードリストはクラスタ、順位、単語、特徴量の４項目からなるテーブルである。キーワードリストは、記憶装置に記憶される。図３５は、キーワードリストの一例を示す説明図である。
【０１８４】
＜分割処理手順例＞
図３６は、実施の形態３にかかる分割処理手順例を示すフローチャートである。図３６において、分割装置４００は、関係抽出処理（ステップＳ１５０１）、本質度算出処理（ステップＳ１５０２）、クラスタリング処理（ステップＳ１５０３）、単語抽出処理（ステップＳ３６０４）、および特徴量算出処理（ステップＳ３６０５）を実行する。関係抽出処理（ステップＳ１５０１）、本質度算出処理（ステップＳ１５０２）、クラスタリング処理（ステップＳ１５０３）については、実施の形態１，２と同一処理内容であるため、説明を省略する。また、単語抽出処理（ステップＳ３６０４）の詳細は、図３７で説明し、特徴量算出処理（ステップＳ３６０５）の詳細は、図３８で説明する。
【０１８５】
図３７は、単語抽出部３４０１による単語抽出処理（ステップＳ３６０４）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、ソフトウェアのソースコードをソースコードＤＢ４５０から読み込み、既存の字句解析技術、構文解析技術および自然言語処理技術を用いてソースコードを解析し、単語を抽出する（ステップＳ３７０１）。つぎに、分割装置４００は、エンティティごとに、ステップＳ３７０１で抽出された単語の使用回数を計数して、単語リストに記録する（ステップＳ３７０２）。これにより、単語抽出処理（ステップＳ３６０４）を終了する。この単語抽出処理（ステップＳ３６０４）によれば、エンティティごとに、各単語とその使用回数を得ることができる。
【０１８６】
図３８は、特徴量算出部３４０２による特徴量算出処理（ステップＳ３６０５）の詳細な処理手順例を示すフローチャートである。まず、分割装置４００は、分割部４０３から得られた分析結果４３０を読み込み、各クラスタに属するエンティティを取得する（ステップＳ３８０１）。たとえば、図１３および図１４の例では、クラスタ１を例に挙げると、クラスタ１に所属するエンティティであるクラスＣ２，Ｃ５，Ｃ６，Ｃ１１，Ｃ１４を取得する。
【０１８７】
つぎに、分割装置４００は、クラスタごとに、単語リストを参照して、クラスタに属するエンティティでの各単語の使用回数を抽出し、クラスタごとに、各単語の使用回数を集計し、クラスタ単語リストに記録する。（ステップＳ３８０２）。そして、分割装置４００は、クラスタごとに、各単語の特徴量を算出する（ステップＳ３８０３）。このあと、分割装置４００は、クラスタごとに、特徴量が上位となる単語を抽出して上位リストを作成し、キーワードリストとして出力する（ステップＳ３８０４）。これにより、特徴量算出処理（ステップＳ３６０５）を終了する。
【０１８８】
この特徴量算出処理（ステップＳ３６０５）によれば、クラスタ内の使用頻度が高い単語がリスト化されるため、どのクラスタでどの単語の使用頻度が高いかがわかることになり、ユーザは、使用頻度の高い単語からそのような処理がクラスタで実行されるかといった推測が容易になる。
【０１８９】
以上説明したように、実施の形態１〜３によれば、ソフトウェアをソフトウェア内部の依存関係に基づいて小規模なクラスタに自動分割することができる。クラスタは内部では本質度に基づいた相互依存関係が密であり、クラスタ間は疎であるというモジュール性の高い性質を備える。その上、クラスタ内の依存関係はそのソフトウェアが果たす業務や機能の観点から本質的なものが選ばれる。
【０１９０】
したがって、クラスタを参照することにより、ソフトウェアの機能的な構造の理解が容易になる。また、ソフトウェアのサービス化や移行への部分切り出し、開発者の業務知識と対応させることで最適化した保守の人員配置、業務・機能のドキュメント記載と実際の業務・機能との差異の発見などにも利用することができる。
【０１９１】
また、従来のような優先順位の低い依存関係を最初に削除してしまう手法や、分割のために分析者の知識を要し人手を介する手法は、数万行程度のソフトウェアは分析可能だが商業システムのような数百万行規模のようなソフトウェアは事実上分析できない。本実施の形態では、たとえば、数百万行規模以上であって数分から数時間という現実的な時間でクラスタリングすることができる。
【０１９２】
また、上述した実施の形態１〜３では、本質度算出部４０２または基本解析部２００１により本質度を算出することとしたが、本質度を算出せずに、本質度の代わりに依存関係についてあらかじめ設定された重みを適用してもよい。たとえば、クラスやメソッドの種類別に重みを設定しておくこととしてもよい。この場合、分割部４０３は、当該重みを用いて、本質度を用いた場合と同様にクラスタリングすることができる。
【０１９３】
また、上述した実施の形態２では、補償処理部２００２が、関係元エンティティが複数のエンティティに関係する場合、複数のエンティティの何れかのエンティティは自エンティティにとって本質的である可能性があるため、自動的に本質度を補償することができる。また、上述した実施の形態２では、補償処理部２００２の機能をエンティティを用いて説明したが、メソッドなどのサブエンティティについても同様に補償処理部２００２による処理を実行することができる。
【０１９４】
また、上述した実施の形態２では、マルチレベル解析部２００３が、クラス間の関係を分析する際に、より詳細なメソッド間の関係情報を用いて解析を行い、それを抽象度レベルが上のクラス間関係に要約する。したがって、より高精度な分析が可能な本質度を求めることができ、ソフトウェアの分割精度の向上を図ることができる。
【０１９５】
また、上述した実施の形態２では、仮想パス解析部２００４が、マルチレベル解析部２００３で要約する際に失われたメソッドレベルグラフの情報を、「仮想パス」を用いて表現することで再生することができる。このように欠落した情報を仮想パスとして復元することにより、より高精度な分析が可能な本質度を求めることができ、ソフトウェアの分割精度の向上を図ることができる。
【０１９６】
また、上述した実施の形態２では、コンテクスト依存解析部２００５が、呼び出し元からのコンテクストを付加する。これにより、コンテクストが付加されたサブエンティティが関係先になる場合、コンテクストごとの関係先として本質度を求めることができる。また、コンテクストが付加されたサブエンティティが関係元になる場合も同様に、コンテクストごとの関係元として本質度を求めることができる。したがって、基本解析部２００１は、条件分岐がある場合でも望ましい本質度を求めることができる。
【０１９７】
また、コンテクスト依存解析部２００５ではサブエンティティについて適用した例について説明したが、エンティティについても適用可能である。この場合、たとえば、図２６のコンテクスト依存情報２０１３の「関係元メソッド」は「関係元クラス」に、「関係先メソッド」は「関係先クラス」になる。
【０１９８】
また、上述した実施の形態３では、クラスタ内に出現する単語の特徴量が得られるため、ユーザに対し、ソースコードの理解をクラスタ単位で支援することができる。
【０１９９】
以上説明したように、分割装置、分割方法、および分割プログラムによれば、ソフトウェアの分割精度の向上を図ることができる。
【０２００】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２０１】
（付記１）ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、前記ソフトウェアのソースコードから抽出する抽出部と、
前記抽出部によって抽出された対応情報により特定される前記依存関係に関する重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する分割部と、
を有することを特徴とする分割装置。
【０２０２】
（付記２）前記分割部は、
各々エンティティを有する部分グラフの集合の中から選ばれた複数の部分グラフを併合し、前記部分グラフの集合について各部分グラフに含まれる前記依存関係に関する重みの合計と当該合計の期待値との差を前記各部分グラフについて合計した評価関数の値を、併合前後の部分グラフの集合について求め、併合前よりも併合後の評価関数の値が大きくなる併合がある場合に、併合後の部分グラフの集合を前記複数のクラスタとして出力することを特徴とする付記１に記載の分割装置。
【０２０３】
（付記３）前記対応情報を参照して、前記関係先に対して前記依存関係がある前記関係元の個数に基づいて、前記関係元が当該関係元の役割を果たすために前記依存関係がどの程度本質的であるかを示す、前記関係元についての前記関係先に関する本質度を算出する本質度算出部を有し、
前記分割部は、
前記本質度算出部によって算出された本質度を前記重みとして用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記１または２に記載の分割装置。
【０２０４】
（付記４）前記本質度算出部は、
前記エンティティの入次数の大きさに応じて小さくなるように前記本質度を算出することを特徴とする付記３に記載の分割装置。
【０２０５】
（付記５）前記エンティティ群の中のあるエンティティが複数のエンティティを関係先とする依存関係を有する場合、前記あるエンティティと前記複数のエンティティの各々との依存関係に関する本質度の合計に基づいて、前記あるエンティティについての前記複数のエンティティの各々に関する本質度を補正する補償処理部を有し、
前記分割部は、
前記補償処理部によって補正された本質度を用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記３または４に記載の分割装置。
【０２０６】
（付記６）前記エンティティ群の各々が１以上のサブエンティティを含む場合、サブエンティティ群について依存関係により特定される関係元のサブエンティティと関係先のサブエンティティとを対応付けたサブエンティティに関する対応情報を参照して、前記エンティティ群のあるエンティティ内のサブエンティティが複数のエンティティ内のサブエンティティの関係先である場合、前記あるエンティティ内のサブエンティティの個数と、前記複数のエンティティの各々に包含されるサブエンティティが関係元となる前記あるエンティティ内のサブエンティティの個数と、に基づいて、前記複数のエンティティの各々についての前記あるエンティティに関する本質度を算出するマルチレベル解析部を有し、
前記分割部は、
前記マルチレベル解析部によって得られた本質度を用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記３〜５のいずれか一つに記載の分割装置。
【０２０７】
（付記７）第１のエンティティに包含される第１のサブエンティティについての第２のエンティティに包含される第２のサブエンティティに関する本質度と、前記第２のサブエンティティについての第３のエンティティに包含される第３のサブエンティティに関する本質度と、を累積することにより第１の累積本質度を求めるとともに、前記第１のエンティティについての前記第２のエンティティに関する本質度と前記第２のエンティティについての前記第３のエンティティに関する本質度とを累積することにより第２の累積本質度を求め、前記第２の累積本質度が前記第１の累積本質度よりも小さい場合、前記第１のエンティティを関係元とし前記第３のエンティティを前記第１のエンティティに対する関係先とするあらたな対応情報を生成し、当該対応情報に前記第１の累積本質度を関連付ける仮想パス解析部を有し、
前記分割部は、
前記仮想パス解析部によって前記あらたな対応情報に関連付けられた前記第１の累積本質度を用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記６に記載の分割装置。
【０２０８】
（付記８）関係元と、関係先と、前記関係元が前記関係先に対して条件分岐先を指定する情報であるコンテクストと、を対応付けたコンテクスト依存情報から、複数のエンティティに共通の関係先に対応するコンテクストを前記複数のエンティティの各々について抽出し、前記共通の関係先から前記コンテクストが付加されたコンテクスト付きエンティティを生成し、前記複数のエンティティの各々を関係元とし当該関係元に対応するコンテクストが付加された前記コンテクスト付きエンティティを関係先とする対応情報を生成するコンテクスト依存解析部を有し、
前記本質度算出部は、
前記コンテクスト依存解析部によって得られた対応情報を参照して、前記関係元についての前記関係先のコンテクスト付きエンティティに関する本質度を算出し、
前記分割部は、
前記関係元についての前記関係先のコンテクスト付きエンティティに関する本質度を用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記３または４に記載の分割装置。
【０２０９】
（付記９）前記コンテクスト依存解析部は、
前記コンテクスト付きエンティティを関係元とし、前記コンテクスト付きエンティティが有するコンテクストにより指定されるエンティティを関係先とする対応情報を生成し、
前記本質度算出部は、
前記コンテクスト依存解析部によって得られた対応情報を参照して、前記関係元である前記コンテクスト付きエンティティについての前記関係先に関する本質度を算出し、
前記分割部は、
前記関係元である前記コンテクスト付きエンティティについての前記関係先に関する本質度を用いることにより、前記エンティティ群を前記複数のクラスタに分割することを特徴とする付記８に記載の分割装置。
【０２１０】
（付記１０）前記エンティティ群の各々が１以上のサブエンティティを含む場合に存在するサブエンティティ群について、依存関係により特定される関係元のサブエンティティと、関係先のサブエンティティと、前記関係元のサブエンティティが前記関係先のサブエンティティに対して条件分岐先を指定する情報であるコンテクストと、を対応付けたコンテクスト依存情報から、包含されるエンティティが異なる複数のサブエンティティに共通の関係先のサブエンティティに対応するコンテクストを前記複数のサブエンティティの各々について抽出し、前記共通の関係先のサブエンティティから、前記コンテクストが付加されたコンテクスト付きサブエンティティを生成し、前記複数のサブエンティティの各々のサブエンティティを関係元とし、当該サブエンティティに対応するコンテクストが付加された前記コンテクスト付きサブエンティティを関係先とする、サブエンティティに関する対応情報を生成するコンテクスト依存解析部を有し、
前記本質度算出部は、
前記コンテクスト依存解析部によって得られた前記サブエンティティに関する対応情報を参照して、前記関係元のサブエンティティについての前記関係先のコンテクスト付きサブエンティティに関する本質度を算出し、
前記分割部は、
前記関係元のサブエンティティについての前記関係先のコンテクスト付きサブエンティティに関する本質度を用いることにより、前記サブエンティティ群を前記複数のクラスタに分割することを特徴とする付記３または４に記載の分割装置。
【０２１１】
（付記１１）前記コンテクスト依存解析部は、
前記コンテクスト付きサブエンティティを関係元のサブエンティティとし、前記コンテクスト付きサブエンティティが有するコンテクストにより指定されるサブエンティティを関係先のサブエンティティとする、サブエンティティに関する対応情報を生成し、
前記本質度算出部は、
前記コンテクスト依存解析部によって得られたサブエンティティに関する対応情報を参照して、前記関係元である前記コンテクスト付きサブエンティティについての前記関係先のサブエンティティに関する本質度を算出し、
前記分割部は、
前記関係元である前記コンテクスト付きサブエンティティについての前記関係先のサブエンティティに関する本質度を用いることにより、前記サブエンティティ群を前記複数のクラスタに分割することを特徴とする付記１０に記載の分割装置。
【０２１２】
（付記１２）前記エンティティ群の各エンティティ内に出現する単語とその出現回数を前記ソースコードから抽出する単語抽出部と、
前記複数のクラスタの各クラスタに属するエンティティ内に出現する単語とその出現回数に基づいて、前記各クラスタ内での前記単語の特徴量を算出し、前記特徴量に基づいて、前記各クラスタ内に出現する単語を出力する特徴量算出部と、
を有することを特徴とする付記１〜１１のいずれか一つに記載の分割装置。
【０２１３】
（付記１３）前記特徴量算出部は、
前記特徴量がしきい値以上となる単語または上位所定順位までの単語を出力することを特徴とする付記１２に記載の分割装置。
【０２１４】
（付記１４）コンピュータが、
ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、記憶装置に記憶されている前記ソフトウェアのソースコードから抽出し、
抽出された対応情報により特定される前記依存関係に関する重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する、
処理を実行することを特徴とする分割方法。
【０２１５】
（付記１５）コンピュータに、
ソフトウェアを構成する要素群であるエンティティ群について依存関係により特定される関係元のエンティティと関係先のエンティティとを対応付けた対応情報を、記憶装置に記憶されている前記ソフトウェアのソースコードから抽出し、
抽出された対応情報により特定される前記依存関係に関する重みに基づいて、前記依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、前記エンティティ群を複数のクラスタに分割する、
処理を実行させるための分割プログラム。
【符号の説明】
【０２１６】
４００  分割装置
４０１  関係抽出部
４０２  本質度算出部
４０３  分割部
４１０  関係グラフ情報
４２０  本質度情報
２００１  基本解析部
２００２  補償処理部
２００３  マルチレベル解析部
２００４  仮想パス解析部
２００５  コンテクスト依存解析部
２０１１  クラス・メソッド情報
２０１２  メソッドレベルグラフ情報
２０１３  コンテクスト依存情報
【図１】
0005899946.tif 000005
【図２】
0005899946.tif 000006
【図３】
0005899946.tif 000007
【図４】
0005899946.tif 000008
【図５】
0005899946.tif 000009
【図６】
0005899946.tif 000010
【図７】
0005899946.tif 000011
【図８】
0005899946.tif 000012
【図９】
0005899946.tif 000013
【図１０】
0005899946.tif 000014
【図１１】
0005899946.tif 000015
【図１２】
0005899946.tif 000016
【図１３】
0005899946.tif 000017
【図１４】
0005899946.tif 000018
【図１５】
0005899946.tif 000019
【図１６】
0005899946.tif 000020
【図１７】
0005899946.tif 000021
【図１８】
0005899946.tif 000022
【図１９】
0005899946.tif 000023
【図２０】
0005899946.tif 000024
【図２１】
0005899946.tif 000025
【図２２】
0005899946.tif 000026
【図２３】
0005899946.tif 000027
【図２４】
0005899946.tif 000028
【図２５】
0005899946.tif 000029
【図２６】
0005899946.tif 000030
【図２７】
0005899946.tif 000031
【図２８】
0005899946.tif 000032
【図２９】
0005899946.tif 000033
【図３０】
0005899946.tif 000034
【図３１】
0005899946.tif 000035
【図３２】
0005899946.tif 000036
【図３３】
0005899946.tif 000037
【図３４】
0005899946.tif 000038
【図３５】
0005899946.tif 000039
【図３６】
0005899946.tif 000040
【図３７】
0005899946.tif 000041
【図３８】
0005899946.tif 000042