(57)【要約】【課題】ソフトウェアの機能を実現する構成要素の集合を抽出可能にすること。【解決手段】分析装置１００は、ソフトウェアＳＷの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアＳＷの構成要素群を複数のクラスタに分割する。分析装置１００は、分割した複数のクラスタのいずれかのクラスタの意味的凝集度が、予め設定された条件を満たさない場合、当該クラスタに含まれる構成要素群を複数のクラスタに分割する。クラスタの意味的凝集度は、当該クラスタの意味的なまとまりの良さを示す指標値である。【選択図】図１
2019106128.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータが実行することを特徴とする分析方法。
【請求項２】
前記凝集度が前記条件を満たす場合には、前記クラスタを一つの構成要素集合に決定する、処理を前記コンピュータが実行することを特徴とする請求項１に記載の分析方法。
【請求項３】
決定した前記構成要素集合に含まれる構成要素を示す情報を出力する、処理を前記コンピュータが実行することを特徴とする請求項２に記載の分析方法。
【請求項４】
前記凝集度が前記条件を満たさない場合、前記クラスタの階層構造を示す階層情報に基づいて、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、ことを特徴とする請求項１〜３のいずれか一つに記載の分析方法。
【請求項５】
前記ソフトウェアの構成要素群の各構成要素における単語に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出し、
算出した前記凝集度が前記条件を満たすか否かを判断する、
処理を前記コンピュータが実行することを特徴とする請求項１〜４のいずれか一つに記載の分析方法。
【請求項６】
前記ソフトウェアの構成要素群の各構成要素における単語の出現頻度に基づいて、前記各構成要素について、所定数の各トピックを前記各構成要素が含む確率を算出し、
算出した前記各構成要素についての前記各トピックの確率に基づいて、前記クラスタに含まれる構成要素間の類似度を算出する、処理を前記コンピュータが実行し、
算出した前記構成要素間の類似度に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出することを特徴とする請求項５に記載の分析方法。
【請求項７】
ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
制御部を有することを特徴とする分析装置。
【請求項８】
ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータに実行させることを特徴とする分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分析方法、分析装置および分析プログラムに関する。
【背景技術】
【０００２】
ソフトウェアを開発・改良・保守するためには、ソフトウェアの現状がどうなっているかを理解することが重要である。このような活動を支援するために、例えば、ソフトウェアを構成するソースファイル（あるいは、クラスや関数など）間の依存関係に基づいてクラスタリング技術を適用し、依存関係の密なかたまりを発見して理解に役立てる技術がある。
【０００３】
先行技術としては、例えば、ソフトウェアから処理対象のエンティティ集合を選択して、複数のクラスタに分割し、分割したクラスタ内のエンティティ数が上限数を超えていれば、当該クラスタ内のエンティティ集合を処理対象のエンティティ集合として選択するものがある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１５−１７９４５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、ソフトウェアの機能を実現しているプログラムの集合を抽出することができない場合がある。
【０００６】
一つの側面では、本発明は、ソフトウェアの機能を実現する構成要素の集合を抽出可能にすることを目的とする。
【課題を解決するための手段】
【０００７】
１つの実施態様では、ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、分析方法が提供される。
【発明の効果】
【０００８】
本発明の一側面によれば、ソフトウェアの機能を実現する構成要素の集合を抽出可能にすることができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかる分析方法の一実施例を示す説明図である。
【図２】図２は、業務システムにおける機能とプログラムの一例を示す説明図である。
【図３】図３は、クラスタ階層の一例を示す説明図である。
【図４】図４は、分析装置１００のハードウェア構成例を示すブロック図である。
【図５】図５は、プログラム間の依存関係の一例を示す説明図である。
【図６】図６は、依存関係情報の具体例を示す説明図である。
【図７】図７は、単語情報の具体例を示す説明図である。
【図８】図８は、分析装置１００の機能的構成例を示すブロック図である。
【図９】図９は、クラスタ情報の具体例を示す説明図である。
【図１０】図１０は、クラスタ階層情報の具体例を示す説明図である。
【図１１】図１１は、トピック比率情報の具体例を示す説明図である。
【図１２】図１２は、類似度行列の具体例を示す説明図（その１）である。
【図１３】図１３は、クラスタの分割例を示す説明図である。
【図１４】図１４は、類似度行列の具体例を示す説明図（その２）である。
【図１５】図１５は、類似度行列の具体例を示す説明図（その３）である。
【図１６】図１６は、クラスタ定義情報の具体例を示す説明図である。
【図１７】図１７は、分析装置１００の分析処理手順の一例を示すフローチャートである。
【図１８】図１８は、クラスタ決定処理の具体的処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、本発明にかかる分析方法、分析装置および分析プログラムの実施の形態を詳細に説明する。
【００１１】
（実施の形態）
図１は、実施の形態にかかる分析方法の一実施例を示す説明図である。図１において、分析装置１００は、ソフトウェアＳＷを分析するコンピュータである。ソフトウェアＳＷは、分析対象となるコンピュータプログラムであり、コンピュータを動作させる命令、手順などを記述したものである。
【００１２】
ソフトウェアＳＷは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどの管理上適当な単位である。以下の説明では、コンポーネント、モジュール、ソースコード、クラス、関数などを総称して「プログラム」と表記する場合がある。
【００１３】
ここで、ソフトウェアＳＷの理解を支援する技術として、ソフトウェアＳＷを小規模な部分集合（いわゆる、クラスタ）に分割する技術がある。具体的には、例えば、ソフトウェアＳＷに含まれるプログラム同士の依存関係に基づくクラスタリングを行って、互いに関係し合っているプログラムのかたまりをクラスタとして分割するものがある（従来技術１）。
【００１４】
プログラム間の依存関係は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などの呼び出し関係、継承関係、包含関係や、データアクセス関係などの関係である。なお、従来技術１については、例えば、特開２０１３−１４８９８７号公報を参照することができる。
【００１５】
従来技術１で得られた各クラスタは、ソフトウェアの機能を実装しているプログラム群であることが期待される。機能とは、外部からのトリガ（例えば、利用者の操作入力）によって引き起こされるソフトウェアシステムの振る舞いである。例えば、業務システムにおいては、「見積を回答する」、「発注を送信する」、「契約情報を検索する」などが挙げられる。
【００１６】
ここで、図２を用いて、業務システムにおける機能とプログラムについて説明する。
【００１７】
図２は、業務システムにおける機能とプログラムの一例を示す説明図である。図２の例では、階層的なアーキテクチャをとる業務システム（ソフトウェアシステム）において、アーキテクチャ階層を跨って「契約入力業務」、「一括契約入力業務」という２つの機能を実現するプログラム群およびプログラム間の依存関係が示されている。
【００１８】
このような業務システムにかかるソフトウェアクラスタリングにおいては、一体となって機能を実現しているプログラムの集合を得られると有用である。図２中、契約入力画面、契約入力処理、契約明細履歴モデル等は、プログラムの一例である。また、図２中、プログラム間の依存関係は、矢印によって表される。
【００１９】
図２においては、契約入力業務、一括契約入力業務とラベルの付けられたふたつの枠２１０，２２０が、機能による分類を示している。こうした分割が有用である応用例としては、マイクロサービスアーキテクチャにみられるような各機能を独立して動作可能なサービスとして分割・再配置することが挙げられる。また、既存システムの不要な機能を統廃合する場合や、一部の機能をＳａａＳ（Ｓｏｆｔｗａｒｅ  ａｓ  ａ  Ｓｅｒｖｉｃｅ）のような外部サービスに置き換える場合にも有用である。
【００２０】
ところが、プログラム間の依存関係に基づくクラスタリングでは、依存関係によって最適と評価された分割が、意味的に見て必ずしも最適な分割になるとは限らず、人が見て複数の機能と認識されるものが一つのクラスタに同居することがある。
【００２１】
例えば、図１に示すように、枠１１０の単位がプログラム間の依存関係によって最適なクラスタとして得られたとする。しかし、枠１１０内には、図２に示した「契約入力業務」と「一括契約入力業務」という異なる機能が混在している。より細粒度の枠１２０，１３０の単位であれば、それぞれの機能が別々のクラスタに所属し、より適切なクラスタであるといえる。プログラム間の依存関係によるクラスタリングでは、人が言葉から解釈する意味は考慮に入れないためこうしたことが起こる。
【００２２】
一方、ソフトウェアクラスタリングの手法として、プログラム間の依存関係を用いる方法ではなく、ソースファイル（プログラム）のコメントや識別子に用いられる語彙によってソースファイルを意味的にクラスタリングするものがある（従来技術２）。従来技術２では、似た目的のソースファイルを集められることが期待される。なお、従来技術２については、例えば、下記非特許文献１を参照することができる。
【００２３】
非特許文献１：Ｋｕｈｎ，Ａ．，Ｄｕｃａｓｓｅ，Ｓ．，＆  Ｇｉｒｂａ，Ｔ．（２００７）．Ｓｅｍａｎｔｉｃ  ｃｌｕｓｔｅｒｉｎｇ：  Ｉｄｅｎｔｉｆｙｉｎｇ  ｔｏｐｉｃｓ  ｉｎ  ｓｏｕｒｃｅ  ｃｏｄｅ．  Ｉｎｆｏｒｍａｔｉｏｎ  ａｎｄ  Ｓｏｆｔｗａｒｅ  Ｔｅｃｈｎｏｌｏｇｙ，４９（３），２３０−２４３．
【００２４】
従来技術２は、各プログラムの語彙を利用しているため、人が見て意味的に類似性があると認識されるプログラムを集めるという意味では良い特性を持っている。しかしながら、従来技術２では、得られたクラスタ内のプログラム間に直接の呼出関係があるとは限らない。このため、設計時のパッケージの中にどのような話題を扱うプログラムが入っているかを調べるといったことには有用だが、ある機能を実現するプログラムの集合を抽出することに向いているとはいえない。
【００２５】
また、依存関係と語彙（意味）の両方の情報を利用するソフトウェアクラスタリングの手法として、例えば、依存関係によってアーキテクチャ階層を発見したのちに、その各階層に属するプログラム群を語彙によってクラスタリングするものがある（従来技術３）。なお、従来技術３については、例えば、下記非特許文献２を参照することができる。
【００２６】
非特許文献２：Ｓｃａｎｎｉｅｌｌｏ，Ｇ．，Ｄ’Ａｍｉｃｏ，Ａ．，Ｄ’Ａｍｉｃｏ，Ｃ．，＆  Ｄ’Ａｍｉｃｏ，Ｔ．（２０１０）．Ｕｓｉｎｇ  ｔｈｅ  Ｋｌｅｉｎｂｅｒｇ  ａｌｇｏｒｉｔｈｍ  ａｎｄ  ｖｅｃｔｏｒ  ｓｐａｃｅ  ｍｏｄｅｌ  ｆｏｒ  ｓｏｆｔｗａｒｅ  ｓｙｓｔｅｍ  ｃｌｕｓｔｅｒｉｎｇ．Ｉｎ  ＩＥＥＥ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐｒｏｇｒａｍ  Ｃｏｍｐｒｅｈｅｎｓｉｏｎ  （ｐｐ．  １８０−１８９）．
【００２７】
従来技術３では、Ｋｌｅｉｎｂｅｒｇアルゴリズムでプログラムをアーキテクチャ階層に分類したのち、その各階層に対して、含まれるプログラムごとに単語のｔｆ−ｉｄｆ値を計算して構成したベクトルを、ｋ−ｍｅａｎｓ法でクラスタリングする。
【００２８】
しかしながら、従来技術３は、ソフトウェア全体が階層構造として設計されているときのみ有効である。また、従来技術３は、各層の中のクラスタリングを語彙のみで行っているため、従来技術２と同様に、クラスタ内のプログラム間に直接の呼出関係があるとは限らない。さらに、階層間のつながりはクラスタの単位に考慮されないため、アーキテクチャ階層を越えて一つの機能を抽出できない。
【００２９】
また、従来技術３と同様に、依存関係と意味的情報とを併用する手法として、既存のＪａｖａ（登録商標）プログラムのパッケージ設計を見直すために、メソッドの呼出関係とメソッドで使われる語彙の類似度とを用いた評価式でクラス間のつながりの強さを求め、それによってパッケージを構成するクラス間の推移閉包を求めてパッケージを再分割するものがある（従来技術４）。なお、従来技術４については、例えば、下記非特許文献３を参照することができる。
【００３０】
非特許文献３：Ｂａｖｏｔａ，Ｇ．，Ｄｅ  Ｌｕｃｉａ，Ａ．，Ｍａｒｃｕｓ，Ａ．，  ＆  Ｏｌｉｖｅｔｏ，  Ｒ．（２０１３）．Ｕｓｉｎｇ  ｓｔｒｕｃｔｕｒａｌ  ａｎｄ  ｓｅｍａｎｔｉｃ  ｍｅａｓｕｒｅｓ  ｔｏ  ｉｍｐｒｏｖｅ  ｓｏｆｔｗａｒｅ  ｍｏｄｕｌａｒｉｚａｔｉｏｎ．Ｅｍｐｉｒｉｃａｌ  Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ，１８（５），９０１−９３２．
【００３１】
従来技術４は、パッケージを分割するものであるが、パッケージはソフトウェア設計上のアーキテクチャ階層が反映されることが多い。このため、従来技術３と同じくアーキテクチャ上の同階層の中でより小さな分割を求める手法とみなせる。すなわち、従来技術４は、複数のパッケージを跨って、ある機能を実現するプログラムのまとまりを得るという用途には用いられない。
【００３２】
このように、上述したような従来技術では、機能を実現しているグループへとソフトウェアＳＷを分割するという目的のために、複数の機能と認識されるものが一つのクラスタに同居するという問題は解決することができない。
【００３３】
そこで、本実施の形態では、ソフトウェアＳＷから依存関係によるつながりがあり、かつ、意味的にまとまりが良い構成要素のかたまりを分割して、ソフトウェアＳＷの機能を実現する構成要素の集合を抽出可能にする分割方法について説明する。以下、分析装置１００の処理例について説明する。
【００３４】
（１）分析装置１００は、ソフトウェアＳＷの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアＳＷの構成要素群を複数のクラスタに分割する。具体的には、例えば、分析装置１００は、プログラムを節点とし、プログラム間の依存関係を辺とする有向グラフに対してグラフクラスタリング技術を適用することで、依存関係が密な部分グラフを、クラスタとして分割する。
【００３５】
図１の例では、ソフトウェアＳＷを分割して得られる複数のクラスタのうちの一つのクラスタとして、枠１１０内のプログラム群を含むクラスタ（以下、「クラスタ１１０」という）が得られた場合を想定する。
【００３６】
（２）分析装置１００は、分割した複数のクラスタに含まれるクラスタについて、ソフトウェアＳＷの構成要素群の各構成要素における単語に基づいて、当該クラスタの意味的凝集度を算出する。ここで、構成要素における単語とは、例えば、プログラムの識別子、コメントなどのテキストから抽出される単語である。
【００３７】
また、クラスタの意味的凝集度とは、クラスタの意味的なまとまりの良さを示す指標値である。意味的にまとまりが良いクラスタとは、構成要素における単語から解釈される意味が同じ、あるいは、類似している構成要素の集合である。意味的凝集度は、例えば、既存のトピックモデリング技術を用いて定義することができる。トピックモデリングとは、自然言語を対象とした機械学習の技法であり、文書に内在する話題（トピック）を、各文書の単語の出現頻度を用いて自動的にモデル化するものである。
【００３８】
トピックモデリングとしては、例えば、ＬＳＡ（Ｌａｔｅｎｔ  Ｓｅｍａｎｔｉｃ  Ａｎａｌｙｓｉｓ）や、ＬＤＡ（Ｌａｔｅｎｔ  Ｄｉｒｉｃｈｌｅｔ  Ａｌｌｏｃａｔｉｏｎ）などの技法がある。なお、ＬＤＡによるトピックモデリングについては、例えば、下記非特許文献４を参照することができる。
【００３９】
非特許文献４：Ｂｌｅｉ，Ｄ．Ｍ．，Ｎｇ，Ａ．Ｙ．，＆  Ｊｏｒｄａｎ，Ｍ．Ｉ．（２００３）．Ｌａｔｅｎｔ  Ｄｉｒｉｃｈｌｅｔ  Ａｌｌｏｃａｔｉｏｎ．  Ｊｏｕｒｎａｌ  ｏｆ  Ｍａｃｈｉｎｅ  Ｌｅａｒｎｉｎｇ  Ｒｅｓｅａｒｃｈ，３，９９３−１０２２．
【００４０】
ＬＤＡによるトピックモデリングでは、文書群に含まれる単語の出現頻度に基づいて、各文書が扱う「トピック」を確率的なモデルとして自動的に学習する。学習の結果として、文書ごとに、どのトピックをどれだけの比率で含むかが得られる。例えば、文書Ａが含むトピックは、トピック１が２０％、トピック２が９％、トピック３が６％、…といったトピック比率が文書ごとに得られる。
【００４１】
ここでは、このトピックモデリングを用いて、クラスタの意味的凝集度を、下記式（１）のように定義する。下記式（１）は、クラスタＣｋに対して、クラスタＣｋに属する任意の２つの構成要素（プログラム）ｄｉ，ｄｊのトピックベクトルＤdi，Ｄdjの類似度の最小値を、クラスタＣｋの意味的凝集度Ｍkとすることを表している。
【００４２】
【数１】
2019106128.tif 000003
【００４３】
ここで、プログラムｄｉのトピックベクトルＤdiは、プログラムｄｉの単語群をトピックモデリングで学習した際の構成トピックの比率をトピックごとに並べたベクトルであり、下記式（２）を用いて表される。ただし、ｒdit1は、文書（プログラム）ｄｉにおけるトピックｔ１の比率（０以上１以下）である。Ｎは、トピック学習の際に用いたトピック数（例えば、２０）である。
【００４４】
【数２】
2019106128.tif 000004
【００４５】
また、２つのトピックベクトルの類似度（上記式（１）の関数ｓｉｍｉｌａｒｉｔｙ）には、下記式（３）のように、ベクトルのなす角のコサインを用いる。ただし、・は、内積である。また、｜｜Ｖ｜｜は、ユークリッド距離である。なお、コサイン以外の類似度を用いて意味的凝集度を算出してもよい。
【００４６】
【数３】
2019106128.tif 000005
【００４７】
上記式（１）〜（３）の定性的な意味は、クラスタＣｋ内のプログラムがみな同じようなトピックを含んでいると意味的凝集度が高くなり、クラスタＣｋにトピック分布が他と大きく異なるプログラムが含まれていると意味的凝集度が低くなるということである。図１の例では、クラスタ１１０の意味的凝集度Ｍ110が算出された場合を想定する。
【００４８】
（３）分析装置１００は、算出したクラスタの意味的凝集度が、予め設定された条件を満たさない場合、クラスタに含まれる構成要素群を複数のクラスタに分割する。ここで、条件は、任意に設定可能であり、例えば、意味的凝集度が閾値以上であるかといった条件が設定される。
【００４９】
同一機能を実現するプログラムであれば、同じような単語が使われ、同じようなトピックを含んでいるといえる。換言すれば、一つのクラスタに複数の機能が同居していれば、当該クラスタに属するプログラム間で異なる単語が使われ、トピック分布が大きく異なるものとなり、意味的凝集度が低くなるといえる。この特徴を利用して、一つのクラスタに複数の機能が同居しているか否かを判断する。
【００５０】
図１の例では、クラスタ１１０の意味的凝集度Ｍ110が、予め設定された条件を満たさない場合を想定する。この場合、分析装置１００は、クラスタ１１０に含まれるプログラム群を複数のクラスタに分割する。すなわち、分析装置１００は、クラスタ１１０をより細かい単位に分割する。
【００５１】
クラスタをより細かい単位に分割する方法としては、例えば、クラスタの階層情報（デンドログラム）を利用して、図３に示すような、クラスタ階層のより下位へと分割の位置を修正する手法を用いることができる。クラスタの階層情報は、例えば、最初の依存関係に基づくクラスタリングを階層的なアルゴリズムによって行うことで、その計算過程で得ることができる。
【００５２】
図３は、クラスタ階層の一例を示す説明図である。図３において、グラフ３００は、クラスタリング対象の個々の構成要素とそれを順々にまとめ上げていったクラスタの階層を木構造として表した樹状図(デンドログラム)である。グラフ３００の最下位のノード群は、クラスタリング対象の構成要素にあたる。また、グラフ３００の中間の各階層のノード群は、構成要素をまとめて作成したクラスタにあたる。
【００５３】
例えば、分析装置１００は、クラスタ１１０の意味的凝集度Ｍ110が、予め設定された条件を満たさないため、クラスタ１１０を、デンドログラムの１段階下位の単位である枠１２０，１３０の単位で分割する。これは、グラフ３００においては、分割する位置を、依存関係により最適と評価される箇所（点線）から１段階下（破線）へ移動することを意味する。具体的には、クラスタ１１０が、枠１２０内のプログラム群を含むクラスタ（以下、「クラスタ１２０」という）と、枠１３０内のプログラム群を含むクラスタ（以下、「クラスタ１３０」という）とに分割される。
【００５４】
また、分析装置１００は、クラスタ１１０から分割したクラスタ１２０，１３０についても、各クラスタ１２０，１３０の意味的凝集度Ｍ120,130を算出することにしてもよい。そして、分析装置１００は、算出した意味的凝集度Ｍ120,130が、予め設定された条件を満たさない場合には、各クラスタ１２０，１３０をさらに細かく分割することにしてもよい。
【００５５】
なお、上記（３）において、クラスタ１１０の意味的凝集度Ｍ110が、予め設定された条件を満たす場合には、分析装置１００は、クラスタ１１０を一つの構成要素集合に決定する。すなわち、クラスタ１１０の意味的凝集度Ｍ110が条件を満たす場合は、クラスタ１１０をこれ以上分割せず、クラスタ単位として確定する。クラスタ１２０，１３０についても同様である。
【００５６】
このように、分析装置１００によれば、依存関係によるつながりがあり、かつ、意味的にまとまりが良い構成要素集合を抽出することができる。これにより、複数の機能と認識される構成要素が一つのクラスタに同居するのを防いで、ソフトウェアＳＷの機能を実現する構成要素のまとまりを機能単位で把握可能にすることができる。
【００５７】
図１の例では、ソフトウェアＳＷの構成要素間の依存関係に基づくクラスタリングにより得られたクラスタ１１０をさらに分割して、クラスタ１２０，１３０を得ることができる。クラスタ１２０，１３０は、図２に示した「契約入力業務」、「一括契約入力業務」というそれぞれ異なる機能に対応する構成要素集合である。これにより、「契約入力業務」、「一括契約入力業務」という機能を実現する構成要素のまとまりを機能単位で把握可能となる。この結果、例えば、「契約入力業務」および「一括契約入力業務」の各機能を独立して動作可能なサービスとして分割・再配置したり、不要な機能を統廃合したり、一部の機能を外部サービスに置き換えたりすることが可能となる。
【００５８】
（分析装置１００のハードウェア構成例）
図４は、分析装置１００のハードウェア構成例を示すブロック図である。図４において、分析装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、メモリ４０２と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０３と、ディスクドライブ４０４と、ディスク４０５と、を有する。また、各構成部は、バス４００によってそれぞれ接続される。
【００５９】
ここで、ＣＰＵ４０１は、分析装置１００の全体の制御を司る。メモリ４０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ４０１のワークエリアとして使用される。メモリ４０２に記憶されるプログラムは、ＣＰＵ４０１にロードされることで、コーディングされている処理をＣＰＵ４０１に実行させる。
【００６０】
Ｉ／Ｆ４０３は、通信回線を通じてネットワークに接続され、ネットワークを介して外部のコンピュータに接続される。そして、Ｉ／Ｆ４０３は、ネットワークと装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。ネットワークは、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどである。Ｉ／Ｆ４０３には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００６１】
ディスクドライブ４０４は、ＣＰＵ４０１の制御に従ってディスク４０５に対するデータのリード／ライトを制御する。ディスク４０５は、ディスクドライブ４０４の制御で書き込まれたデータを記憶する。ディスク４０５としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００６２】
なお、分析装置１００は、上述した構成部のほかに、例えば、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、入力装置、ディスプレイ等を有することにしてもよい。
【００６３】
（プログラム間の依存関係）
つぎに、ソフトウェアＳＷに含まれるプログラム間の依存関係について説明する。
【００６４】
図５は、プログラム間の依存関係の一例を示す説明図である。図５において、グラフ５００は、ソフトウェアＳＷに含まれるプログラム間の依存関係の一例を示している。図５中、一つ一つの長方形は、ソフトウェアＳＷに含まれるプログラムのソースファイルに相当する。
【００６５】
また、プログラム間をつなぐ矢印は、プログラム間の依存関係を表している。ただし、図５では、ソフトウェアＳＷのうちの一部のプログラムのみ表示している。例えば、プログラムＫＹ０１からプログラムＫＹ０２に向かう矢印は、プログラムＫＹ０１がプログラムＫＹ０２を呼び出すことを表している。
【００６６】
（依存関係情報の具体例）
つぎに、分析装置１００が用いる依存関係情報について説明する。依存関係情報は、ソフトウェアＳＷに含まれるプログラム間の依存関係を示す情報である。ここでは、図５に示したグラフ５００に対応する依存関係情報を例に挙げて説明する。
【００６７】
図６は、依存関係情報の具体例を示す説明図である。図６において、依存関係情報６００は、依存元と依存先とを対応付けて示す情報である。ここで、依存元は、依存元の構成要素を示す。ここでは、依存元として、依存元の構成要素のプログラム名とプログラムＩＤとが示されている。また、依存先は、依存先の構成要素を示す。ここでは、依存先として、依存先の構成要素のプログラム名とプログラムＩＤとが示されている。ただし、図６では、ソフトウェアＳＷのうちの一部のプログラム間の依存関係についてのみ表示している。
【００６８】
例えば、依存元「契約入力画面ＫＹ０１」は、依存元の構成要素のプログラム名「契約入力画面」とプログラムＩＤ「ＫＹ０１」とを示す。また、依存先「契約入力処理ＫＹ０２」は、依存先の構成要素のプログラム名「契約入力処理」とプログラムＩＤ「ＫＹ０２」とを示す。
【００６９】
（単語情報の具体例）
つぎに、分析装置１００が用いる単語情報について説明する。単語情報は、ソフトウェアＳＷに含まれるプログラムの単語（キーワード）を示す情報である。
【００７０】
図７は、単語情報の具体例を示す説明図である。図７において、単語情報７００は、プログラムＩＤとキーワードとを対応付けて示す情報である。ここで、プログラムＩＤは、ソフトウェアＳＷに含まれるプログラムを一意に識別する識別情報である。キーワードは、プログラムのコメント、識別子などのテキストから抽出された単語である。ただし、図７では、ソフトウェアＳＷのうちの一部のプログラムの単語についてのみ表示している。
【００７１】
（分析装置１００の機能的構成例）
図８は、分析装置１００の機能的構成例を示すブロック図である。図８において、分析装置１００は、取得部８０１と、第１の分割部８０２と、算出部８０３と、判断部８０４と、第２の分割部８０５と、決定部８０６と、出力部８０７と、を含む。取得部８０１〜出力部８０７は制御部となる機能であり、具体的には、例えば、図４に示したメモリ４０２、ディスク４０５などの記憶装置に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０３により、その機能を実現する。各機能部の処理結果は、例えば、メモリ４０２、ディスク４０５などの記憶装置に記憶される。
【００７２】
取得部８０１は、ソフトウェアＳＷの依存関係情報を取得する。ここで、依存関係情報は、ソフトウェアＳＷに含まれるプログラム間の依存関係を示す情報であり、例えば、図６に示した依存関係情報６００である。具体的には、例えば、取得部８０１は、外部のコンピュータからソフトウェアＳＷの依存関係情報６００を受信することにより、ソフトウェアＳＷの依存関係情報６００を取得することにしてもよい。また、取得部８０１は、例えば、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアＳＷの依存関係情報６００を取得することにしてもよい。
【００７３】
なお、ソフトウェアＳＷの依存関係情報は、分析装置１００において生成されることにしてもよい。具体的には、例えば、まず、分析装置１００は、分析対象となるソフトウェアＳＷのソースコードを取得する。つぎに、分析装置１００は、ソフトウェアＳＷのソースコードを解析して、ソフトウェアＳＷ内のプログラム間の依存関係を示す依存関係情報を生成する。より詳細に説明すると、分析装置１００は、例えば、既存の構文解析技術および静的解析技術により、ソフトウェアＳＷのソースコードを解析し、ソフトウェアＳＷ内のプログラム間の依存関係を抽出する。これにより、分析装置１００は、図６に示したような依存関係情報６００を生成することができる。
【００７４】
また、取得部８０１は、ソフトウェアＳＷの単語情報を取得する。ここで、単語情報は、ソフトウェアＳＷに含まれるプログラムの単語（キーワード）を示す情報であり、例えば、図７に示した単語情報７００である。具体的には、例えば、取得部８０１は、外部のコンピュータからソフトウェアＳＷの単語情報７００を受信することにより、ソフトウェアＳＷの単語情報７００を取得することにしてもよい。また、取得部８０１は、例えば、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアＳＷの単語情報７００を取得することにしてもよい。
【００７５】
なお、ソフトウェアＳＷの単語情報は、分析装置１００において生成されることにしてもよい。具体的には、例えば、分析装置１００は、ソフトウェアＳＷのソースコードを解析して、ソフトウェアＳＷに含まれる各プログラムの単語を示す単語情報を生成する。より詳細に説明すると、分析装置１００は、例えば、既存の構文解析技術および静的解析技術により、ソフトウェアＳＷのソースコードを解析し、プログラムのコメント、識別子などのテキストから、名前や処理内容などの単語を抽出する。これにより、分析装置１００は、図７に示したような単語情報７００を生成することができる。
【００７６】
第１の分割部８０２は、ソフトウェアＳＷの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアＳＷの構成要素群を複数のクラスタに分割する。具体的には、例えば、第１の分割部８０２は、取得された依存関係情報６００に基づいて、ソフトウェアＳＷのプログラム群を複数のクラスタに分割する。より詳細に説明すると、例えば、第１の分割部８０２は、依存関係に関する重みに基づいて、依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、ソフトウェアＳＷのプログラム群を複数のクラスタに分割する。
【００７７】
この際、第１の分割部８０２は、例えば、階層的なクラスタリングを行うことにしてもよい。より詳細に説明すると、まず、第１の分割部８０２は、距離の最も近い２つのプログラム（例えば、依存関係が最も強い２つのプログラム）を最初にクラスタとしてまとめる。つぎに、第１の分割部８０２は、作成した小さなクラスタと、次に距離の近い他のプログラム、あるいは、別の小さなクラスタをまとめて、より大きなクラスタを作成する。以降同様の手順で、第１の分割部８０２は、より大きなクラスタを順次作成していく。この際、計算過程として、クラスタリング対象の個々のプログラムとそれを順々にまとめ上げていったクラスタ階層を木構造として表した樹状図(デンドログラム)がクラスタ階層情報として作成される。
【００７８】
これにより、例えば、図９に示すようなクラスタ情報９００が分割結果として出力されるとともに、図１０に示すようなクラスタ階層情報１０００が出力される。なお、ソフトウェアＳＷを構成要素間の依存関係に基づいて複数のクラスタに分割する具体的な処理内容については、例えば、特開２０１３−１４８９８７号公報を参照することができる。
【００７９】
ここで、図９および図１０を用いて、クラスタ情報およびクラスタ階層情報の具体例について説明する。
【００８０】
図９は、クラスタ情報の具体例を示す説明図である。図９において、クラスタ情報９００は、クラスタＩＤとプログラムＩＤとを対応付けて示す情報である。ここで、クラスタＩＤは、クラスタを一意に識別する識別情報である。プログラムＩＤは、プログラムを一意に識別する識別情報である。ただし、図９では、クラスタＩＤ「Ｃ１」のクラスタＣ１のみ網羅的に示している。
【００８１】
クラスタ情報９００によれば、ソフトウェアＳＷのプログラム群をプログラム間の依存関係をもとに分割して得られた各クラスタに属するプログラムを特定することができる。
【００８２】
図１０は、クラスタ階層情報の具体例を示す説明図である。図１０において、クラスタ階層情報１０００は、クラスタリング対象の個々のプログラムとそれを順々にまとめ上げていったクラスタの階層を木構造として表した樹状図(デンドログラム)である。クラスタ階層情報１０００の最下位のノード群は、クラスタリング対象のプログラムにあたる。また、クラスタ階層情報１０００の中間の各階層のノード群は、プログラムをまとめて作成したクラスタにあたる。ただし、図１０では、クラスタＩＤ「Ｃ１」のクラスタＣ１のみ網羅的に示している。
【００８３】
図８の説明に戻り、算出部８０３は、ソフトウェアＳＷの構成要素群の各構成要素における単語に基づいて、第１の分割部８０２によって分割して得られたクラスタの意味的凝集度を算出する。ここで、構成要素における単語は、例えば、プログラムの識別子、コメントなどのテキストから抽出した単語群である。また、クラスタの意味的凝集度は、クラスタの意味的なまとまりの良さを示す指標値である。
【００８４】
具体的には、例えば、算出部８０３は、ソフトウェアＳＷのプログラム群の各プログラムにおける単語の出現頻度に基づいて、各プログラムについて、予め設定された所定数の各トピックを各プログラムが含む確率を算出する。トピックとは、プログラムで扱われる話題である。所定数は、任意に設定可能であり、例えば、２０程度の数に設定される。つぎに、算出部８０３は、算出した各プログラムについての各トピックの確率に基づいて、クラスタに含まれるプログラム間の類似度を算出する。そして、算出部８０３は、算出したプログラム間の類似度に基づいて、クラスタの意味的凝集度を算出する。
【００８５】
ここで、クラスタＩＤ「Ｃ１」のクラスタＣ１を例に挙げて、クラスタＣ１の意味的凝集度を算出する処理例についてより具体的に説明する。まず、算出部８０３は、取得された単語情報７００に基づいて、既存のトピックモデリングを用いて、ソフトウェアＳＷのプログラム群の各プログラムについて、所定数の各トピックのトピック比率を算出する。トピック比率は、各トピックをプログラムが含む確率である。
【００８６】
トピックモデリングにあたり、各プログラムをＬＤＡにおける文書とみなし、単語情報７００から特定される各プログラムの単語群を、各文書に含まれる単語群とみなして学習を行う。トピックの数は、学習時に任意に設定可能である。例えば、トピック数を「２０」として学習すると、トピック１からトピック２０まで存在することになり、プログラムごとに各トピック１〜２０のトピック比率が得られる。
【００８７】
ここで、トピック比率情報の具体例について説明する。トピック比率情報は、ソフトウェアＳＷに含まれるプログラムごとのトピック比率を示す情報である。
【００８８】
図１１は、トピック比率情報の具体例を示す説明図である。図１１において、トピック比率情報１１００は、プログラムのプログラムＩＤと対応付けて、各トピックのトピックＩＤおよび比率を示す。トピックＩＤは、トピックを一意に識別する識別情報である。比率は、トピック比率である。ただし、図１１では、プログラムごとに、比率の高い上位３個のトピックの比率のみ示している。
【００８９】
例えば、プログラムＫＹ０１について、比率の高い上位３個のトピックは、トピック１，２，３である。そして、トピック１の比率は「０．３１」、トピック２の比率は「０．１１」、トピック３の比率は「０．０９」である。
【００９０】
つぎに、算出部８０３は、トピック比率情報１１００に基づいて、クラスタＣ１に含まれるプログラム間の類似度を算出する。より具体的には、例えば、算出部８０３は、上記式（２）を用いて、クラスタＣ１に含まれるプログラムｄｉごとに、トピック比率情報１１００から特定される各トピックの比率を並べたトピックベクトルＤdiを生成する。そして、算出部８０３は、生成したプログラムｄｉごとのトピックベクトルＤdiに基づいて、上記式（３）を用いて、クラスタＣ１内のプログラム間の類似度を算出する。
【００９１】
ここで、類似度行列の具体例について説明する。類似度行列は、クラスタ内のプログラム間の類似度を示す情報である。
【００９２】
図１２は、類似度行列の具体例を示す説明図（その１）である。図１２において、類似度行列１２００は、クラスタＣ１内のプログラム間の類似度を示す情報である。類似度行列１２００において、縦横の各要素はプログラムＩＤであり、交点の数値は当該プログラム間の類似度である。ただし、類似度は対称であり、右上部分は左下部分と同じ値となるため表示を省略する。また、同じプログラム同士の類似度は「１」のため表示を省略する。
【００９３】
例えば、プログラムＫＹ０１とプログラムＫＹ０２との類似度は「０．９５」である。また、プログラムＫＹ０２とプログラムＫＹ０３との類似度は「０．９０」である。
【００９４】
そして、算出部８０３は、算出したプログラム間の類似度に基づいて、上記式（１）を用いて、クラスタＣ１の意味的凝集度を算出する。ここで、類似度行列１２００から特定されるプログラム間の類似度の最小値は、プログラムＩＫ０２とプログラムＫＹ０４との類似度「０．６６」である。このため、クラスタＣ１の意味的凝集度は、「０．６６」となる。
【００９５】
なお、ここでは、クラスタＣ１の意味的凝集度として、クラスタＣ１内のプログラム間の類似度の最小値を用いる場合を例に挙げて説明したが、これに限らない。例えば、クラスタＣ１の意味的凝集度として、クラスタＣ１内のプログラム間の類似度の平均値を用いることにしてもよい。
【００９６】
判断部８０４は、算出されたクラスタの意味的凝集度が、予め設定された条件Ｐを満たすか否かを判断する。ここで、条件Ｐは、クラスタが意味的にまとまりのあるものであるといえるかを判断するための条件であり、任意に設定可能である。ここでは、条件Ｐとして、クラスタの意味的凝集度が閾値α以上であるかという条件が設定された場合を想定する。閾値αは、任意に設定可能であり、例えば、経験的に設定される。
【００９７】
一例として、閾値αを「α＝０．７」とする。この場合、クラスタＣ１の意味的凝集度「０．６６」は、閾値α未満となる。このため、判断部８０４は、クラスタＣ１の意味的凝集度「０．６６」が条件Ｐを満たさないと判断する。なお、クラスタＣ１の意味的凝集度が閾値α以上の場合には、判断部８０４は、クラスタＣ１の意味的凝集度が条件Ｐを満たすと判断する。
【００９８】
第２の分割部８０５は、クラスタの意味的凝集度が条件Ｐを満たさないと判断された場合、当該クラスタに含まれる構成要素群を複数のクラスタに分割する。具体的には、例えば、第２の分割部８０５は、クラスタＣ１の意味的凝集度が条件Ｐを満たさない場合、クラスタＣ１に含まれるプログラム群を複数のクラスタに分割する。すなわち、第２の分割部８０５は、クラスタＣ１をより細かい単位に分割する。
【００９９】
より詳細に説明すると、第２の分割部８０５は、例えば、図１０に示したクラスタ階層情報１０００に基づいて、クラスタＣ１に含まれるプログラム群を複数のクラスタに分割することにしてもよい。また、第２の分割部８０５は、例えば、上述した従来技術２を利用して、クラスタＣ１に含まれる各プログラムの単語によって、クラスタＣ１に含まれるプログラム群を意味的にクラスタリングすることにしてもよい。
【０１００】
ここで、図１３を用いて、クラスタＣ１の分割例について説明する。ここでは、クラスタ階層情報１０００に基づいて、クラスタ階層のより下位へと分割の位置を修正して、クラスタＣ１に含まれるプログラム群を複数のクラスタに分割する場合について説明する。
【０１０１】
図１３は、クラスタの分割例を示す説明図である。第２の分割部８０５は、クラスタ階層情報１０００に基づいて、クラスタＣ１に含まれるプログラム群を１段階下位の単位で分割する。具体的には、第２の分割部８０５は、クラスタＣ１を、クラスタＣ１−１とクラスタＣ１−２とに分割する。
【０１０２】
クラスタＣ１−１は、プログラムＫＹ０１と、プログラムＫＹ０２と、プログラムＫＹ０３と、プログラムＫＹ０４と、を含む。クラスタＣ１−２は、プログラムＩＫ０１と、プログラムＩＫ０２と、プログラムＩＫ０３と、プログラムＩＫ０４と、プログラムＩＫ０５と、を含む。
【０１０３】
これにより、意味的凝集度が条件Ｐを満たさないクラスタＣ１を、より細かい単位であるクラスタＣ１−１とクラスタＣ１−２とに分割することができる。
【０１０４】
また、算出部８０３は、第２の分割部８０５によって分割して得られたクラスタ（分割後のクラスタ）の意味的凝集度を算出する。なお、分割後のクラスタの意味的凝集度を算出する具体的な処理内容は、第１の分割部８０２によって分割されたクラスタの意味的凝集度を算出する場合と同様のため、詳細な説明を省略する。
【０１０５】
また、判断部８０４は、算出された分割後のクラスタの意味的凝集度が条件Ｐを満たすか否かを判断する。そして、第２の分割部８０５は、分割後のクラスタの意味的凝集度が条件Ｐを満たさないと判断された場合、当該クラスタに含まれる構成要素群を複数のクラスタに分割する。
【０１０６】
すなわち、分析装置１００は、分割後のクラスタの意味的凝集度が条件Ｐを満たすまで、当該クラスタを再帰的に分割していく。なお、どれだけ細かい単位まで分割可能にするかは、任意に設定可能である。例えば、クラスタ階層の最下位の階層よりもＫ階層上位の階層までの分割を可能にしてもよい（Ｋは、例えば、１〜３程度）。また、例えば、プログラムの数が少なくとも２以上となるクラスタへの分割を可能にしてもよい。
【０１０７】
ここで、図１４および図１５を用いて、クラスタＣ１を分割して得られた分割後のクラスタＣ１−１，Ｃ１−２内のプログラム間の類似度を示す類似度行列について説明する。
【０１０８】
図１４は、類似度行列の具体例を示す説明図（その２）である。また、図１５は、類似度行列の具体例を示す説明図（その３）である。図１４において、類似度行列１４００は、クラスタＣ１−１内のプログラム間の類似度を示す情報である。また、図１５において、類似度行列１５００は、クラスタＣ１−２内のプログラム間の類似度を示す情報である。
【０１０９】
ここで、類似度行列１４００から特定されるプログラム間の類似度の最小値は、プログラムＫＹ０２とプログラムＫＹ０４との類似度「０．８５」である。このため、クラスタＣ１−１の意味的凝集度は、「０．８５」となる。また、類似度行列１５００から特定されるプログラム間の類似度の最小値は、プログラムＩＫ０２とプログラムＩＫ０５との類似度「０．８６」である。このため、クラスタＣ１−２の意味的凝集度は、「０．８６」となる。
【０１１０】
閾値αを「α＝０．７」とすると、クラスタＣ１−１の意味的凝集度「０．８５」は、閾値α以上となる。このため、判断部８０４は、クラスタＣ１−１の意味的凝集度が条件Ｐを満たすと判断する。また、クラスタＣ１−２の意味的凝集度「０．８６」は、閾値α以上となる。このため、判断部８０４は、クラスタＣ１−２の意味的凝集度が条件Ｐを満たすと判断する。
【０１１１】
図８の説明に戻り、決定部８０６は、第１の分割部８０２によって分割されたクラスタの意味的凝集度が条件Ｐを満たす場合には、クラスタを一つの構成要素集合に決定する。また、決定部８０６は、第２の分割部８０５によって分割されたクラスタの意味的凝集度が条件Ｐを満たす場合には、クラスタを一つの構成要素集合に決定する。
【０１１２】
ここで、一つの構成要素集合とは、ある機能を実現する構成要素の集合である。すなわち、決定部８０６は、クラスタの意味的凝集度が条件Ｐを満たす場合は、当該クラスタをこれ以上分割せず、クラスタ単位として確定する。これにより、ある機能を実現するプログラムのまとまりであるクラスタを得ることができる。
【０１１３】
出力部８０７は、決定した構成要素集合に含まれる構成要素を示す情報を出力する。具体的には、例えば、出力部８０７は、クラスタ定義情報を出力することにしてもよい。クラスタ定義情報は、一つの構成要素集合として決定されたクラスタを識別する識別情報と、当該クラスタに含まれる構成要素を識別する識別情報とを対応付けた情報である。
【０１１４】
クラスタ定義情報の具体例については、図１５を用いて後述する。なお、出力部８０７の出力形式としては、例えば、メモリ４０２、ディスク４０５などの記憶装置への記憶、Ｉ／Ｆ４０３による他のコンピュータへの送信、不図示のディスプレイへの表示、不図示のプリンタへの印刷出力などがある。
【０１１５】
また、出力部８０７は、クラスタ定義情報に基づいて、ソフトウェアＳＷのクラスタリング結果を地図形式で出力することにしてもよい。より詳細に説明すると、例えば、出力部８０７は、プログラムを建物として表し、同一クラスタ内のプログラムを表す建物の集合を区画として地図上に表示することにしてもよい。この際、プログラム間の依存関係を、建物間をつなぐ曲線等によって表すことにしてもよい。
【０１１６】
なお、上述した説明では、第１の分割部８０２が、ソフトウェアＳＷの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアＳＷの構成要素群を複数のクラスタに分割することにしたが、これに限らない。例えば、第１の分割部８０２は、他のコンピュータから、ソフトウェアＳＷの構成要素間の依存関係に基づくクラスタリング結果を示すクラスタ情報（例えば、クラスタ情報９００）を取得することにしてもよい。
【０１１７】
（クラスタ定義情報の具体例）
つぎに、クラスタ定義情報の具体例について説明する。
【０１１８】
図１６は、クラスタ定義情報の具体例を示す説明図である。図１６において、クラスタ定義情報１６００は、クラスタＩＤとプログラムＩＤとを対応付けて示す情報である。ここで、クラスタＩＤは、一つの構成要素集合として決定されたクラスタを一意に識別する識別情報である。プログラムＩＤは、一つの構成要素集合として決定されたクラスタに属するプログラムを一意に識別する識別情報である。
【０１１９】
クラスタ定義情報１６００によれば、ユーザは、ソフトウェアＳＷの機能を実現するプログラムのまとまりを機能単位で把握することができる。
【０１２０】
（分析装置１００の分析処理手順）
つぎに、分析装置１００の分析処理手順について説明する。
【０１２１】
図１７は、分析装置１００の分析処理手順の一例を示すフローチャートである。図１７において、分析装置１００は、ソフトウェアＳＷの依存関係情報と、ソフトウェアＳＷの単語情報とを取得する（ステップＳ１７０１）。つぎに、分析装置１００は、取得した依存関係情報に基づいて、ソフトウェアＳＷのプログラム群を複数のクラスタに分割する（ステップＳ１７０２）。
【０１２２】
分析装置１００は、取得した単語情報に基づいて、既存のトピックモデリングを用いて、ソフトウェアＳＷのプログラム群の各プログラムについて、所定数（例えば、２０）の各トピックのトピック比率を算出する（ステップＳ１７０３）。つぎに、分析装置１００は、ステップＳ１７０２において分割して得られた複数のクラスタのうち選択されていない未選択のクラスタを選択する（ステップＳ１７０４）。
【０１２３】
つぎに、分析装置１００は、算出した各プログラムについての各トピックのトピック確率に基づいて、選択したクラスタに含まれるプログラム間の類似度を算出する（ステップＳ１７０５）。そして、分析装置１００は、算出したプログラム間の類似度に基づいて、選択したクラスタの意味的凝集度を算出する（ステップＳ１７０６）。つぎに、分析装置１００は、クラスタ決定処理を実行する（ステップＳ１７０７）。
【０１２４】
クラスタ決定処理は、ステップＳ１７０４において選択されたクラスタ、または、後述の図１８のステップＳ１８０５において分割して得られる分割後のクラスタを、一つのクラスタ単位として決定するか否かを判断する処理である。クラスタ決定処理の具体的な処理手順については、図１８を用いて後述する。
【０１２５】
そして、分析装置１００は、ステップＳ１７０２において分割して得られた複数のクラスタのうち選択されていない未選択のクラスタがあるか否かを判断する（ステップＳ１７０８）。ここで、未選択のクラスタがある場合（ステップＳ１７０８：Ｙｅｓ）、分析装置１００は、ステップＳ１７０４に戻る。
【０１２６】
一方、未選択のクラスタがない場合（ステップＳ１７０８：Ｎｏ）、分析装置１００は、クラスタ定義情報を出力して（ステップＳ１７０９）、本フローチャートによる一連の処理を終了する。これにより、ソフトウェアＳＷの機能を実現するプログラムのまとまりを機能単位で把握可能なクラスタ定義情報を出力することができる。
【０１２７】
つぎに、図１８を用いて、ステップＳ１７０７のクラスタ決定処理の具体的な処理手順について説明する。
【０１２８】
図１８は、クラスタ決定処理の具体的処理手順の一例を示すフローチャートである。図１８のフローチャートにおいて、まず、分析装置１００は、算出した該当クラスタの意味的凝集度が閾値α以上であるか否かを判断する（ステップＳ１８０１）。該当クラスタは、ステップＳ１７０４において選択されたクラスタ、または、後述のステップＳ１８０５において分割して得られる分割後のクラスタである。
【０１２９】
ここで、意味的凝集度が閾値α以上の場合（ステップＳ１８０１：Ｙｅｓ）、分析装置１００は、該当クラスタを一つのクラスタ単位として決定する（ステップＳ１８０２）。そして、分析装置１００は、該当クラスタのクラスタＩＤと対応付けて、該当クラスタに含まれるプログラムのプログラムＩＤをクラスタ定義情報に登録して（ステップＳ１８０３）、クラスタ決定処理を呼び出したステップに戻る。
【０１３０】
また、ステップＳ１８０１において、意味的凝集度が閾値α未満の場合（ステップＳ１８０１：Ｎｏ）、分析装置１００は、該当クラスタをより細かい単位に分割可能であるか否かを判断する（ステップＳ１８０４）。ここで、該当クラスタを分割不能な場合（ステップＳ１８０４：Ｎｏ）、分析装置１００は、ステップＳ１８０２に移行する。
【０１３１】
一方、該当クラスタを分割可能な場合（ステップＳ１８０４：Ｙｅｓ）、分析装置１００は、クラスタ階層情報に基づいて、該当クラスタに含まれるプログラム群を複数のクラスタに分割する（ステップＳ１８０５）。そして、分析装置１００は、ステップＳ１８０５において分割して得られた分割後のクラスタに含まれるプログラム間の類似度に基づいて、分割後のクラスタの意味的凝集度を算出して（ステップＳ１８０６）、図１７に示したステップＳ１７０７に移行する。
【０１３２】
これにより、意味的凝集度が閾値α以上となるまで、クラスタをより細かい単位に分割することができる。
【０１３３】
以上説明したように、実施の形態にかかる分析装置１００によれば、ソフトウェアＳＷのプログラム群のプログラム間の依存関係に基づいて、ソフトウェアＳＷのプログラム群を複数のクラスタに分割することができる。これにより、依存関係によるつながりがあるプログラムのまとまりを、クラスタとして分割することができる。
【０１３４】
また、分析装置１００によれば、ソフトウェアＳＷのプログラム群の各プログラムにおける単語に基づいて、分割して得られたクラスタの意味的凝集度を算出することができる。これにより、各プログラムの識別子やコメントから抽出される単語をもとに、クラスタの意味的なまとまりの良さを示す指標値である意味的凝集度を算出することができる。
【０１３５】
具体的には、例えば、分析装置１００は、ソフトウェアＳＷのプログラム群の各プログラムにおける単語の出現頻度に基づいて、各プログラムについて、予め設定された所定数の各トピックを各プログラムが含む確率を算出する。つぎに、分析装置１００は、算出した各プログラムについての各トピックの確率に基づいて、クラスタに含まれるプログラム間の類似度を算出する。そして、分析装置１００は、算出したプログラム間の類似度に基づいて、クラスタの意味的凝集度を算出する。これにより、各プログラムが扱うトピック（話題）の比率をもとに得られるクラスタ内のプログラム間の類似性から、クラスタの意味的凝集度を算出することができる。
【０１３６】
また、分析装置１００によれば、分割して得られた複数のクラスタのいずれかのクラスタの意味的凝集度が、予め設定された条件Ｐを満たさない場合、当該クラスタに含まれるプログラム群を複数のクラスタに分割することができる。これにより、意味的にまとまりのあるものであるといえないクラスタを、より細かい単位に分割することができる。
【０１３７】
具体的には、例えば、分析装置１００は、クラスタの意味的凝集度が条件Ｐを満たさない場合、当該クラスタの階層構造を示す階層情報に基づいて、当該クラスタに含まれるプログラム群を複数のクラスタに分割する。これにより、クラスタの階層構造を考慮して、より細かい単位に分割することができる。
【０１３８】
また、分析装置１００によれば、クラスタの意味的凝集度が、予め設定された条件Ｐを満たす場合、当該クラスタを一つの構成要素集合に決定することができる。これにより、意味的にまとまりのあるものであるといえるクラスタについては、当該クラスタをこれ以上分割せず、クラスタ単位として確定することができる。
【０１３９】
また、分析装置１００によれば、決定した構成要素集合に含まれるプログラムを示す情報を出力することができる。これにより、依存関係によるつながりがあり、かつ、意味的にまとまりが良いプログラムの集合を示す情報を出力することができる。
【０１４０】
これらのことから、分析装置１００によれば、依存関係によるつながりがあり、かつ、意味的にまとまりが良いプログラムの集合を抽出して、ソフトウェアＳＷの機能を実現するプログラムのまとまりを機能単位で把握可能にすることができる。
【０１４１】
なお、本実施の形態で説明した分析方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析プログラムは、ハードディスク、フレキシブルディスク、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）−ＲＯＭ、ＭＯ（Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  ｄｉｓｋ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本分析プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１４２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１４３】
（付記１）ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータが実行することを特徴とする分析方法。
【０１４４】
（付記２）前記凝集度が前記条件を満たす場合には、前記クラスタを一つの構成要素集合に決定する、処理を前記コンピュータが実行することを特徴とする付記１に記載の分析方法。
【０１４５】
（付記３）決定した前記構成要素集合に含まれる構成要素を示す情報を出力する、処理を前記コンピュータが実行することを特徴とする付記２に記載の分析方法。
【０１４６】
（付記４）前記凝集度が前記条件を満たさない場合、前記クラスタの階層構造を示す階層情報に基づいて、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、ことを特徴とする付記１〜３のいずれか一つに記載の分析方法。
【０１４７】
（付記５）前記ソフトウェアの構成要素群の各構成要素における単語に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出し、
算出した前記凝集度が前記条件を満たすか否かを判断する、
処理を前記コンピュータが実行することを特徴とする付記１〜４のいずれか一つに記載の分析方法。
【０１４８】
（付記６）前記ソフトウェアの構成要素群の各構成要素における単語の出現頻度に基づいて、前記各構成要素について、所定数の各トピックを前記各構成要素が含む確率を算出し、
算出した前記各構成要素についての前記各トピックの確率に基づいて、前記クラスタに含まれる構成要素間の類似度を算出する、処理を前記コンピュータが実行し、
算出した前記構成要素間の類似度に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出することを特徴とする付記５に記載の分析方法。
【０１４９】
（付記７）前記ソフトウェアの構成要素群の各構成要素における単語は、前記各構成要素の識別子およびコメントの少なくともいずれかから抽出される単語である、ことを特徴とする付記５または６に記載の分析方法。
【０１５０】
（付記８）ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
制御部を有することを特徴とする分析装置。
【０１５１】
（付記９）ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータに実行させることを特徴とする分析プログラム。
【符号の説明】
【０１５２】
１００  分析装置
１１０，１２０，１３０，Ｃ１，Ｃ１−１，Ｃ１−２  クラスタ
３００，５００  グラフ
４００  バス
４０１  ＣＰＵ
４０２  メモリ
４０３  Ｉ／Ｆ
４０４  ディスクドライブ
４０５  ディスク
６００  依存関係情報
７００  単語情報
８０１  取得部
８０２  第１の分割部
８０３  算出部
８０４  判断部
８０５  第２の分割部
８０６  決定部
８０７  出力部
９００  クラスタ情報
１０００  クラスタ階層情報
１１００  トピック比率情報
１２００，１４００，１５００  類似度行列
１６００  クラスタ定義情報
【図１】
2019106128.tif 000006
【図２】
2019106128.tif 000007
【図３】
2019106128.tif 000008
【図４】
2019106128.tif 000009
【図５】
2019106128.tif 000010
【図６】
2019106128.tif 000011
【図７】
2019106128.tif 000012
【図８】
2019106128.tif 000013
【図９】
2019106128.tif 000014
【図１０】
2019106128.tif 000015
【図１１】
2019106128.tif 000016
【図１２】
2019106128.tif 000017
【図１３】
2019106128.tif 000018
【図１４】
2019106128.tif 000019
【図１５】
2019106128.tif 000020
【図１６】
2019106128.tif 000021
【図１７】
2019106128.tif 000022
【図１８】
2019106128.tif 000023