以下に図面を参照して、本発明にかかる分析支援方法、分析支援装置、および分析支援プログラムの実施の形態を詳細に説明する。
(実施の形態)
図1は、実施の形態にかかる分析支援システム100のシステム構成例を示す説明図である。図1において、分析支援システム100は、分析支援装置101と、クライアント装置102と、を含む。分析支援システム100において、分析支援装置101およびクライアント装置102は、有線または無線のネットワーク110を介して接続される。ネットワーク110は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。
ここで、分析支援装置101は、ソースコードDB(DataBase)120を有し、ソフトウェアSWの分析を支援するコンピュータである。分析支援装置101は、例えば、サーバである。ソースコードDB120は、ソフトウェアSWのソースコードを記憶する。
ソフトウェアSWは、分析対象となるコンピュータプログラムであり、コンピュータを動作させる命令、手順などを記述したものである。ソフトウェアSWは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。
クライアント装置102は、分析支援システム100のユーザが使用するコンピュータである。例えば、クライアント装置102は、PC(Personal Computer)、タブレットPCなどである。分析支援システム100のユーザは、例えば、ソフトウェアSWの作成者や分析者である。
ここで、ソフトウェアSWを開発・改良・保守するためにはソフトウェアSWの理解が重要となる一方で、ソフトウェアSWが大規模になればなるほど、ソフトウェアSWの構造は複雑なものとなる。このため、ソフトウェアSWの構造の把握を容易にすべく、ソフトウェアSWを小規模な部分集合(いわゆる、クラスタ)に分割する技術がある。
ソフトウェアSWを分割する技術としては、例えば、ソフトウェアSWに含まれるソースファイル同士の依存関係に基づくクラスタリングを行って、互いに関係し合っているソースファイルのかたまりをクラスタとして分割するものがある。なお、クラスタリングの手法としては、既存の任意の手法を用いることができる。
ソフトウェアSWから分割されたクラスタを人が見て分析しようとした場合、大規模なソースファイル群から機械的に分割された各クラスタが、どのような機能や業務を実現しているものかを判断することになる。例えば、受注業務を実現しているクラスタであるのか、見積業務を実現しているクラスタであるのかといったことである。
クラスタはソースファイルの集まりであるため、どのような性質のクラスタであるかは、クラスタに属する個々のソースファイルを見て推測することができる。例えば、クラスタに受注業務についての処理をしているソースファイルが多く含まれていれば、受注業務を実現するクラスタであると推測できる。
しかし、各クラスタに属する一つ一つのソースファイルを人手により調べて、各クラスタの機能を推測するのは大変な手間がかかる。したがって、クラスタに属するソースファイルから情報を得て、どのような性質のクラスタであるかを人が容易に理解するための手掛かりを自動的に生成して提供することは有用である。
既存技術としては、クラスタに属する各ソースファイルの識別子(例えば、クラス名、ファイル名、ディレクトリ名、パッケージ名、関数名など)から単語を抽出して、各クラスタに特徴的な語(特徴語)を求める方法がある。
例えば、Java(登録商標)言語で作成されたソフトウェアSWの場合、完全修飾クラス名が「com.abc.gui.EditorFrame」であれば、「com,abc,gui,editor,frame」といった具合に単語に切り分ける。各クラスについて単語を切り分けた後に、各クラスタに特徴的な語がどれであるかを計算する。
特徴語の計算方法としては、例えば、tf−idf(term frequency−inverse document frequency)法を利用することができる。tf−idf法をソフトウェアクラスタに適用する場合、各クラスタの単位をtf−idf計算のための一つの「文書」とみなし、クラスタに含まれる各ソースファイルから得た語の集まりを、その文書を構成する単語群とみなす。
これにより、ソフトウェア全体のクラスタの集まりをtf−idf計算のためのコーパス全体とみなせる。そして、「文書」と「単語」との対応関係に基づいて、各クラスタの各単語についてスコアとしてtf−idf値を求めることにより、例えば、スコアの大きな語のいくつかを、そのクラスタを説明するラベルとして用いることができる。
ところが、tf−idf法をそのままソフトウェアクラスタに適用した場合、本来出てきて欲しい単語が特徴語として出てこないことがある。例えば、一つのクラスタには、そのクラスタの主要な目的を担うソースファイルと、そこから使用されている手段としてのソースファイルをともに含むことがよくある。
クラスタの主要な目的としては、例えば、請求処理、支払証明書作成、商品マスタ管理といったソフトウェアSWのひとつの機能や業務が挙げられる。一方、手段としては、例えば、テキスト編集サブルーチン、検索機能、ファイル入出力ユーティリティといったものが挙げられる。
tf−idf法をそのままソフトウェアクラスタに適用すると、これら目的と手段の両方のソースファイルを同格のものとして扱い、単語の出現頻度によって特徴語を求めることになる。このため、手段に属するソースファイルが多いと、手段に関連する単語の出現頻度が高くなり、クラスタの主要な目的を表す単語がその中に埋没してしまうという問題がある。
ここで、図2の例題を用いて、tf−idf法をそのままソフトウェアクラスタに適用した場合に生じる問題点について説明する。
図2は、クラスタのグラフ構造の一例を示す説明図(その1)である。図2において、グラフ200は、ソフトウェアSWに対してクラスタリングを行った結果として得られたあるクラスタを、当該クラスタに属するプログラム間の呼び出し関係を有向辺とする有向グラフ構造により表現したものである。
図2の例では、グラフ200の上の方に呼び出し元、下の方に呼び出し先のプログラム(ソースファイル)がくるように配置されている。具体的には、グラフ200の上の方には、「支払証明書(月別)」、「支払証明書(日別)」という2つのプログラムp1,p2がある。プログラムp1,p2は、同じクラスタ内の他のプログラムp3〜p9からは参照されない、最も呼び出し元側に位置するものである。
グラフ200によれば、プログラムp1,p2は、「利用金額計算」、「明細編集」、「金額編集」といった他のプログラムp3〜p5を呼び出して業務を実現していることがわかる。また、プログラムp3〜p5は、「利用状況検索」、「編集サブルーチン」、「金額計算」といった他のプログラムp6〜p8を呼び出していることがわかる。
図2の例は、支払証明書の処理についてのクラスタである。このため、クラスタを特徴付ける特徴語として、「支払証明書」を表す単語が出てくることが望ましい。ところが、処理の途中の手段であるプログラムに現れる「金額」や「利用」といった単語の出現頻度が高いために、「支払証明書」を表す単語が、これらの単語に埋もれてしまう。
具体的には、例題のクラスタ内の各単語の出現回数は、「支払=2」、「証明書=2」、「利用=2」、「状況=1」、「金額=3」、「明細=1」、「検索=2」、「計算=2」、「ユーティリティ=1」、「編集=1」、「サブルーチン=1」となる。tf−idf法では、単語のある文書内での出現回数(tf)に、その単語がコーパス全体の中でどれだけ多くの文書に出現するかによって決まるidfを乗じてスコアを計算する。ただし、ここでは簡単のため、各単語の出現回数(tf)をそのまま、各単語がクラスタの特徴をどの程度表すかのスコアとして用いる場合を例に挙げて説明する。
この場合、「金額」という一般的な単語が最も高いスコア「3」となる。また、「検索、状況」などの一般的な単語と、クラスタの処理の目的を表す「支払、証明書」とが同じスコア「2」となる。したがって、スコアの高いほうからいくつか単語を選んでクラスタの特徴語とすると、本来出てきて欲しい「支払、証明書」といった語が、「金額、検索、状況」などの他の単語に埋もれてしまう。
なお、この計算例で省略したidfの計算を適用する場合、「金額」「検索」などの語がソフトウェア全体に満遍なく出現するのであればidfによってフィルタされてスコアが低められる。しかしながら、これらの単語の出現に局所性がある、つまり一部のクラスタにしか現れない場合は、このような効果を期待することはできない。
また、図2に示した例では、各プログラムが日本語の名前を持つものとして説明したが、Java言語やC言語等で一般的な英単語に基づいた識別子を用いる場合でも同じ議論が成り立つ。
そこで、本実施の形態では、クラスタの主要な目的を表す単語が、手段としてのプログラムに関係した単語に埋もれてしまうことを防いで、どのような性質のクラスタであるかを人が理解しやすい説明語句を生成可能にする分析支援方法について説明する。
なお、本実施の形態では、分析支援装置101とクライアント装置102とを別々に設けることにしたが、これに限らない。例えば、分析支援装置101は、クライアント装置102により実現されることにしてもよい。
(分析支援装置101のハードウェア構成例)
つぎに、分析支援装置101のハードウェア構成例について説明する。
図3は、分析支援装置101のハードウェア構成例を示すブロック図である。図3において、分析支援装置101は、CPU(Central Processing Unit)301と、メモリ302と、I/F(Interface)303と、ディスクドライブ304と、ディスク305と、を有する。また、各構成部は、バス300によってそれぞれ接続される。
ここで、CPU301は、分析支援装置101の全体の制御を司る。メモリ302は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU301のワークエリアとして使用される。メモリ302に記憶されるプログラムは、CPU301にロードされることで、コーディングされている処理をCPU301に実行させる。
I/F303は、通信回線を通じてネットワーク110に接続され、ネットワーク110を介して外部のコンピュータ(例えば、図1に示したクライアント装置102)に接続される。そして、I/F303は、ネットワーク110と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。I/F303には、例えば、モデムやLANアダプタなどを採用することができる。
ディスクドライブ304は、CPU301の制御に従ってディスク305に対するデータのリード/ライトを制御する。ディスク305は、ディスクドライブ304の制御で書き込まれたデータを記憶する。ディスク305としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
なお、分析支援装置101は、上述した構成部のほかに、例えば、SSD(Solid State Drive)、キーボード、マウス、ディスプレイ等を有することにしてもよい。
(クライアント装置102のハードウェア構成例)
つぎに、クライアント装置102のハードウェア構成例について説明する。
図4は、クライアント装置102のハードウェア構成例を示すブロック図である。図4において、クライアント装置102は、CPU401と、メモリ402と、ディスクドライブ403と、ディスク404と、I/F405と、ディスプレイ406と、入力装置407と、を有する。また、各構成部はバス400によってそれぞれ接続される。
ここで、CPU401は、クライアント装置102の全体の制御を司る。メモリ402は、例えば、ROM、RAMおよびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU401のワークエリアとして使用される。メモリ402に記憶されるプログラムは、CPU401にロードされることで、コーディングされている処理をCPU401に実行させる。
ディスクドライブ403は、CPU401の制御に従ってディスク404に対するデータのリード/ライトを制御する。ディスク404は、ディスクドライブ403の制御で書き込まれたデータを記憶する。ディスク404としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
I/F405は、通信回線を通じてネットワーク110に接続され、ネットワーク110を介して外部のコンピュータ(例えば、図1に示した分析支援装置101)に接続される。そして、I/F405は、ネットワーク110と装置内部のインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。
ディスプレイ406は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ406は、例えば、液晶ディスプレイ、有機EL(Electroluminescence)ディスプレイ、CRT(Cathode Ray Tube)などを採用することができる。
入力装置407は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置407は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
なお、クライアント装置102は、上述した構成部のうち、例えば、ディスクドライブ403、ディスク404などを有さないことにしてもよい。
(分析支援装置101の機能的構成例)
つぎに、分析支援装置101の機能的構成例について説明する。
図5は、分析支援装置101の機能的構成例を示すブロック図である。図5において、分析支援装置101は、取得部501と、分割部502と、係数算出部503と、抽出部504と、重み付け部505と、出力部506と、を含む構成である。取得部501〜出力部506は制御部となる機能であり、具体的には、例えば、図3に示したメモリ302、ディスク305などの記憶装置に記憶されたプログラムをCPU301に実行させることにより、または、I/F303により、その機能を実現する。各機能部の処理結果は、例えば、メモリ302、ディスク305などの記憶装置に記憶される。
取得部501は、分析対象となるソフトウェアSWを取得する機能を有する。上述したように、ソフトウェアSWは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。
具体的には、例えば、取得部501は、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアSWのソースコードを取得することにしてもよい。また、取得部501は、例えば、ネットワーク110(図1参照)を介して、外部のコンピュータ(例えば、図1に示したクライアント装置102)からソフトウェアSWのソースコードを取得することにしてもよい。取得されたソフトウェアSWは、例えば、図1に示したソースコードDB120に記憶される。
分割部502は、ソフトウェアSWをクラスタリングする。ここで、クラスタリングとは、例えば、ソフトウェアSWをグラフで表現し、当該グラフをクラスタに分割することである。クラスタは、ソフトウェアSWのグラフを部分グラフに分割したときの、部分グラフまたは部分グラフに属する構成要素の集合(構成要素集合)のことである。
具体的には、例えば、分割部502は、既存の構文解析技術および静的解析技術により、ソースコードDB120(図1参照)に記憶されたソフトウェアSWのソースコードを解析し、ソフトウェアSWに含まれる構成要素間の依存関係を抽出する。構成要素間の依存関係は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などの呼び出し関係、継承関係、包含関係やデータアクセス関係などの関係である。
なお、ソースコードDB120には、例えば、ソフトウェアSWの複数の構成要素の構成要素間の依存関係を示す依存関係情報が記憶されていてもよい。この場合、分割部502は、ソースコードDB120に記憶された依存関係情報を参照して、ソフトウェアSWに含まれる構成要素間の依存関係を抽出することができる。
そして、分割部502は、抽出した構成要素間の依存関係に基づいて、ソフトウェアSWに含まれる複数のプログラムを複数のクラスタに分割することにより、クラスタ情報を分割結果として出力する。なお、ソフトウェアSWを複数のクラスタに分割する具体的な処理内容については、例えば、特開2013−148987号公報を参照することができる。
以下の説明では、ソフトウェアSWの構成要素として、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラムを例に挙げて説明する。また、ソフトウェアSWに含まれる複数のプログラムを分割して得られる複数のクラスタを「クラスタC1〜Cn」と表記する場合がある(n:2以上の自然数)。また、クラスタC1〜Cnのうちの任意のクラスタを「クラスタCi」と表記する場合がある(i=1,2,…,n)。
ここで、分割結果として出力されるクラスタ情報の具体例について説明する。
図6は、クラスタ情報の具体例を示す説明図である。図6において、クラスタ情報600は、クラスタIDとプログラム名とを対応付けて示す情報である。クラスタIDは、クラスタCiを一意に識別する識別子である。プログラム名は、クラスタCiに属するプログラムの名称である。
クラスタ情報600によれば、ソフトウェアSWに含まれる複数のプログラムを分割して得られた各クラスタCiに属するプログラムを特定することができる。なお、図2の例題は、クラスタ情報600が示すクラスタC1に対応する。
図5の説明に戻り、係数算出部503は、クラスタCi内の各プログラムのランク値に基づいて、クラスタCi内の各プログラムに対応する第1の係数をそれぞれ算出する。ここで、ランク値とは、クラスタCi内のプログラム間の依存関係の連鎖の大本となるプログラムと、クラスタCi内の各プログラムとの関係度合いを示す値である。
換言すれば、ランク値は、クラスタCiにおいて、あるプログラムが、プログラム間の依存関係の連鎖の大本となるプログラムにどれだけ近いかを示す値である。したがって、ランク値は、プログラム間の依存関係の連鎖の大本となるプログラムに近いほど大きな値となる。
第1の係数(以下、「呼出元係数」と称する)は、クラスタCi内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタCiにおける当該単語の出現頻度に重みを付ける係数である。呼出元係数は、ランク値が高いプログラムほど、係数値が高くなるように算出される。
ここで、図7を用いて、呼出元係数について説明する。
図7は、プログラム間の依存関係を示す説明図(その1)である。図7において、グラフ700は、クラスタCi内のプログラム間の呼び出し関係の一例を示している。グラフ700では、呼び出し元から呼び出し先へと、上から下へ並ぶようにプログラム701〜707が配置されている。
ここで、クラスタCi内で最も呼び出し元側に位置するプログラム、および、当該プログラムに近いプログラムは、クラスタCiの目的を表すプログラムであるといえる。そこで、係数算出部503は、クラスタCi内の呼び出し元に近いほうに位置するプログラムほど、クラスタCiの目的を表しているとみなし、例えば、当該プログラムに1より大きな値の呼出元係数を設定する。
具体的には、例えば、係数算出部503は、グラフ700において最も呼び出し元側に位置するプログラム701,702に、呼出元係数「2.0」を設定することにしてもよい。また、係数算出部503は、それ以外のプログラム703〜707に、呼出元係数「1.0」を設定することにしてもよい。すなわち、プログラム703〜707については、呼出元係数を乗じても単語の出現頻度に影響を与えないものとしてもよい。
また、係数算出部503は、最も呼び出し元側に位置するプログラムでなく、最も呼び出し元側から2番目や3番目に位置するプログラムに対しても、1より大きな値の呼出元係数を設定することにしてもよい。この場合、呼出元係数は、例えば、最も呼び出し元側が最も高い値で、2番目がその次、3番目がその次に高い値となるように設定される。
より詳細に説明すると、まず、係数算出部503は、例えば、クラスタCi内のプログラム間の依存関係に基づいて、各プログラムにランク値を設定する。具体的には、例えば、係数算出部503は、クラスタCi内の最も呼び出し元側に近いプログラム(プログラム間の依存関係の連鎖の大本となるプログラム)から、最も呼び出し先側に近いプログラムに向かって順に値が低くなるようにランク値を設定する。
なお、係数算出部503は、必要に応じて、プログラム間の相互参照のサイクルを事前に削除する。例えば、係数算出部503は、既存技術のGreedy Cycle Removal法を用いて、プログラム間の相互参照のサイクルを削除することができる。
つぎに、係数算出部503は、設定した各プログラムのランク値に応じて、各プログラムに呼出元係数を設定する。例えば、係数算出部503は、ランク値が高いほど、呼出元係数の係数値が高くなるように、各プログラムに呼出元係数を設定する。
より具体的には、例えば、係数算出部503は、プログラムのランク値が「クラスタCi内の各プログラムのランク値の最大値−k」以上であれば、当該プログラムに呼出元係数「2.0」を設定することにしてもよい。また、係数算出部503は、プログラムのランク値が「クラスタCi内の各プログラムのランク値の最大値−k」未満であれば、当該プログラムに呼出元係数「1.0」を設定することにしてもよい。
kは、任意に設定可能な0以上の整数値である。例えば、「k=0」の場合、最もランク値の高いプログラムにのみ呼出元係数「2.0」が設定されることになる。
また、係数算出部503は、クラスタCi内の各プログラムが他のクラスタCj(j≠i、j=1,2,…,n)内のプログラムから呼び出される数に基づいて、クラスタCi内の各プログラムに対応する第2の係数をそれぞれ算出する。クラスタCi内の各プログラムが他のクラスタCj内のプログラムから呼び出される数は、ソフトウェアSWに含まれるプログラム間の依存関係から特定される。
第2の係数(以下、「遍在係数」と称する)は、クラスタCi内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタCiにおける当該単語の出現頻度に重みを付ける係数である。遍在係数は、他のクラスタCj内のプログラムから呼び出される数が多いプログラムほど、係数値が低くなるように算出される。
ここで、図8を用いて、遍在係数について説明する。
図8は、プログラム間の依存関係を示す説明図(その2)である。図8において、グラフ810は、クラスタCi内のプログラム(プログラム811〜819)間の呼び出し関係の一例を示している。また、グラフ820は、他のクラスタCj内のプログラム(821〜823)間の呼び出し関係の一例を示している。
ここで、呼び出し関係(依存関係)によるクラスタリングは、呼び出し関係の密なプログラムの集まりをクラスタとして発見するものである。ところが、プログラムの中には、所属するクラスタCi以外の他のクラスタCjに属するプログラムと呼び出し関係を有するものが多かれ少なかれ存在する。
図8の例では、クラスタCi(グラフ810)内のプログラム815は、他のクラスタCj(グラフ820)内のプログラム822,823からも呼び出されるプログラムである。所属するクラスタCi以外の他のクラスタCjに属するプログラムからも呼び出されているプログラムは、他のクラスタCiの機能や業務を実現するためにも呼び出されるプログラムである。
したがって、所属するクラスタCi以外の他のクラスタCjに属するプログラムからも多数呼び出されているプログラムは、所属するクラスタCiの目的や特徴を表すものではなく、汎用のユーティリティ機能を提供するプログラムである可能性が高い。この推定は、他のクラスタCjがクラスタCiとは異なる機能や業務を実装しているプログラムの集合であることが想定されるため成り立つ。
そこで、係数算出部503は、他のクラスタCjに属するプログラムから呼び出されているプログラムに対しては、その呼び出し数の多さに応じて低い値(0.0以上かつ1.0未満)の遍在係数を設定する。図8の例では、係数算出部503は、例えば、プログラム822,823に対しては、他のクラスタCjのプログラムからの呼び出し数(例えば、プログラム822,823の2つ)の多さに応じて低い値の遍在係数を設定する。
ただし、クラスタCi内の最も呼び出し元側のプログラムは、クラスタCiの機能を起動するために、他のクラスタCjのプログラムから呼び出されることがある。このため、係数算出部503は、最も呼び出し元側に位置するプログラムについては、他のクラスタCjに属するプログラムからの呼び出し数の多さにかかわらず低い値の遍在係数を設定しない。
より詳細に説明すると、係数算出部503は、下記式(1)および(2)を用いて、クラスタCi内の各プログラムに対応する遍在係数をそれぞれ算出することにしてもよい。ただし、f(cout)は、遍在係数である。coutは、クラスタCi内のプログラムが他のクラスタCjに属するプログラムから呼び出される数である。lは、遍在係数の下限値(l>0)であり、任意に設定可能である。tは、閾値であり、任意に設定可能である。
f(cout)=l (cout≧tのとき) …(1)
f(cout)=(l−1)/t×cout+1 (cout<tのとき) …(2)
なお、クラスタCi内のプログラム間の依存関係の連鎖の大本となるプログラム、すなわち、クラスタCi内で最も呼び出し元側に位置するプログラムについての呼び出し数coutは、「cout=0」とする。したがって、クラスタCi内で最も呼び出し元側に位置するプログラムの遍在係数は、上記式(2)を用いて算出される。
図9は、遍在係数を求める関数のグラフを示す説明図である。図9において、グラフ900は、上記式(1)および(2)の関係をグラフ化したものである。閾値tは、例えば、10程度の値に設定される。また、下限値lは、例えば、0.1程度の値に設定される。仮に下限値lを「l=1」とすると、呼び出し数coutが閾値t以上のプログラムは全く影響しないことになる。
なお、ここでは、遍在係数を求める関数として、他のクラスタCjのプログラムからの呼び出し数coutに応じて直線的に減少する関数を用いることにしたが、これに限らない。例えば、遍在係数を求める関数として、反比例などの単調減少する他の関数を用いることにしてもよい。
また、係数算出部503は、クラスタCi内のプログラムをスーパークラスとするクラスタCi内の他のプログラムとの継承関係の数に基づいて、クラスタCi内の各プログラムに対応する第3の係数をそれぞれ算出する。スーパークラス(親クラス)とは、オブジェクト指向プログラミングにおいて、あるクラスの仕様を継承して新しいクラス(サブクラス(子クラス))を作成する際に元となるクラスのことである。
第3の係数(以下、「サブクラス係数」と称する)は、クラスタCi内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタCiにおける当該単語の出現頻度に重みを付ける係数である。サブクラス係数は、クラスタCi内の他のプログラムとの継承関係の数が多いプログラムほど、係数値が高くなるように算出される。
ここで、図10を用いて、サブクラス係数について説明する。
図10は、プログラム間の依存関係を示す説明図(その3)である。図10において、グラフ1000は、クラスタCi内のプログラム(プログラム1001〜1007)間の呼び出し関係の一例を示している。ここでは、プログラミング言語として、Java言語やC++言語のようなオブジェクト指向言語が用いられている場合を想定する。
プログラム1007(受講コース)は、プログラム1003(年会費コース)、プログラム1004(月会費コース)、プログラム1005(毎回払いコース)およびプログラム1006(体験コース)の4つのクラスのスーパークラスである。また、プログラム1007と各プログラム1003〜1006との間の矢印は、継承関係を意味している。
すなわち、これら4つのサブクラス(プログラム1003〜1006)は、スーパークラス(プログラム1007)を継承したうえで、それぞれのコースに応じた固有な実装を追加して定義されたクラスである。この場合、プログラム1007は、クラスタCi内の4つのサブクラス(プログラム1003〜1006)に共通の性質を表すクラスである。
したがって、プログラム1007は、クラスタCiの性質を理解するうえで重要であるといえる。そこで、係数算出部503は、クラスタCi内のスーパークラスとなるプログラムに対しては、クラスタCi内の他のプログラムとの継承関係の数の多さに応じて高い値のサブクラス係数を設定する。なお、継承ではなく委譲とみなせる場合にも同様に扱うことにしてもよい。
より詳細に説明すると、まず、係数算出部503は、クラスタCi内の個々のプログラム間の依存関係について、継承であるか否かを判断する。プログラム間の依存関係が継承関係であるかの判断には、例えば、ソースコード解析等の手段によって明示された継承関係が得られる場合には、その情報を用いることにしてもよい。
一方、継承関係とメソッド呼び出しやフィールド参照との区別が失われており、単なる依存関係としてしか得られない場合には、例えば、多数のクラスから参照されており、名前に共通性がある場合には継承関係とみなすことができる。名前の共通性とは、図10の例では、「××コース」である。
サブクラスを定義する際に、スーパークラスにつけられた一般的な名前に修飾語を加えることで意味を限定して命名することは一般的に広く行われている。例えば、Java言語の標準ライブラリではReaderクラスに対して、BufferedReader、StringReader、InputStreamReaderなどのサブクラスが定義されている。したがって、このような名前の共通性を見る方法で継承関係を推定することが可能である。
つぎに、係数算出部503は、継承であるか否かを判断した結果に基づいて、クラスタCi内の各プログラムをスーパークラスとする継承関係の数を計数する。そして、係数算出部503は、例えば、下記式(3)を用いて、クラスタCi内の各プログラムに対応するサブクラス係数をそれぞれ算出する。ただし、f(csub)は、サブクラス係数である。csubは、クラスタCi内のプログラムをスーパークラスとする継承関係の数である。sは、任意に設定可能なパラメータであり、係数値が2倍になるのに必要な継承関係の数に相当する。
f(csub)=csub/s+1 …(3)
図11は、サブクラス係数を求める関数のグラフを示す説明図である。図11において、グラフ1100は、上記式(3)の関係をグラフ化したものである。パラメータsは、5程度の値に設定される。例えば、パラメータsを「s=5」とすると、クラスタCi内に自分のサブクラスが5つあるとサブクラス係数が2になる(つまり、単語の影響力が2倍になる)。
なお、ここでは、サブクラス係数を求める関数として、継承関数の数に対して直線的に増加する関数を用いることにしたが、これに限らない。例えば、サブクラス係数を求める関数として、対数関数のように単調増加する他の関数を用いることにしてもよい。
図5の説明に戻り、また、係数算出部503は、算出したクラスタCi内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数の少なくともいずれかの係数を用いて、当該各プログラムに対応する重み付け係数を決定する。ここで、重み付け係数とは、クラスタCiにおける単語の出現頻度の重み付けを行う際に用いる係数である。
具体的には、例えば、係数算出部503は、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のいずれかの係数を、各プログラムに対応する重み付け係数に決定してもよい。また、例えば、係数算出部503は、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のうちの2つ以上の係数を乗じて得られる値を、各プログラムに対応する重み付け係数に決定してもよい。
決定された重み付け係数は、例えば、クラスタCi内の各プログラムと対応付けて重み付け係数格納テーブル(後述する図13、図18、図22参照)に記憶される。なお、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のいずれの係数を用いて、各プログラムに対応する重み付け係数を決定するかは任意に設定可能である。
抽出部504は、クラスタCi内の各プログラムに対応する単語を抽出する。具体的には、例えば、抽出部504は、クラスタCi内の各プログラムのプログラム名、クラス名、ファイル名、ディレクトリ名、パッケージ名、関数名などの識別子から単語を抽出する。
一例として、プログラム名から単語を抽出する場合を例に挙げると、抽出部504は、プログラム名を形態素解析して単語に切り分けることで、各プログラムに対応する単語を抽出することができる。ただし、各プログラムは自然言語(日本語)のプログラム名を持っているものとする。英語やフランス語のように単語が空白で分けられている言語の場合は、抽出部504は、例えば、プログラム名から空白で区切られた各単語を取り出すことで、各プログラムに対応する単語を抽出することができる。
また、Java言語の完全修飾クラス名を用いる場合は、抽出部504は、区切りの記号や大文字小文字の切り替わる箇所を利用して単語を取り出すことで、各プログラムに対応する単語を抽出することができる。例えば、「java.io.FileInputStream」という完全修飾クラス名を持つクラスであれば、「java,io,file,input,stream」という各単語を取り出すことができる。他のプログラミング言語ではソースファイルのファイル名とディレクトリ名を同様に扱うことができる。
抽出された単語は、例えば、クラスタCi内の各プログラムと対応付けて抽出単語格納テーブル(後述する図14、図19、図23参照)に記憶される。
重み付け部505は、クラスタCiにおける単語の出現頻度に重み付けを行う。具体的には、例えば、重み付け部505は、抽出された単語ごとに、クラスタCi内の各プログラムにおける当該単語の出現頻度に、決定された当該各プログラムに対応する重み付け係数を乗じた値を累積することにより、特徴スコアを算出する。
ここで、各プログラムにおける単語の出現頻度は、各プログラムにおける単語の出現回数、すなわち、各プログラムから抽出された当該単語の個数に相当する。また、特徴スコアは、クラスタCiにおける重み付けされた単語の出現頻度に相当し、当該単語がクラスタCiの特徴をどの程度表しているのかを示す指標値である。
算出された単語の特徴スコアは、例えば、クラスタCiと対応付けて特徴スコア格納テーブル(後述する図15、図20、図24参照)に記憶される。
出力部506は、クラスタCiに対応付けて、クラスタCiにおける重み付けされた単語の出現頻度を出力する。出力部506の出力形式としては、例えば、I/F303による他のコンピュータ(例えば、クライアント装置102)への送信、メモリ302、ディスク305などの記憶装置への記憶、不図示のディスプレイへの表示、不図示のプリンタへの印刷出力などがある。
具体的には、例えば、出力部506は、特徴スコアテーブル(後述する図15、図20、図24参照)を参照して、クラスタCiに対応付けて、各単語の特徴スコアを示すクラスタ特徴語情報を出力することにしてもよい。この際、出力部506は、例えば、特徴スコアが相対的に高い上位複数個(例えば、3個)の単語についての特徴スコアを示すクラスタ特徴語情報を生成して出力することにしてもよい。
また、出力部506は、例えば、特徴スコアが所定値以上の単語についての特徴スコアを示すクラスタ特徴語情報を生成して出力することにしてもよい。所定値は、任意に設定可能である。なお、クラスタ特徴語情報の具体例については、図16を用いて後述する。
(特徴スコアの第1の算出例)
つぎに、重み付け係数を用いた特徴スコアの算出例について説明する。ここでは、まず、図12〜図15を用いて、上述した「呼出元係数」を重み付け係数とした場合の特徴スコアの第1の算出例について説明する。また、例題として、図2に示したようなグラフ構造を有するクラスタC1を用いる。
この場合、まず、係数算出部503は、クラスタC1内のプログラム間の依存関係に基づいて、各プログラムp1〜p9(図2参照)にランク値を設定する。具体的には、例えば、係数算出部503は、最も呼び出し元側に近いプログラムに対して値が高くなるように、また、最も呼び出し先側に近いプログラムに対して値が低くなるようにランク値を設定する。
設定されたランク値は、例えば、図12に示すようなランク値格納テーブルに記憶される。ここで、ランク値格納テーブルの記憶内容について説明する。
図12は、ランク値格納テーブルの記憶内容の一例を示す説明図である。図12において、ランク値格納テーブル1200は、クラスタID、プログラム名およびランク値のフィールドを有し、各フィールドに情報を設定することで、ランク値情報1200−1〜1200−9をレコードとして記憶する。
ここで、クラスタIDは、クラスタCiを一意に識別する識別子である。プログラム名は、クラスタCiに属するプログラムの名称である。ランク値は、クラスタCiに属するプログラムのランク値である。例えば、ランク値情報1200−1は、クラスタC1に属するプログラム名「支払証明書(月別)」のプログラムp1のランク値「4」を示す。
つぎに、係数算出部503は、ランク値格納テーブル1200を参照して、各プログラムp1〜p9のランク値に応じて、各プログラムp1〜p9に呼出元係数を設定する。具体的には、例えば、係数算出部503は、ランク値が「クラスタC1内の各プログラムのランク値の最大値−k」以上であるプログラムに呼出元係数「2.0」を設定する(ただし、「k=0」とする)。また、係数算出部503は、ランク値が「クラスタC1内の各プログラムのランク値の最大値−k」未満であるプログラムに呼出元係数「1.0」を設定する。
ここで、クラスタC1内の各プログラムのランク値の最大値は「4」である。また、「k」を「k=0」とする。この場合、例えば、プログラム名「支払証明書(月別)」のプログラムp1の呼出元係数は「2.0」となる。また、例えば、プログラム名「検索ユーティリティ」のプログラムp9の呼出元係数は「1.0」となる。
そして、係数算出部503は、設定した各プログラムp1〜p9の呼出元係数を、各プログラムp1〜p9の重み付け係数に決定する。決定された各プログラムp1〜p9の重み付け係数は、図13に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
図13は、重み付け係数格納テーブルの記憶内容の一例を示す説明図(その1)である。図13において、重み付け係数格納テーブル1300は、クラスタID、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報1300−1〜1300−9をレコードとして記憶する。
ここで、クラスタIDは、クラスタCiを一意に識別する識別子である。プログラム名は、クラスタCiに属するプログラムの名称である。重み付け係数は、クラスタCiに属するプログラムに対応する重み付け係数である。例えば、重み付け係数情報1300−1は、クラスタC1に属するプログラム名「支払証明書(月別)」のプログラムp1の重み付け係数「2.0」を示す。
抽出部504は、クラスタC1内の各プログラムp1〜p9に対応する単語を抽出する。具体的には、例えば、抽出部504は、クラスタC1内の各プログラムp1〜p9のプログラム名から単語を抽出する。抽出された単語は、例えば、図14に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
図14は、抽出単語格納テーブルの記憶内容の一例を示す説明図(その1)である。図14において、抽出単語格納テーブル1400は、クラスタID、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報1400−1〜1400−9をレコードとして記憶する。
ここで、クラスタIDは、クラスタCiを一意に識別する識別子である。プログラム名は、クラスタCiに属するプログラムの名称である。単語群は、クラスタCiに属するプログラムから抽出された単語をスペース区切りで並べたものである。重み付け係数は、クラスタCiに属するプログラムに対応する重み付け係数(呼出元係数)である。
例えば、抽出単語情報1400−1は、クラスタC1に属するプログラム名「支払証明書(月別)」のプログラムp1から抽出された単語群「支払 証明書 月別」およびプログラムp1の重み付け係数「2.0」を示す。
そして、重み付け部505は、抽出単語格納テーブル1400を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「支払」は、プログラム名「支払証明書(月別)」のプログラムp1と、プログラム名「支払証明書(日別)」のプログラムp2とからそれぞれ一つ抽出される。すなわち、各プログラムp1,p2における単語「支払」の出現頻度(出現回数)は「1」である。また、各プログラムp1,p2に対応する重み付け係数は「2.0」である。
この場合、重み付け部505は、例えば、プログラムp1における単語「支払」の出現頻度「1」に重み付け係数「2.0」を乗じた値と、プログラムp2における単語「支払」の出現頻度「1」に重み付け係数「2.0」を乗じた値とを加算する。これにより、単語「支払」の特徴スコア「4」を算出することができる。
算出された単語の特徴スコアは、例えば、図15に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
図15は、特徴スコア格納テーブルの記憶内容の一例を示す説明図(その1)である。図15において、特徴スコア格納テーブル1500は、クラスタID、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報1500−1〜1500−13をレコードとして記憶する。
ここで、クラスタIDは、クラスタCiを一意に識別する識別子である。単語は、クラスタCiに属するプログラムから抽出された単語である。特徴スコアは、クラスタCiにおける重み付けされた単語の出現頻度に相当し、当該単語がクラスタCiの特徴をどの程度表しているのかを示す指標値である。
例えば、特徴スコア情報1500−1は、クラスタC1に属する単語「支払」の特徴スコア「4」を示す。また、例えば、特徴スコア情報1500−14は、クラスタC1に属する単語「ユーティリティ」の特徴スコア「1」を示す。
なお、クラスタCi内のプログラムにおける単語の出現頻度(出現回数)は、例えば、tf−idf法におけるtf値に相当する。idf値まで考慮する場合には、上述した特徴スコアにidf値を乗算することにしてもよい。ただし、この場合、重み付け部505は、クラスタC1〜Cnについての抽出単語情報を生成した後に、各単語のidf値を計算して特徴スコアに乗じることになる。
(クラスタ特徴語情報の具体例)
ここで、図16を用いて、特徴スコア格納テーブル1500をもとに生成されるクラスタ特徴語情報の具体例について説明する。
図16は、クラスタ特徴語情報の具体例を示す説明図である。図16において、クラスタ特徴語情報1600は、クラスタIDと、単語と、特徴スコアとを対応付けて示す情報である。クラスタ特徴語情報1600によれば、「支払」と「証明書」が、特徴スコア「4」で最も高い値となっており、クラスタC1の特徴を表す特徴語として最も相応しい単語であると判断することができる。
これにより、tf−idf法をそのままソフトウェアクラスタに適用した際には他の単語に埋もれてしまう「支払」と「証明書」を、クラスタC1の特徴語として抽出することができる。クラスタ特徴語情報1600は、例えば、分析支援装置101からクライアント装置102に送信される。
この結果、クライアント装置102において、例えば、後述の図17に示すように、ソフトウェアSWの構造を地図上に可視化して、図4に示したディスプレイ406に表示することができるようになる。なお、ソフトウェアSWの構造を地図上に可視化する具体的な処理内容については、例えば、特開2013−152576号公報を参照することができる。
図17は、ソフトウェアSWの構造を地図上に可視化して示す説明図である。図17において、ソフトウェアSWから分割された複数のクラスタ(例えば、クラスタC1)が、地図を模した形式によって可視化されている。
ここでは、プログラム(ソースファイル)1個が、地図上の建物1つにあたる。建物の色は、例えば、プログラムが属するパッケージ(あるいは、ディレクトリ)によって分けられている。建物のまとまった区画が、クラスタリングによって発見されたクラスタに相当する。
また、地図の各区画には、当該各区画に対応するクラスタの特徴語がラベルとして表示される。図17の例では、クラスタC1に対応する区画1710に、クラスタC1の特徴語「支払;証明書」がラベル1720として表示されている。この特徴語「支払;証明書」は、図16に示したクラスタ特徴語情報1600から特定される、クラスタC1の単語群のうち特徴スコアが最も高い単語である。
各区画に対応するラベルによれば、各区間、すなわち、各クラスタがどのような性質のものであるかを人が理解しやすいように支援することができる。例えば、ラベル1720によれば、クライアント装置102のユーザは、クラスタC1が支払証明書の処理についてのものであることがわかる。
(特徴スコアの第2の算出例)
図18〜図20を用いて、上述した「遍在係数」を重み付け係数とした場合の特徴スコアの第2の算出例について説明する。また、例題として、図2に示したようなグラフ構造を有するクラスタC1を用いる。
ただし、ここでは、プログラム名「金額編集」のプログラムp5が、他のクラスタに属するプログラム10本からも呼ばれていた場合を想定する。また、クラスタC1内のプログラムp5以外の他のプログラムp1〜p4,p6〜p9は、他のクラスタに属するプログラムから呼ばれていないものとする。
まず、係数算出部503は、上記式(1)および(2)を用いて、クラスタC1内の各プログラムp1〜p9に対応する遍在係数をそれぞれ算出する。ここでは、閾値tを「t=10」とし、遍在係数の下限値lを「l=0.1」とする。
この場合、クラスタC1内のプログラムp5以外の他のプログラムp1〜p4,p6〜p9の呼び出し数coutは、全て「0」であり閾値t未満となる。したがって、プログラムp5以外の他のプログラムp1〜p4,p6〜p9の遍在係数は、全て「1.0」となる。一方で、プログラムp5の呼び出し数coutは、「10」であり閾値t以上となる。したがって、プログラムp5の遍在係数は、「0.1」となる。
そして、係数算出部503は、算出した各プログラムp1〜p9の遍在係数を、各プログラムp1〜p9の重み付け係数に決定する。決定された各プログラムp1〜p9の重み付け係数は、図18に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
図18は、重み付け係数格納テーブルの記憶内容の一例を示す説明図(その2)である。図18において、重み付け係数格納テーブル1800は、クラスタID、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報1800−1〜1800−9をレコードとして記憶する。
例えば、重み付け係数情報1800−1は、クラスタC1に属するプログラム名「支払証明書(月別)」のプログラムp1の重み付け係数「1.0」を示す。また、例えば、重み付け係数情報1800−5は、クラスタC1に属するプログラム名「金額編集」のプログラムp5の重み付け係数「0.1」を示す。ここでは、プログラムp1〜p9のうち、他のクラスタに属するプログラムからも呼び出されるプログラムp5の重み付け係数が相対的に低くなっている。
抽出部504は、クラスタC1内の各プログラムp1〜p9に対応する単語を抽出する。抽出された単語は、例えば、図19に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
図19は、抽出単語格納テーブルの記憶内容の一例を示す説明図(その2)である。図19において、抽出単語格納テーブル1900は、クラスタID、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報1900−1〜1900−9をレコードとして記憶する。
例えば、抽出単語情報1900−5は、クラスタC1に属するプログラム名「金額編集」のプログラムp5から抽出された単語群「金額 編集」およびプログラムp5の重み付け係数(遍在係数)「0.1」を示す。
そして、重み付け部505は、抽出単語格納テーブル1900を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「金額」は、プログラム名「利用金額計算」のプログラムp3と、プログラム名「金額編集」のプログラムp5と、プログラム名「金額計算」のプログラムp8とからそれぞれ一つ抽出される。
すなわち、各プログラムp3,p5,p8における単語「金額」の出現頻度(出現回数)は「1」である。また、プログラムp3に対応する重み付け係数は「1.0」である。プログラムp5に対応する重み付け係数は「0.1」である。プログラムp8に対応する重み付け係数は「1.0」である。
この場合、重み付け部505は、例えば、プログラムp3における単語「金額」の出現頻度「1」に重み付け係数「1.0」を乗じた値と、プログラムp5における単語「金額」の出現頻度「1」に重み付け係数「0.1」を乗じた値と、プログラムp8における単語「金額」の出現頻度「1」に重み付け係数「1.0」を乗じた値とを加算する。これにより、単語「金額」の特徴スコア「2.1」を算出することができる。
算出された単語の特徴スコアは、例えば、図20に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
図20は、特徴スコア格納テーブルの記憶内容の一例を示す説明図(その2)である。図20において、特徴スコア格納テーブル2000は、クラスタID、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報2000−1〜2000−13をレコードとして記憶する。
例えば、特徴スコア情報2000−6は、クラスタC1に属する単語「金額」の特徴スコア「2.1」を示す。また、例えば、特徴スコア情報2000−9は、クラスタC1に属する単語「編集」の特徴スコア「1.1」を示す。このように、単語「金額」と単語「編集」の特徴スコアがそれぞれ、上述した第1の算出例の場合に比べて低い値となっており、クラスタC1の目的や特徴を表さないこれら単語の特徴スコアを低めることができている。
(特徴スコアの第3の算出例)
つぎに、図21〜図24を用いて、上述した「サブクラス係数」を重み付け係数とした場合の特徴スコアの第3の算出例について説明する。また、例題として、図21に示すようなグラフ構造を有するクラスタC1を用いる。
図21は、クラスタのグラフ構造の一例を示す説明図(その2)である。図21において、グラフ2100は、ソフトウェアSWに対してクラスタリングを行った結果として得られたクラスタC1を、クラスタC1に属するプログラム間の呼び出し関係を有向辺とする有向グラフ構造により表現したものである。
このグラフ2100は、図2に示したグラフ200に対して、プログラム名「支払証明書」のプログラムp10を追加したものである。プログラムp10は、プログラム名「支払証明書(月別)」のプログラムp1とプログラム名「支払証明書(日別)」のプログラムp2のスーパークラスとして定義されているものである。つまり、これら2つのサブクラス(プログラムp1,p2)が、「支払証明書」を継承し、「月別」「日別」のための個別処理のみをサブクラスで定義しているという関係がある。
まず、係数算出部503は、上記式(3)を用いて、クラスタC1内の各プログラムp1〜p10に対応するサブクラス係数をそれぞれ算出する。ここでは、パラメータsを「s=5」とする。図21の例では、クラスタC1内のプログラムp10以外の他のプログラムp1〜p9の継承関係の数csubは、全て「0」である。
したがって、プログラムp10以外の他のプログラムp1〜p9のサブクラス係数は、全て「1.0」となる。一方で、プログラムp10の継承関係の数csubは、「2」である。したがって、プログラムp10のサブクラス係数は、「1.4(=2/5+1)」となる。
そして、係数算出部503は、算出した各プログラムp1〜p10のサブクラス係数を、各プログラムp1〜p10の重み付け係数に決定する。決定された各プログラムp1〜p10の重み付け係数は、図22に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
図22は、重み付け係数格納テーブルの記憶内容の一例を示す説明図(その3)である。図22において、重み付け係数格納テーブル2200は、クラスタID、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報2200−1〜2200−10をレコードとして記憶する。
例えば、重み付け係数情報2200−1は、クラスタC1に属するプログラム名「支払証明書(月別)」のプログラムp1の重み付け係数「1.0」を示す。また、例えば、重み付け係数情報2200−3は、クラスタC1に属するプログラム名「支払証明書」のプログラムp10の重み付け係数「1.4」を示す。ここでは、プログラムp1〜p10のうち、サブクラスを2つ持つプログラムp10の重み付け係数が相対的に高くなっている。
抽出部504は、クラスタC1内の各プログラムp1〜p10に対応する単語を抽出する。抽出された単語は、例えば、図23に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
図23は、抽出単語格納テーブルの記憶内容の一例を示す説明図(その3)である。図23において、抽出単語格納テーブル2300は、クラスタID、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報2300−1〜2300−10をレコードとして記憶する。
例えば、抽出単語情報2300−3は、クラスタC1に属するプログラム名「支払証明書」のプログラムp10から抽出された単語群「支払 証明書」およびプログラムp10の重み付け係数(サブクラス係数)「1.4」を示す。
そして、重み付け部505は、抽出単語格納テーブル2300を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「支払」は、プログラム名「支払証明書(月別)」のプログラムp1と、プログラム名「支払証明書(日別)」のプログラムp2と、プログラム名「支払証明書」のプログラムp10とからそれぞれ一つ抽出される。
すなわち、各プログラムp1,p2,p10における単語「支払」の出現頻度(出現回数)は「1」である。また、プログラムp1に対応する重み付け係数は「1.0」である。プログラムp2に対応する重み付け係数は「1.0」である。プログラムp10に対応する重み付け係数は「1.4」である。
この場合、重み付け部505は、例えば、プログラムp1における単語「支払」の出現頻度「1」に重み付け係数「1.0」を乗じた値と、プログラムp2における単語「支払」の出現頻度「1」に重み付け係数「1.0」を乗じた値と、プログラムp10における単語「支払」の出現頻度「1」に重み付け係数「1.4」を乗じた値とを加算する。これにより、単語「支払」の特徴スコア「3.4」を算出することができる。
算出された単語の特徴スコアは、例えば、図24に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
図24は、特徴スコア格納テーブルの記憶内容の一例を示す説明図(その3)である。図24において、特徴スコア格納テーブル2400は、クラスタID、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報2400−1〜2400−13をレコードとして記憶する。
例えば、特徴スコア情報2400−1は、クラスタC1に属する単語「支払」の特徴スコア「3.4」を示す。また、例えば、特徴スコア情報2400−2は、クラスタC1に属する単語「証明書」の特徴スコア「3.4」を示す。このように、スーパークラスである「支払証明書」を構成する単語「支払」と単語「証明書」とが持ち上げられていることがわかる。
なお、第3の計算例では、例えば、呼び出し元側に位置するほど高い重みを与える呼出元係数を使用していない。呼出元係数とサブクラス係数を併用すると、単語「支払」と単語「証明書」の特徴スコアはより高く持ち上げられることになる。
(分析支援装置101の分析支援処理手順)
つぎに、図25〜図30を用いて、分析支援装置101の分析支援処理手順について説明する。
図25は、分析支援装置101の分析支援処理手順の一例を示すフローチャートである。図25のフローチャートにおいて、まず、分析支援装置101は、ソースコードDB120から分析対象となるソフトウェアSWのソースコードを読み込む(ステップS2501)。
そして、分析支援装置101は、ソフトウェアSWのソースコードを解析して、ソフトウェアSWをクラスタリングする(ステップS2502)。つぎに、分析支援装置101は、クラスタCiの「i」を「i=1」とし(ステップS2503)、クラスタリングにより得られたクラスタC1〜CnからクラスタCiを選択する(ステップS2504)。
そして、分析支援装置101は、選択したクラスタCi内の各プログラムに対応する重み付け係数を算出する重み付け係数算出処理を実行する(ステップS2505)。なお、重み付け係数算出処理の具体的な処理手順については、図26を用いて後述する。
つぎに、分析支援装置101は、選択したクラスタCi内の各プログラムに対応する単語の特徴スコアを算出する特徴スコア算出処理を実行する(ステップS2506)。なお、特徴スコア算出処理の具体的な処理手順については、図30を用いて後述する。
つぎに、分析支援装置101は、算出された単語の特徴スコアに基づいて、選択したクラスタCiのクラスタ特徴語情報を生成する(ステップS2507)。そして、分析支援装置101は、生成したクラスタCiのクラスタ特徴語情報を出力する(ステップS2508)。
つぎに、分析支援装置101は、クラスタCiの「i」をインクリメントして(ステップS2509)、「i」が「n」より大きくなったか否かを判断する(ステップS2510)。ここで、「i」が「n」以下の場合(ステップS2510:No)、分析支援装置101は、ステップS2504に戻る。一方、「i」が「n」より大きい場合(ステップS2510:Yes)、分析支援装置101は、本フローチャートによる一連の処理を終了する。
これにより、ソフトウェアSWをクラスタリングして得られる各クラスタCiを特徴付ける単語を抽出することが可能となる。
つぎに、図25に示したステップS2505の重み付け係数算出処理の具体的な処理手順について説明する。
図26は、重み付け係数算出処理の具体的な処理手順の一例を示すフローチャートである。図26のフローチャートにおいて、まず、分析支援装置101は、クラスタCiに属する各プログラムに対応する呼出元係数を算出する呼出元係数算出処理を実行する(ステップS2601)。なお、呼出元係数算出処理の具体的な処理手順については、図27を用いて後述する。
つぎに、分析支援装置101は、クラスタCiに属する各プログラムに対応する遍在係数を算出する遍在係数算出処理を実行する(ステップS2602)。なお、遍在係数算出処理の具体的な処理手順については、図28を用いて後述する。
つぎに、分析支援装置101は、クラスタCiに属する各プログラムに対応するサブクラス係数を算出するサブクラス係数算出処理を実行する(ステップS2603)。なお、サブクラス係数算出処理の具体的な処理手順については、図29を用いて後述する。
そして、分析支援装置101は、算出したクラスタCi内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数に基づいて、当該各プログラムに対応する重み付け係数を決定する(ステップS2604)。
これにより、クラスタCi内の各プログラムに対応する重み付け係数を算出することができる。なお、呼出元係数、遍在係数およびサブクラス係数のいずれの係数を用いて、重み付け係数を決定するかは、例えば、設定ファイル、または、ユーザにより指定される。
つぎに、図26に示したステップS2601の呼出元係数算出処理の具体的な処理手順について説明する。
図27は、呼出元係数算出処理の具体的な処理手順の一例を示すフローチャートである。図27のフローチャートにおいて、まず、分析支援装置101は、クラスタCi内のプログラム間の依存関係に基づいて、各プログラムにランク値を設定する(ステップS2701)。
つぎに、分析支援装置101は、クラスタCi内の未選択のプログラムを選択する(ステップS2702)。そして、分析支援装置101は、選択したプログラムのランク値に応じて、当該プログラムに呼出元係数を算出する(ステップS2703)。つぎに、分析支援装置101は、クラスタCi内の未選択のプログラムがあるか否かを判断する(ステップS2704)。
ここで、未選択のプログラムがある場合(ステップS2704:Yes)、分析支援装置101は、ステップS2702に戻る。一方、未選択のプログラムがない場合(ステップS2704:No)、分析支援装置101は、呼出元係数算出処理を呼び出したステップに戻る。
これにより、クラスタCi内の各プログラムに対応する呼出元係数を算出することができる。
つぎに、図26に示したステップS2602の遍在係数算出処理の具体的な処理手順について説明する。
図28は、遍在係数算出処理の具体的な処理手順の一例を示すフローチャートである。図28のフローチャートにおいて、まず、分析支援装置101は、クラスタCi内の未選択のプログラムを選択する(ステップS2801)。そして、分析支援装置101は、クラスタCi内のプログラム間の依存関係に基づいて、選択したプログラムが他のクラスタCj内のプログラムから呼び出される数を算出する(ステップS2802)。
つぎに、分析支援装置101は、算出した他のクラスタCj内のプログラムからの呼び出し数に基づいて、上記式(1)および(2)を用いて、選択したプログラムに対応する遍在係数を算出する(ステップS2803)。そして、分析支援装置101は、クラスタCi内の未選択のプログラムがあるか否かを判断する(ステップS2804)。
ここで、未選択のプログラムがある場合(ステップS2804:Yes)、分析支援装置101は、ステップS2801に戻る。一方、未選択のプログラムがない場合(ステップS2804:No)、分析支援装置101は、遍在係数算出処理を呼び出したステップに戻る。
これにより、クラスタCi内の各プログラムに対応する遍在係数を算出することができる。
つぎに、図26に示したステップS2603のサブクラス係数算出処理の具体的な処理手順について説明する。
図29は、サブクラス係数算出処理の具体的な処理手順の一例を示すフローチャートである。図29のフローチャートにおいて、まず、分析支援装置101は、クラスタCi内の未選択のプログラムを選択する(ステップS2901)。そして、分析支援装置101は、選択したプログラムをスーパークラスとするクラスタCi内の他のプログラムとの継承関係の数を算出する(ステップS2902)。
つぎに、分析支援装置101は、算出した他のプログラムとの継承関係の数に基づいて、上記式(3)を用いて、選択したプログラムに対応するサブクラス係数を算出する(ステップS2903)。そして、分析支援装置101は、クラスタCi内の未選択のプログラムがあるか否かを判断する(ステップS2904)。
ここで、未選択のプログラムがある場合(ステップS2904:Yes)、分析支援装置101は、ステップS2901に戻る。一方、未選択のプログラムがない場合(ステップS2904:No)、分析支援装置101は、サブクラス係数算出処理を呼び出したステップに戻る。
これにより、クラスタCi内の各プログラムに対応するサブクラス係数を算出することができる。
つぎに、図25に示したステップS2506の特徴スコア算出処理の具体的な処理手順について説明する。
図30は、特徴スコア算出処理の具体的な処理手順の一例を示すフローチャートである。図30のフローチャートにおいて、まず、分析支援装置101は、クラスタCi内の未選択のプログラムを選択する(ステップS3001)。つぎに、分析支援装置101は、選択したプログラムに対応する単語を抽出する(ステップS3002)。
そして、分析支援装置101は、抽出した単語を、選択したプログラムと対応付けて抽出単語格納テーブルに記録する(ステップS3003)。つぎに、分析支援装置101は、クラスタCi内の未選択のプログラムがあるか否かを判断する(ステップS3004)。
ここで、未選択のプログラムがある場合(ステップS3004:Yes)、分析支援装置101は、ステップS3001に戻る。一方、未選択のプログラムがない場合(ステップS3004:No)、分析支援装置101は、抽出単語格納テーブルを参照して、未選択の単語を選択する(ステップS3005)。
そして、分析支援装置101は、選択した単語が、特徴スコア格納テーブルに登録済みであるか否かを判断する(ステップS3006)。ここで、選択した単語が登録済みの場合(ステップS3006:Yes)、分析支援装置101は、ステップS3008に移行する。
一方、選択した単語が未登録の場合(ステップS3006:No)、分析支援装置101は、クラスタCiのクラスタIDと対応付けて、選択した単語を特徴スコア格納テーブルに登録する(ステップS3007)。つぎに、分析支援装置101は、抽出単語格納テーブルを参照して、選択した単語の重み付け係数を特定する(ステップS3008)。
そして、分析支援装置101は、特定した単語の重み付け係数を、特徴スコア格納テーブル内の当該単語の特徴スコアに加算する(ステップS3009)。つぎに、分析支援装置101は、抽出単語格納テーブルから選択していない未選択の単語があるか否かを判断する(ステップS3010)。
ここで、未選択の単語がある場合(ステップS3010:Yes)、分析支援装置101は、ステップS3005に戻る。一方、未選択の単語がない場合(ステップS3010:No)、分析支援装置101は、特徴スコア算出処理を呼び出したステップに戻る。
これにより、クラスタCi内の各プログラムに対応する単語の特徴スコアを算出することができる。
以上説明したように、実施の形態にかかる分析支援装置101によれば、分析対象となるソフトウェアSWの複数のプログラムのプログラム間の依存関係に基づいて、複数のプログラムを分割して得られるクラスタCiにおける単語の出現頻度に重み付けを行うことができる。そして、分析支援装置101によれば、重み付けした単語の出現頻度(特徴スコア)をクラスタCiと対応付けて出力することができる。
これにより、ソフトウェアSWのプログラム間の依存関係から特定される、クラスタCiに特徴的な単語に対して重みを付けることができる。このため、クラスタCiの主要な目的を表す単語が、当該目的を担うプログラムから使用される手段としてのプログラムに関係した単語に埋もれてしまうことを防いで、より直感的にクラスタCiの特徴を理解しやすい単語を抽出することが可能となる。
また、分析支援装置101によれば、クラスタCi内の各プログラムのランク値に基づいて、当該ランク値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタCiにおける単語の出現頻度に重み付けを行うことができる。ランク値は、クラスタCi内のプログラム間の依存関係の連鎖の大本となるプログラムとクラスタCi内の各プログラムとの関係度合いを示す値である。具体的には、例えば、分析支援装置101は、クラスタCi内の各プログラムについて、ランク値の高さに応じて係数値が高くなる呼出元係数を設定する。そして、分析支援装置101は、設定した各プログラムの呼出元係数(重み付け係数)に基づいて、当該呼出元係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタCiにおける単語の出現頻度に重み付けを行う。
これにより、クラスタCi内の呼び出し元に近いほうに位置し、クラスタCiの主要な目的を担っている可能性が高いプログラムに対応する単語の評価を相対的に高くすることができ、より直感的にクラスタCiの特徴を理解しやすい単語を抽出可能となる。
また、分析支援装置101によれば、クラスタCi内の各プログラムが他のクラスタCj内のプログラムから呼び出される数に基づいて、当該数が大きいプログラムに対応する単語の出現頻度が低くなるように、クラスタCiにおける単語の出現頻度の重み付けを行うことができる。具体的には、例えば、分析支援装置101は、クラスタCi内の各プログラムについて、各プログラムが他のクラスタCj内のプログラムから呼び出される数の大きさに応じて係数値が低くなる遍在係数を算出することができる。そして、分析支援装置101は、算出した各プログラムの遍在係数(重み付け係数)に基づいて、当該遍在係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタCiにおける単語の出現頻度に重み付けを行う。
これにより、他のクラスタCj内のプログラムから多数呼び出され、汎用のユーティリティ機能を提供するものである可能性が高いプログラムに対応する単語の評価を相対的に低くすることができる。換言すれば、クラスタCiの主要な目的を担っている可能性が低いプログラムに対応する単語の評価を相対的に低くすることができ、より直感的にクラスタCiの特徴を理解しやすい単語を抽出可能となる。
また、分析支援装置101によれば、クラスタCi内のプログラムをスーパークラスとするクラスタCi内の他のプログラムとの継承関係の数に基づいて、当該数が大きいプログラムに対応する単語の出現頻度が高くなるように、クラスタCiにおける単語の出現頻度の重み付けを行うことができる。具体的には、例えば、分析支援装置101は、クラスタCi内の各プログラムについて、各プログラムをスーパークラスとするクラスタCi内の他のプログラムとの継承関係の数の大きさに応じて係数値が高くなるサブクラス係数を算出する。そして、分析支援装置101は、算出した各プログラムのサブクラス係数(重み付け係数)に基づいて、当該サブクラス係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタCiにおける単語の出現頻度に重み付けを行う。
これにより、クラスタCi内の多数のサブクラスのスーパークラスであり、クラスタCi内の複数のプログラムの共通の性質を表すものである可能性が高いプログラムに対応する単語の評価を相対的に高くすることができる。換言すれば、クラスタCiの性質を理解するうえで重要であるといえるプログラムに対応する単語の評価を相対的に高くすることができ、より直感的にクラスタCiの特徴を理解しやすい単語を抽出可能となる。
また、分析支援装置101によれば、クラスタCi内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のうちの2つ以上の係数を乗じて得られる値を、各プログラムに対応する重み付け係数に決定することができる。これにより、呼出元係数、遍在係数およびサブクラス係数のそれぞれの係数の特徴を組み合わせて、クラスタCiにおける単語の出現頻度に重み付けを行うことができる。
例えば、クラスタリングによってクラスタCiを得た際、クラスタCi内の依存関係の階層の下位のほうで、多数の依存関係が一つのプログラムに対して集中していることがある。これら依存関係には、スーパークラスへの参照(継承)と、汎用のユーティリティ機能の呼び出しとの両方がある。スーパークラスへの参照(継承)のほうは、参照先のプログラムの名前がクラスタCiの特徴の理解のために重要であるが、汎用のユーティリティ機能の呼び出しのほうは重要ではない。両者の判別は、クラスタCiのグラフ構造だけでは判断できないが、遍在係数とサブクラス係数とを併用することにより可能となる。例えば、他のクラスタCiからの呼び出しが多数であれば、汎用のユーティリティ機能と判断されて遍在係数が低い値に計算され、クラスタCi内の他のプログラムとの継承関係の数が多ければ、サブクラス係数が高くなるという形で重要性を判別することができる。すなわち、遍在係数とサブクラス係数とを乗算した重み付け係数を用いることで、スーパークラスであり、かつ、クラスタCi外から多数参照されている場合には互いの効果が相殺されることになる。
また、分析支援装置101によれば、重み付けした単語の出現頻度に基づいて、クラスタCi内の各プログラムに対応する単語のうち、当該出現頻度が高い上位複数個の単語、あるいは、当該出現頻度が所定値以上の単語を示すクラスタ特徴語情報を生成することができる。そして、分析支援装置101によれば、生成したクラスタ特徴語情報を出力することができる。これにより、クラスタCiの特徴を表すものとして相応しい単語を絞り込んで提供することができる。
これらのことから、分析支援装置101によれば、ソフトウェアSWを分割して得られるクラスタCiが、どのような性質のものであるかを人が理解しやすい説明語句を生成することが可能となり、ソフトウェアSWの分析を支援することができる。
なお、本実施の形態で説明した分析支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析支援プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本分析支援プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータが、
ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行することを特徴とする分析支援方法。
(付記2)前記重み付けを行う処理は、
前記構成要素集合の構成要素間の依存関係の連鎖の大本となる構成要素と前記構成要素集合の各構成要素との関係度合いを示すランク値に基づいて、当該ランク値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記1に記載の分析支援方法。
(付記3)前記コンピュータが、
前記各構成要素について、前記連鎖の大本となる構成要素との関係度合いを示すランク値の高さに応じて係数値が高くなる第1の係数を設定する、処理を実行し、
前記重み付けを行う処理は、
設定した前記各構成要素の第1の係数に基づいて、当該第1の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記2に記載の分析支援方法。
(付記4)前記重み付けを行う処理は、
前記構成要素集合の構成要素が前記構成要素集合とは異なる他の構成要素集合の構成要素から呼び出される数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が低くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする付記1〜3のいずれか一つに記載の分析支援方法。
(付記5)前記コンピュータが、
前記構成要素集合の各構成要素について、前記各構成要素が前記他の構成要素集合の構成要素から呼び出される数の大きさに応じて係数値が低くなる第2の係数を算出する、処理を実行し、
前記重み付けを行う処理は、
算出した前記各構成要素の第2の係数に基づいて、当該第2の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記4に記載の分析支援方法。
(付記6)前記第2の係数を算出する処理は、
前記各構成要素について、前記構成要素集合の構成要素間の依存関係の連鎖の大本となる構成要素を除く構成要素が前記他の構成要素集合の構成要素から呼び出される数の大きさに応じて係数値が低くなる第2の係数を算出する、ことを特徴とする付記5に記載の分析支援方法。
(付記7)前記重み付けを行う処理は、
前記構成要素集合の構成要素をスーパークラスとする前記構成要素集合の他の構成要素との継承関係の数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする付記1〜6のいずれか一つに記載の分析支援方法。
(付記8)前記コンピュータが、
前記構成要素集合の各構成要素について、前記各構成要素をスーパークラスとする前記構成要素集合の他の構成要素との継承関係の数の大きさに応じて係数値が高くなる第3の係数を算出する、処理を実行し、
前記重み付けを行う処理は、
算出した前記各構成要素の第3の係数に基づいて、当該第3の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記7に記載の分析支援方法。
(付記9)前記コンピュータが、
重み付けした前記単語の出現頻度に基づいて、前記構成要素集合の各構成要素に対応する単語のうち、当該出現頻度が高い上位複数個の単語、あるいは、当該出現頻度が所定値以上の単語を示す特徴語情報を生成し、
前記出力する処理は、
生成した前記特徴語情報を前記構成要素集合と対応付けて出力する、ことを特徴とする付記1〜8のいずれか一つに記載の分析支援方法。
(付記10)前記構成要素集合における単語は、前記構成要素集合の構成要素の識別子から抽出される単語である、ことを特徴とする付記1〜9のいずれか一つに記載の分析支援方法。
(付記11)前記コンピュータが、
記憶部に記憶された前記ソフトウェアのソースコードを解析して、前記ソフトウェアの複数の構成要素の構成要素間の依存関係を抽出する、処理を実行し、
前記重み付けを行う処理は、
抽出した前記構成要素間の依存関係に基づいて、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記1〜10のいずれか一つに記載の分析支援方法。
(付記12)前記重み付けを行う処理は、
前記ソフトウェアの複数の構成要素の構成要素間の依存関係を示す依存関係情報を記憶する記憶部を参照して、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記1〜11のいずれか一つに記載の分析支援方法。
(付記13)ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
制御部を有することを特徴とする分析支援装置。
(付記14)コンピュータに、
ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行させることを特徴とする分析支援プログラム。