以下に図面を参照して、本発明にかかる分析方法、分析装置および分析プログラムの実施の形態を詳細に説明する。
(実施の形態)
図1は、実施の形態にかかる分析方法の一実施例を示す説明図である。図1において、分析装置100は、ソフトウェアSWを分析するコンピュータである。ソフトウェアSWは、分析対象となるコンピュータプログラムであり、コンピュータを動作させる命令、手順などを記述したものである。
ソフトウェアSWは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどの管理上適当な単位である。以下の説明では、コンポーネント、モジュール、ソースコード、クラス、関数などを総称して「プログラム」と表記する場合がある。
ここで、ソフトウェアSWの理解を支援する技術として、ソフトウェアSWを小規模な部分集合(いわゆる、クラスタ)に分割する技術がある。具体的には、例えば、ソフトウェアSWに含まれるプログラム同士の依存関係に基づくクラスタリングを行って、互いに関係し合っているプログラムのかたまりをクラスタとして分割するものがある(従来技術1)。
プログラム間の依存関係は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などの呼び出し関係、継承関係、包含関係や、データアクセス関係などの関係である。なお、従来技術1については、例えば、特開2013-148987号公報を参照することができる。
従来技術1で得られた各クラスタは、ソフトウェアの機能を実装しているプログラム群であることが期待される。機能とは、外部からのトリガ(例えば、利用者の操作入力)によって引き起こされるソフトウェアシステムの振る舞いである。例えば、業務システムにおいては、「見積を回答する」、「発注を送信する」、「契約情報を検索する」などが挙げられる。
ここで、図2を用いて、業務システムにおける機能とプログラムについて説明する。
図2は、業務システムにおける機能とプログラムの一例を示す説明図である。図2の例では、階層的なアーキテクチャをとる業務システム(ソフトウェアシステム)において、アーキテクチャ階層を跨って「契約入力業務」、「一括契約入力業務」という2つの機能を実現するプログラム群およびプログラム間の依存関係が示されている。
このような業務システムにかかるソフトウェアクラスタリングにおいては、一体となって機能を実現しているプログラムの集合を得られると有用である。図2中、契約入力画面、契約入力処理、契約明細履歴モデル等は、プログラムの一例である。また、図2中、プログラム間の依存関係は、矢印によって表される。
図2においては、契約入力業務、一括契約入力業務とラベルの付けられたふたつの枠210,220が、機能による分類を示している。こうした分割が有用である応用例としては、マイクロサービスアーキテクチャにみられるような各機能を独立して動作可能なサービスとして分割・再配置することが挙げられる。また、既存システムの不要な機能を統廃合する場合や、一部の機能をSaaS(Software as a Service)のような外部サービスに置き換える場合にも有用である。
ところが、プログラム間の依存関係に基づくクラスタリングでは、依存関係によって最適と評価された分割が、意味的に見て必ずしも最適な分割になるとは限らず、人が見て複数の機能と認識されるものが一つのクラスタに同居することがある。
例えば、図1に示すように、枠110の単位がプログラム間の依存関係によって最適なクラスタとして得られたとする。しかし、枠110内には、図2に示した「契約入力業務」と「一括契約入力業務」という異なる機能が混在している。より細粒度の枠120,130の単位であれば、それぞれの機能が別々のクラスタに所属し、より適切なクラスタであるといえる。プログラム間の依存関係によるクラスタリングでは、人が言葉から解釈する意味は考慮に入れないためこうしたことが起こる。
一方、ソフトウェアクラスタリングの手法として、プログラム間の依存関係を用いる方法ではなく、ソースファイル(プログラム)のコメントや識別子に用いられる語彙によってソースファイルを意味的にクラスタリングするものがある(従来技術2)。従来技術2では、似た目的のソースファイルを集められることが期待される。なお、従来技術2については、例えば、下記非特許文献1を参照することができる。
非特許文献1:Kuhn,A.,Ducasse,S.,& Girba,T.(2007).Semantic clustering: Identifying topics in source code. Information and Software Technology,49(3),230-243.
従来技術2は、各プログラムの語彙を利用しているため、人が見て意味的に類似性があると認識されるプログラムを集めるという意味では良い特性を持っている。しかしながら、従来技術2では、得られたクラスタ内のプログラム間に直接の呼出関係があるとは限らない。このため、設計時のパッケージの中にどのような話題を扱うプログラムが入っているかを調べるといったことには有用だが、ある機能を実現するプログラムの集合を抽出することに向いているとはいえない。
また、依存関係と語彙(意味)の両方の情報を利用するソフトウェアクラスタリングの手法として、例えば、依存関係によってアーキテクチャ階層を発見したのちに、その各階層に属するプログラム群を語彙によってクラスタリングするものがある(従来技術3)。なお、従来技術3については、例えば、下記非特許文献2を参照することができる。
非特許文献2:Scanniello,G.,D’Amico,A.,D’Amico,C.,& D’Amico,T.(2010).Using the Kleinberg algorithm and vector space model for software system clustering.In IEEE International Conference on Program Comprehension (pp. 180-189).
従来技術3では、Kleinbergアルゴリズムでプログラムをアーキテクチャ階層に分類したのち、その各階層に対して、含まれるプログラムごとに単語のtf-idf値を計算して構成したベクトルを、k-means法でクラスタリングする。
しかしながら、従来技術3は、ソフトウェア全体が階層構造として設計されているときのみ有効である。また、従来技術3は、各層の中のクラスタリングを語彙のみで行っているため、従来技術2と同様に、クラスタ内のプログラム間に直接の呼出関係があるとは限らない。さらに、階層間のつながりはクラスタの単位に考慮されないため、アーキテクチャ階層を越えて一つの機能を抽出できない。
また、従来技術3と同様に、依存関係と意味的情報とを併用する手法として、既存のJava(登録商標)プログラムのパッケージ設計を見直すために、メソッドの呼出関係とメソッドで使われる語彙の類似度とを用いた評価式でクラス間のつながりの強さを求め、それによってパッケージを構成するクラス間の推移閉包を求めてパッケージを再分割するものがある(従来技術4)。なお、従来技術4については、例えば、下記非特許文献3を参照することができる。
非特許文献3:Bavota,G.,De Lucia,A.,Marcus,A., & Oliveto, R.(2013).Using structural and semantic measures to improve software modularization.Empirical Software Engineering,18(5),901-932.
従来技術4は、パッケージを分割するものであるが、パッケージはソフトウェア設計上のアーキテクチャ階層が反映されることが多い。このため、従来技術3と同じくアーキテクチャ上の同階層の中でより小さな分割を求める手法とみなせる。すなわち、従来技術4は、複数のパッケージを跨って、ある機能を実現するプログラムのまとまりを得るという用途には用いられない。
このように、上述したような従来技術では、機能を実現しているグループへとソフトウェアSWを分割するという目的のために、複数の機能と認識されるものが一つのクラスタに同居するという問題は解決することができない。
そこで、本実施の形態では、ソフトウェアSWから依存関係によるつながりがあり、かつ、意味的にまとまりが良い構成要素のかたまりを分割して、ソフトウェアSWの機能を実現する構成要素の集合を抽出可能にする分割方法について説明する。以下、分析装置100の処理例について説明する。
(1)分析装置100は、ソフトウェアSWの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアSWの構成要素群を複数のクラスタに分割する。具体的には、例えば、分析装置100は、プログラムを節点とし、プログラム間の依存関係を辺とする有向グラフに対してグラフクラスタリング技術を適用することで、依存関係が密な部分グラフを、クラスタとして分割する。
図1の例では、ソフトウェアSWを分割して得られる複数のクラスタのうちの一つのクラスタとして、枠110内のプログラム群を含むクラスタ(以下、「クラスタ110」という)が得られた場合を想定する。
(2)分析装置100は、分割した複数のクラスタに含まれるクラスタについて、ソフトウェアSWの構成要素群の各構成要素における単語に基づいて、当該クラスタの意味的凝集度を算出する。ここで、構成要素における単語とは、例えば、プログラムの識別子、コメントなどのテキストから抽出される単語である。
また、クラスタの意味的凝集度とは、クラスタの意味的なまとまりの良さを示す指標値である。意味的にまとまりが良いクラスタとは、構成要素における単語から解釈される意味が同じ、あるいは、類似している構成要素の集合である。意味的凝集度は、例えば、既存のトピックモデリング技術を用いて定義することができる。トピックモデリングとは、自然言語を対象とした機械学習の技法であり、文書に内在する話題(トピック)を、各文書の単語の出現頻度を用いて自動的にモデル化するものである。
トピックモデリングとしては、例えば、LSA(Latent Semantic Analysis)や、LDA(Latent Dirichlet Allocation)などの技法がある。なお、LDAによるトピックモデリングについては、例えば、下記非特許文献4を参照することができる。
非特許文献4:Blei,D.M.,Ng,A.Y.,& Jordan,M.I.(2003).Latent Dirichlet Allocation. Journal of Machine Learning Research,3,993-1022.
LDAによるトピックモデリングでは、文書群に含まれる単語の出現頻度に基づいて、各文書が扱う「トピック」を確率的なモデルとして自動的に学習する。学習の結果として、文書ごとに、どのトピックをどれだけの比率で含むかが得られる。例えば、文書Aが含むトピックは、トピック1が20%、トピック2が9%、トピック3が6%、…といったトピック比率が文書ごとに得られる。
ここでは、このトピックモデリングを用いて、クラスタの意味的凝集度を、下記式(1)のように定義する。下記式(1)は、クラスタCkに対して、クラスタCkに属する任意の2つの構成要素(プログラム)di,djのトピックベクトルDdi,Ddjの類似度の最小値を、クラスタCkの意味的凝集度Mkとすることを表している。
ここで、プログラムdiのトピックベクトルDdiは、プログラムdiの単語群をトピックモデリングで学習した際の構成トピックの比率をトピックごとに並べたベクトルであり、下記式(2)を用いて表される。ただし、rdit1は、文書(プログラム)diにおけるトピックt1の比率(0以上1以下)である。Nは、トピック学習の際に用いたトピック数(例えば、20)である。
また、2つのトピックベクトルの類似度(上記式(1)の関数similarity)には、下記式(3)のように、ベクトルのなす角のコサインを用いる。ただし、・は、内積である。また、||V||は、ユークリッド距離である。なお、コサイン以外の類似度を用いて意味的凝集度を算出してもよい。
上記式(1)~(3)の定性的な意味は、クラスタCk内のプログラムがみな同じようなトピックを含んでいると意味的凝集度が高くなり、クラスタCkにトピック分布が他と大きく異なるプログラムが含まれていると意味的凝集度が低くなるということである。図1の例では、クラスタ110の意味的凝集度M110が算出された場合を想定する。
(3)分析装置100は、算出したクラスタの意味的凝集度が、予め設定された条件を満たさない場合、クラスタに含まれる構成要素群を複数のクラスタに分割する。ここで、条件は、任意に設定可能であり、例えば、意味的凝集度が閾値以上であるかといった条件が設定される。
同一機能を実現するプログラムであれば、同じような単語が使われ、同じようなトピックを含んでいるといえる。換言すれば、一つのクラスタに複数の機能が同居していれば、当該クラスタに属するプログラム間で異なる単語が使われ、トピック分布が大きく異なるものとなり、意味的凝集度が低くなるといえる。この特徴を利用して、一つのクラスタに複数の機能が同居しているか否かを判断する。
図1の例では、クラスタ110の意味的凝集度M110が、予め設定された条件を満たさない場合を想定する。この場合、分析装置100は、クラスタ110に含まれるプログラム群を複数のクラスタに分割する。すなわち、分析装置100は、クラスタ110をより細かい単位に分割する。
クラスタをより細かい単位に分割する方法としては、例えば、クラスタの階層情報(デンドログラム)を利用して、図3に示すような、クラスタ階層のより下位へと分割の位置を修正する手法を用いることができる。クラスタの階層情報は、例えば、最初の依存関係に基づくクラスタリングを階層的なアルゴリズムによって行うことで、その計算過程で得ることができる。
図3は、クラスタ階層の一例を示す説明図である。図3において、グラフ300は、クラスタリング対象の個々の構成要素とそれを順々にまとめ上げていったクラスタの階層を木構造として表した樹状図(デンドログラム)である。グラフ300の最下位のノード群は、クラスタリング対象の構成要素にあたる。また、グラフ300の中間の各階層のノード群は、構成要素をまとめて作成したクラスタにあたる。
例えば、分析装置100は、クラスタ110の意味的凝集度M110が、予め設定された条件を満たさないため、クラスタ110を、デンドログラムの1段階下位の単位である枠120,130の単位で分割する。これは、グラフ300においては、分割する位置を、依存関係により最適と評価される箇所(点線)から1段階下(破線)へ移動することを意味する。具体的には、クラスタ110が、枠120内のプログラム群を含むクラスタ(以下、「クラスタ120」という)と、枠130内のプログラム群を含むクラスタ(以下、「クラスタ130」という)とに分割される。
また、分析装置100は、クラスタ110から分割したクラスタ120,130についても、各クラスタ120,130の意味的凝集度M120,130を算出することにしてもよい。そして、分析装置100は、算出した意味的凝集度M120,130が、予め設定された条件を満たさない場合には、各クラスタ120,130をさらに細かく分割することにしてもよい。
なお、上記(3)において、クラスタ110の意味的凝集度M110が、予め設定された条件を満たす場合には、分析装置100は、クラスタ110を一つの構成要素集合に決定する。すなわち、クラスタ110の意味的凝集度M110が条件を満たす場合は、クラスタ110をこれ以上分割せず、クラスタ単位として確定する。クラスタ120,130についても同様である。
このように、分析装置100によれば、依存関係によるつながりがあり、かつ、意味的にまとまりが良い構成要素集合を抽出することができる。これにより、複数の機能と認識される構成要素が一つのクラスタに同居するのを防いで、ソフトウェアSWの機能を実現する構成要素のまとまりを機能単位で把握可能にすることができる。
図1の例では、ソフトウェアSWの構成要素間の依存関係に基づくクラスタリングにより得られたクラスタ110をさらに分割して、クラスタ120,130を得ることができる。クラスタ120,130は、図2に示した「契約入力業務」、「一括契約入力業務」というそれぞれ異なる機能に対応する構成要素集合である。これにより、「契約入力業務」、「一括契約入力業務」という機能を実現する構成要素のまとまりを機能単位で把握可能となる。この結果、例えば、「契約入力業務」および「一括契約入力業務」の各機能を独立して動作可能なサービスとして分割・再配置したり、不要な機能を統廃合したり、一部の機能を外部サービスに置き換えたりすることが可能となる。
(分析装置100のハードウェア構成例)
図4は、分析装置100のハードウェア構成例を示すブロック図である。図4において、分析装置100は、CPU(Central Processing Unit)401と、メモリ402と、I/F(Interface)403と、ディスクドライブ404と、ディスク405と、を有する。また、各構成部は、バス400によってそれぞれ接続される。
ここで、CPU401は、分析装置100の全体の制御を司る。メモリ402は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU401のワークエリアとして使用される。メモリ402に記憶されるプログラムは、CPU401にロードされることで、コーディングされている処理をCPU401に実行させる。
I/F403は、通信回線を通じてネットワークに接続され、ネットワークを介して外部のコンピュータに接続される。そして、I/F403は、ネットワークと装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。ネットワークは、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。I/F403には、例えば、モデムやLANアダプタなどを採用することができる。
ディスクドライブ404は、CPU401の制御に従ってディスク405に対するデータのリード/ライトを制御する。ディスク405は、ディスクドライブ404の制御で書き込まれたデータを記憶する。ディスク405としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
なお、分析装置100は、上述した構成部のほかに、例えば、SSD(Solid State Drive)、入力装置、ディスプレイ等を有することにしてもよい。
(プログラム間の依存関係)
つぎに、ソフトウェアSWに含まれるプログラム間の依存関係について説明する。
図5は、プログラム間の依存関係の一例を示す説明図である。図5において、グラフ500は、ソフトウェアSWに含まれるプログラム間の依存関係の一例を示している。図5中、一つ一つの長方形は、ソフトウェアSWに含まれるプログラムのソースファイルに相当する。
また、プログラム間をつなぐ矢印は、プログラム間の依存関係を表している。ただし、図5では、ソフトウェアSWのうちの一部のプログラムのみ表示している。例えば、プログラムKY01からプログラムKY02に向かう矢印は、プログラムKY01がプログラムKY02を呼び出すことを表している。
(依存関係情報の具体例)
つぎに、分析装置100が用いる依存関係情報について説明する。依存関係情報は、ソフトウェアSWに含まれるプログラム間の依存関係を示す情報である。ここでは、図5に示したグラフ500に対応する依存関係情報を例に挙げて説明する。
図6は、依存関係情報の具体例を示す説明図である。図6において、依存関係情報600は、依存元と依存先とを対応付けて示す情報である。ここで、依存元は、依存元の構成要素を示す。ここでは、依存元として、依存元の構成要素のプログラム名とプログラムIDとが示されている。また、依存先は、依存先の構成要素を示す。ここでは、依存先として、依存先の構成要素のプログラム名とプログラムIDとが示されている。ただし、図6では、ソフトウェアSWのうちの一部のプログラム間の依存関係についてのみ表示している。
例えば、依存元「契約入力画面KY01」は、依存元の構成要素のプログラム名「契約入力画面」とプログラムID「KY01」とを示す。また、依存先「契約入力処理KY02」は、依存先の構成要素のプログラム名「契約入力処理」とプログラムID「KY02」とを示す。
(単語情報の具体例)
つぎに、分析装置100が用いる単語情報について説明する。単語情報は、ソフトウェアSWに含まれるプログラムの単語(キーワード)を示す情報である。
図7は、単語情報の具体例を示す説明図である。図7において、単語情報700は、プログラムIDとキーワードとを対応付けて示す情報である。ここで、プログラムIDは、ソフトウェアSWに含まれるプログラムを一意に識別する識別情報である。キーワードは、プログラムのコメント、識別子などのテキストから抽出された単語である。ただし、図7では、ソフトウェアSWのうちの一部のプログラムの単語についてのみ表示している。
(分析装置100の機能的構成例)
図8は、分析装置100の機能的構成例を示すブロック図である。図8において、分析装置100は、取得部801と、第1の分割部802と、算出部803と、判断部804と、第2の分割部805と、決定部806と、出力部807と、を含む。取得部801~出力部807は制御部となる機能であり、具体的には、例えば、図4に示したメモリ402、ディスク405などの記憶装置に記憶されたプログラムをCPU401に実行させることにより、または、I/F403により、その機能を実現する。各機能部の処理結果は、例えば、メモリ402、ディスク405などの記憶装置に記憶される。
取得部801は、ソフトウェアSWの依存関係情報を取得する。ここで、依存関係情報は、ソフトウェアSWに含まれるプログラム間の依存関係を示す情報であり、例えば、図6に示した依存関係情報600である。具体的には、例えば、取得部801は、外部のコンピュータからソフトウェアSWの依存関係情報600を受信することにより、ソフトウェアSWの依存関係情報600を取得することにしてもよい。また、取得部801は、例えば、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアSWの依存関係情報600を取得することにしてもよい。
なお、ソフトウェアSWの依存関係情報は、分析装置100において生成されることにしてもよい。具体的には、例えば、まず、分析装置100は、分析対象となるソフトウェアSWのソースコードを取得する。つぎに、分析装置100は、ソフトウェアSWのソースコードを解析して、ソフトウェアSW内のプログラム間の依存関係を示す依存関係情報を生成する。より詳細に説明すると、分析装置100は、例えば、既存の構文解析技術および静的解析技術により、ソフトウェアSWのソースコードを解析し、ソフトウェアSW内のプログラム間の依存関係を抽出する。これにより、分析装置100は、図6に示したような依存関係情報600を生成することができる。
また、取得部801は、ソフトウェアSWの単語情報を取得する。ここで、単語情報は、ソフトウェアSWに含まれるプログラムの単語(キーワード)を示す情報であり、例えば、図7に示した単語情報700である。具体的には、例えば、取得部801は、外部のコンピュータからソフトウェアSWの単語情報700を受信することにより、ソフトウェアSWの単語情報700を取得することにしてもよい。また、取得部801は、例えば、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアSWの単語情報700を取得することにしてもよい。
なお、ソフトウェアSWの単語情報は、分析装置100において生成されることにしてもよい。具体的には、例えば、分析装置100は、ソフトウェアSWのソースコードを解析して、ソフトウェアSWに含まれる各プログラムの単語を示す単語情報を生成する。より詳細に説明すると、分析装置100は、例えば、既存の構文解析技術および静的解析技術により、ソフトウェアSWのソースコードを解析し、プログラムのコメント、識別子などのテキストから、名前や処理内容などの単語を抽出する。これにより、分析装置100は、図7に示したような単語情報700を生成することができる。
第1の分割部802は、ソフトウェアSWの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアSWの構成要素群を複数のクラスタに分割する。具体的には、例えば、第1の分割部802は、取得された依存関係情報600に基づいて、ソフトウェアSWのプログラム群を複数のクラスタに分割する。より詳細に説明すると、例えば、第1の分割部802は、依存関係に関する重みに基づいて、依存関係に関する重みの合計が当該合計の期待値よりも高くなるように、ソフトウェアSWのプログラム群を複数のクラスタに分割する。
この際、第1の分割部802は、例えば、階層的なクラスタリングを行うことにしてもよい。より詳細に説明すると、まず、第1の分割部802は、距離の最も近い2つのプログラム(例えば、依存関係が最も強い2つのプログラム)を最初にクラスタとしてまとめる。つぎに、第1の分割部802は、作成した小さなクラスタと、次に距離の近い他のプログラム、あるいは、別の小さなクラスタをまとめて、より大きなクラスタを作成する。以降同様の手順で、第1の分割部802は、より大きなクラスタを順次作成していく。この際、計算過程として、クラスタリング対象の個々のプログラムとそれを順々にまとめ上げていったクラスタ階層を木構造として表した樹状図(デンドログラム)がクラスタ階層情報として作成される。
これにより、例えば、図9に示すようなクラスタ情報900が分割結果として出力されるとともに、図10に示すようなクラスタ階層情報1000が出力される。なお、ソフトウェアSWを構成要素間の依存関係に基づいて複数のクラスタに分割する具体的な処理内容については、例えば、特開2013-148987号公報を参照することができる。
ここで、図9および図10を用いて、クラスタ情報およびクラスタ階層情報の具体例について説明する。
図9は、クラスタ情報の具体例を示す説明図である。図9において、クラスタ情報900は、クラスタIDとプログラムIDとを対応付けて示す情報である。ここで、クラスタIDは、クラスタを一意に識別する識別情報である。プログラムIDは、プログラムを一意に識別する識別情報である。ただし、図9では、クラスタID「C1」のクラスタC1のみ網羅的に示している。
クラスタ情報900によれば、ソフトウェアSWのプログラム群をプログラム間の依存関係をもとに分割して得られた各クラスタに属するプログラムを特定することができる。
図10は、クラスタ階層情報の具体例を示す説明図である。図10において、クラスタ階層情報1000は、クラスタリング対象の個々のプログラムとそれを順々にまとめ上げていったクラスタの階層を木構造として表した樹状図(デンドログラム)である。クラスタ階層情報1000の最下位のノード群は、クラスタリング対象のプログラムにあたる。また、クラスタ階層情報1000の中間の各階層のノード群は、プログラムをまとめて作成したクラスタにあたる。ただし、図10では、クラスタID「C1」のクラスタC1のみ網羅的に示している。
図8の説明に戻り、算出部803は、ソフトウェアSWの構成要素群の各構成要素における単語に基づいて、第1の分割部802によって分割して得られたクラスタの意味的凝集度を算出する。ここで、構成要素における単語は、例えば、プログラムの識別子、コメントなどのテキストから抽出した単語群である。また、クラスタの意味的凝集度は、クラスタの意味的なまとまりの良さを示す指標値である。
具体的には、例えば、算出部803は、ソフトウェアSWのプログラム群の各プログラムにおける単語の出現頻度に基づいて、各プログラムについて、予め設定された所定数の各トピックを各プログラムが含む確率を算出する。トピックとは、プログラムで扱われる話題である。所定数は、任意に設定可能であり、例えば、20程度の数に設定される。つぎに、算出部803は、算出した各プログラムについての各トピックの確率に基づいて、クラスタに含まれるプログラム間の類似度を算出する。そして、算出部803は、算出したプログラム間の類似度に基づいて、クラスタの意味的凝集度を算出する。
ここで、クラスタID「C1」のクラスタC1を例に挙げて、クラスタC1の意味的凝集度を算出する処理例についてより具体的に説明する。まず、算出部803は、取得された単語情報700に基づいて、既存のトピックモデリングを用いて、ソフトウェアSWのプログラム群の各プログラムについて、所定数の各トピックのトピック比率を算出する。トピック比率は、各トピックをプログラムが含む確率である。
トピックモデリングにあたり、各プログラムをLDAにおける文書とみなし、単語情報700から特定される各プログラムの単語群を、各文書に含まれる単語群とみなして学習を行う。トピックの数は、学習時に任意に設定可能である。例えば、トピック数を「20」として学習すると、トピック1からトピック20まで存在することになり、プログラムごとに各トピック1~20のトピック比率が得られる。
ここで、トピック比率情報の具体例について説明する。トピック比率情報は、ソフトウェアSWに含まれるプログラムごとのトピック比率を示す情報である。
図11は、トピック比率情報の具体例を示す説明図である。図11において、トピック比率情報1100は、プログラムのプログラムIDと対応付けて、各トピックのトピックIDおよび比率を示す。トピックIDは、トピックを一意に識別する識別情報である。比率は、トピック比率である。ただし、図11では、プログラムごとに、比率の高い上位3個のトピックの比率のみ示している。
例えば、プログラムKY01について、比率の高い上位3個のトピックは、トピック1,2,3である。そして、トピック1の比率は「0.31」、トピック2の比率は「0.11」、トピック3の比率は「0.09」である。
つぎに、算出部803は、トピック比率情報1100に基づいて、クラスタC1に含まれるプログラム間の類似度を算出する。より具体的には、例えば、算出部803は、上記式(2)を用いて、クラスタC1に含まれるプログラムdiごとに、トピック比率情報1100から特定される各トピックの比率を並べたトピックベクトルDdiを生成する。そして、算出部803は、生成したプログラムdiごとのトピックベクトルDdiに基づいて、上記式(3)を用いて、クラスタC1内のプログラム間の類似度を算出する。
ここで、類似度行列の具体例について説明する。類似度行列は、クラスタ内のプログラム間の類似度を示す情報である。
図12は、類似度行列の具体例を示す説明図(その1)である。図12において、類似度行列1200は、クラスタC1内のプログラム間の類似度を示す情報である。類似度行列1200において、縦横の各要素はプログラムIDであり、交点の数値は当該プログラム間の類似度である。ただし、類似度は対称であり、右上部分は左下部分と同じ値となるため表示を省略する。また、同じプログラム同士の類似度は「1」のため表示を省略する。
例えば、プログラムKY01とプログラムKY02との類似度は「0.95」である。また、プログラムKY02とプログラムKY03との類似度は「0.90」である。
そして、算出部803は、算出したプログラム間の類似度に基づいて、上記式(1)を用いて、クラスタC1の意味的凝集度を算出する。ここで、類似度行列1200から特定されるプログラム間の類似度の最小値は、プログラムIK02とプログラムKY04との類似度「0.66」である。このため、クラスタC1の意味的凝集度は、「0.66」となる。
なお、ここでは、クラスタC1の意味的凝集度として、クラスタC1内のプログラム間の類似度の最小値を用いる場合を例に挙げて説明したが、これに限らない。例えば、クラスタC1の意味的凝集度として、クラスタC1内のプログラム間の類似度の平均値を用いることにしてもよい。
判断部804は、算出されたクラスタの意味的凝集度が、予め設定された条件Pを満たすか否かを判断する。ここで、条件Pは、クラスタが意味的にまとまりのあるものであるといえるかを判断するための条件であり、任意に設定可能である。ここでは、条件Pとして、クラスタの意味的凝集度が閾値α以上であるかという条件が設定された場合を想定する。閾値αは、任意に設定可能であり、例えば、経験的に設定される。
一例として、閾値αを「α=0.7」とする。この場合、クラスタC1の意味的凝集度「0.66」は、閾値α未満となる。このため、判断部804は、クラスタC1の意味的凝集度「0.66」が条件Pを満たさないと判断する。なお、クラスタC1の意味的凝集度が閾値α以上の場合には、判断部804は、クラスタC1の意味的凝集度が条件Pを満たすと判断する。
第2の分割部805は、クラスタの意味的凝集度が条件Pを満たさないと判断された場合、当該クラスタに含まれる構成要素群を複数のクラスタに分割する。具体的には、例えば、第2の分割部805は、クラスタC1の意味的凝集度が条件Pを満たさない場合、クラスタC1に含まれるプログラム群を複数のクラスタに分割する。すなわち、第2の分割部805は、クラスタC1をより細かい単位に分割する。
より詳細に説明すると、第2の分割部805は、例えば、図10に示したクラスタ階層情報1000に基づいて、クラスタC1に含まれるプログラム群を複数のクラスタに分割することにしてもよい。また、第2の分割部805は、例えば、上述した従来技術2を利用して、クラスタC1に含まれる各プログラムの単語によって、クラスタC1に含まれるプログラム群を意味的にクラスタリングすることにしてもよい。
ここで、図13を用いて、クラスタC1の分割例について説明する。ここでは、クラスタ階層情報1000に基づいて、クラスタ階層のより下位へと分割の位置を修正して、クラスタC1に含まれるプログラム群を複数のクラスタに分割する場合について説明する。
図13は、クラスタの分割例を示す説明図である。第2の分割部805は、クラスタ階層情報1000に基づいて、クラスタC1に含まれるプログラム群を1段階下位の単位で分割する。具体的には、第2の分割部805は、クラスタC1を、クラスタC1-1とクラスタC1-2とに分割する。
クラスタC1-1は、プログラムKY01と、プログラムKY02と、プログラムKY03と、プログラムKY04と、を含む。クラスタC1-2は、プログラムIK01と、プログラムIK02と、プログラムIK03と、プログラムIK04と、プログラムIK05と、を含む。
これにより、意味的凝集度が条件Pを満たさないクラスタC1を、より細かい単位であるクラスタC1-1とクラスタC1-2とに分割することができる。
また、算出部803は、第2の分割部805によって分割して得られたクラスタ(分割後のクラスタ)の意味的凝集度を算出する。なお、分割後のクラスタの意味的凝集度を算出する具体的な処理内容は、第1の分割部802によって分割されたクラスタの意味的凝集度を算出する場合と同様のため、詳細な説明を省略する。
また、判断部804は、算出された分割後のクラスタの意味的凝集度が条件Pを満たすか否かを判断する。そして、第2の分割部805は、分割後のクラスタの意味的凝集度が条件Pを満たさないと判断された場合、当該クラスタに含まれる構成要素群を複数のクラスタに分割する。
すなわち、分析装置100は、分割後のクラスタの意味的凝集度が条件Pを満たすまで、当該クラスタを再帰的に分割していく。なお、どれだけ細かい単位まで分割可能にするかは、任意に設定可能である。例えば、クラスタ階層の最下位の階層よりもK階層上位の階層までの分割を可能にしてもよい(Kは、例えば、1~3程度)。また、例えば、プログラムの数が少なくとも2以上となるクラスタへの分割を可能にしてもよい。
ここで、図14および図15を用いて、クラスタC1を分割して得られた分割後のクラスタC1-1,C1-2内のプログラム間の類似度を示す類似度行列について説明する。
図14は、類似度行列の具体例を示す説明図(その2)である。また、図15は、類似度行列の具体例を示す説明図(その3)である。図14において、類似度行列1400は、クラスタC1-1内のプログラム間の類似度を示す情報である。また、図15において、類似度行列1500は、クラスタC1-2内のプログラム間の類似度を示す情報である。
ここで、類似度行列1400から特定されるプログラム間の類似度の最小値は、プログラムKY02とプログラムKY04との類似度「0.85」である。このため、クラスタC1-1の意味的凝集度は、「0.85」となる。また、類似度行列1500から特定されるプログラム間の類似度の最小値は、プログラムIK02とプログラムIK05との類似度「0.86」である。このため、クラスタC1-2の意味的凝集度は、「0.86」となる。
閾値αを「α=0.7」とすると、クラスタC1-1の意味的凝集度「0.85」は、閾値α以上となる。このため、判断部804は、クラスタC1-1の意味的凝集度が条件Pを満たすと判断する。また、クラスタC1-2の意味的凝集度「0.86」は、閾値α以上となる。このため、判断部804は、クラスタC1-2の意味的凝集度が条件Pを満たすと判断する。
図8の説明に戻り、決定部806は、第1の分割部802によって分割されたクラスタの意味的凝集度が条件Pを満たす場合には、クラスタを一つの構成要素集合に決定する。また、決定部806は、第2の分割部805によって分割されたクラスタの意味的凝集度が条件Pを満たす場合には、クラスタを一つの構成要素集合に決定する。
ここで、一つの構成要素集合とは、ある機能を実現する構成要素の集合である。すなわち、決定部806は、クラスタの意味的凝集度が条件Pを満たす場合は、当該クラスタをこれ以上分割せず、クラスタ単位として確定する。これにより、ある機能を実現するプログラムのまとまりであるクラスタを得ることができる。
出力部807は、決定した構成要素集合に含まれる構成要素を示す情報を出力する。具体的には、例えば、出力部807は、クラスタ定義情報を出力することにしてもよい。クラスタ定義情報は、一つの構成要素集合として決定されたクラスタを識別する識別情報と、当該クラスタに含まれる構成要素を識別する識別情報とを対応付けた情報である。
クラスタ定義情報の具体例については、図15を用いて後述する。なお、出力部807の出力形式としては、例えば、メモリ402、ディスク405などの記憶装置への記憶、I/F403による他のコンピュータへの送信、不図示のディスプレイへの表示、不図示のプリンタへの印刷出力などがある。
また、出力部807は、クラスタ定義情報に基づいて、ソフトウェアSWのクラスタリング結果を地図形式で出力することにしてもよい。より詳細に説明すると、例えば、出力部807は、プログラムを建物として表し、同一クラスタ内のプログラムを表す建物の集合を区画として地図上に表示することにしてもよい。この際、プログラム間の依存関係を、建物間をつなぐ曲線等によって表すことにしてもよい。
なお、上述した説明では、第1の分割部802が、ソフトウェアSWの構成要素群の構成要素間の依存関係に基づいて、ソフトウェアSWの構成要素群を複数のクラスタに分割することにしたが、これに限らない。例えば、第1の分割部802は、他のコンピュータから、ソフトウェアSWの構成要素間の依存関係に基づくクラスタリング結果を示すクラスタ情報(例えば、クラスタ情報900)を取得することにしてもよい。
(クラスタ定義情報の具体例)
つぎに、クラスタ定義情報の具体例について説明する。
図16は、クラスタ定義情報の具体例を示す説明図である。図16において、クラスタ定義情報1600は、クラスタIDとプログラムIDとを対応付けて示す情報である。ここで、クラスタIDは、一つの構成要素集合として決定されたクラスタを一意に識別する識別情報である。プログラムIDは、一つの構成要素集合として決定されたクラスタに属するプログラムを一意に識別する識別情報である。
クラスタ定義情報1600によれば、ユーザは、ソフトウェアSWの機能を実現するプログラムのまとまりを機能単位で把握することができる。
(分析装置100の分析処理手順)
つぎに、分析装置100の分析処理手順について説明する。
図17は、分析装置100の分析処理手順の一例を示すフローチャートである。図17において、分析装置100は、ソフトウェアSWの依存関係情報と、ソフトウェアSWの単語情報とを取得する(ステップS1701)。つぎに、分析装置100は、取得した依存関係情報に基づいて、ソフトウェアSWのプログラム群を複数のクラスタに分割する(ステップS1702)。
分析装置100は、取得した単語情報に基づいて、既存のトピックモデリングを用いて、ソフトウェアSWのプログラム群の各プログラムについて、所定数(例えば、20)の各トピックのトピック比率を算出する(ステップS1703)。つぎに、分析装置100は、ステップS1702において分割して得られた複数のクラスタのうち選択されていない未選択のクラスタを選択する(ステップS1704)。
つぎに、分析装置100は、算出した各プログラムについての各トピックのトピック確率に基づいて、選択したクラスタに含まれるプログラム間の類似度を算出する(ステップS1705)。そして、分析装置100は、算出したプログラム間の類似度に基づいて、選択したクラスタの意味的凝集度を算出する(ステップS1706)。つぎに、分析装置100は、クラスタ決定処理を実行する(ステップS1707)。
クラスタ決定処理は、ステップS1704において選択されたクラスタ、または、後述の図18のステップS1805において分割して得られる分割後のクラスタを、一つのクラスタ単位として決定するか否かを判断する処理である。クラスタ決定処理の具体的な処理手順については、図18を用いて後述する。
そして、分析装置100は、ステップS1702において分割して得られた複数のクラスタのうち選択されていない未選択のクラスタがあるか否かを判断する(ステップS1708)。ここで、未選択のクラスタがある場合(ステップS1708:Yes)、分析装置100は、ステップS1704に戻る。
一方、未選択のクラスタがない場合(ステップS1708:No)、分析装置100は、クラスタ定義情報を出力して(ステップS1709)、本フローチャートによる一連の処理を終了する。これにより、ソフトウェアSWの機能を実現するプログラムのまとまりを機能単位で把握可能なクラスタ定義情報を出力することができる。
つぎに、図18を用いて、ステップS1707のクラスタ決定処理の具体的な処理手順について説明する。
図18は、クラスタ決定処理の具体的処理手順の一例を示すフローチャートである。図18のフローチャートにおいて、まず、分析装置100は、算出した該当クラスタの意味的凝集度が閾値α以上であるか否かを判断する(ステップS1801)。該当クラスタは、ステップS1704において選択されたクラスタ、または、後述のステップS1805において分割して得られる分割後のクラスタである。
ここで、意味的凝集度が閾値α以上の場合(ステップS1801:Yes)、分析装置100は、該当クラスタを一つのクラスタ単位として決定する(ステップS1802)。そして、分析装置100は、該当クラスタのクラスタIDと対応付けて、該当クラスタに含まれるプログラムのプログラムIDをクラスタ定義情報に登録して(ステップS1803)、クラスタ決定処理を呼び出したステップに戻る。
また、ステップS1801において、意味的凝集度が閾値α未満の場合(ステップS1801:No)、分析装置100は、該当クラスタをより細かい単位に分割可能であるか否かを判断する(ステップS1804)。ここで、該当クラスタを分割不能な場合(ステップS1804:No)、分析装置100は、ステップS1802に移行する。
一方、該当クラスタを分割可能な場合(ステップS1804:Yes)、分析装置100は、クラスタ階層情報に基づいて、該当クラスタに含まれるプログラム群を複数のクラスタに分割する(ステップS1805)。そして、分析装置100は、ステップS1805において分割して得られた分割後のクラスタに含まれるプログラム間の類似度に基づいて、分割後のクラスタの意味的凝集度を算出して(ステップS1806)、図17に示したステップS1707に移行する。
これにより、意味的凝集度が閾値α以上となるまで、クラスタをより細かい単位に分割することができる。
以上説明したように、実施の形態にかかる分析装置100によれば、ソフトウェアSWのプログラム群のプログラム間の依存関係に基づいて、ソフトウェアSWのプログラム群を複数のクラスタに分割することができる。これにより、依存関係によるつながりがあるプログラムのまとまりを、クラスタとして分割することができる。
また、分析装置100によれば、ソフトウェアSWのプログラム群の各プログラムにおける単語に基づいて、分割して得られたクラスタの意味的凝集度を算出することができる。これにより、各プログラムの識別子やコメントから抽出される単語をもとに、クラスタの意味的なまとまりの良さを示す指標値である意味的凝集度を算出することができる。
具体的には、例えば、分析装置100は、ソフトウェアSWのプログラム群の各プログラムにおける単語の出現頻度に基づいて、各プログラムについて、予め設定された所定数の各トピックを各プログラムが含む確率を算出する。つぎに、分析装置100は、算出した各プログラムについての各トピックの確率に基づいて、クラスタに含まれるプログラム間の類似度を算出する。そして、分析装置100は、算出したプログラム間の類似度に基づいて、クラスタの意味的凝集度を算出する。これにより、各プログラムが扱うトピック(話題)の比率をもとに得られるクラスタ内のプログラム間の類似性から、クラスタの意味的凝集度を算出することができる。
また、分析装置100によれば、分割して得られた複数のクラスタのいずれかのクラスタの意味的凝集度が、予め設定された条件Pを満たさない場合、当該クラスタに含まれるプログラム群を複数のクラスタに分割することができる。これにより、意味的にまとまりのあるものであるといえないクラスタを、より細かい単位に分割することができる。
具体的には、例えば、分析装置100は、クラスタの意味的凝集度が条件Pを満たさない場合、当該クラスタの階層構造を示す階層情報に基づいて、当該クラスタに含まれるプログラム群を複数のクラスタに分割する。これにより、クラスタの階層構造を考慮して、より細かい単位に分割することができる。
また、分析装置100によれば、クラスタの意味的凝集度が、予め設定された条件Pを満たす場合、当該クラスタを一つの構成要素集合に決定することができる。これにより、意味的にまとまりのあるものであるといえるクラスタについては、当該クラスタをこれ以上分割せず、クラスタ単位として確定することができる。
また、分析装置100によれば、決定した構成要素集合に含まれるプログラムを示す情報を出力することができる。これにより、依存関係によるつながりがあり、かつ、意味的にまとまりが良いプログラムの集合を示す情報を出力することができる。
これらのことから、分析装置100によれば、依存関係によるつながりがあり、かつ、意味的にまとまりが良いプログラムの集合を抽出して、ソフトウェアSWの機能を実現するプログラムのまとまりを機能単位で把握可能にすることができる。
なお、本実施の形態で説明した分析方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析プログラムは、ハードディスク、フレキシブルディスク、CD(Compact Disc)-ROM、MO(Magneto-Optical disk)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本分析プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータが実行することを特徴とする分析方法。
(付記2)前記凝集度が前記条件を満たす場合には、前記クラスタを一つの構成要素集合に決定する、処理を前記コンピュータが実行することを特徴とする付記1に記載の分析方法。
(付記3)決定した前記構成要素集合に含まれる構成要素を示す情報を出力する、処理を前記コンピュータが実行することを特徴とする付記2に記載の分析方法。
(付記4)前記凝集度が前記条件を満たさない場合、前記クラスタの階層構造を示す階層情報に基づいて、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、ことを特徴とする付記1~3のいずれか一つに記載の分析方法。
(付記5)前記ソフトウェアの構成要素群の各構成要素における単語に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出し、
算出した前記凝集度が前記条件を満たすか否かを判断する、
処理を前記コンピュータが実行することを特徴とする付記1~4のいずれか一つに記載の分析方法。
(付記6)前記ソフトウェアの構成要素群の各構成要素における単語の出現頻度に基づいて、前記各構成要素について、所定数の各トピックを前記各構成要素が含む確率を算出し、
算出した前記各構成要素についての前記各トピックの確率に基づいて、前記クラスタに含まれる構成要素間の類似度を算出する、処理を前記コンピュータが実行し、
算出した前記構成要素間の類似度に基づいて、前記クラスタの意味的なまとまりの良さを示す凝集度を算出することを特徴とする付記5に記載の分析方法。
(付記7)前記ソフトウェアの構成要素群の各構成要素における単語は、前記各構成要素の識別子およびコメントの少なくともいずれかから抽出される単語である、ことを特徴とする付記5または6に記載の分析方法。
(付記8)ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
制御部を有することを特徴とする分析装置。
(付記9)ソフトウェアの構成要素群の構成要素間の依存関係に基づいて、前記構成要素群を複数のクラスタに分割し、
分割した前記複数のクラスタのいずれかのクラスタの意味的なまとまりの良さを示す凝集度が、予め設定された条件を満たさない場合、前記クラスタに含まれる構成要素群を複数のクラスタに分割する、
処理をコンピュータに実行させることを特徴とする分析プログラム。