(57)【特許請求の範囲】
【請求項１】
コンピュータが、
ソフトウェアの複数の構成要素の構成要素間の依存関係をもとに当該複数の構成要素を分割して得られる構成要素集合について、前記構成要素間の依存関係に基づいて、当該構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行することを特徴とする分析支援方法。
【請求項２】
前記重み付けを行う処理は、
前記構成要素集合の構成要素間の依存関係の連鎖の大本となる構成要素と前記構成要素集合の各構成要素との関係度合いを示すランク値に基づいて、当該ランク値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする請求項１に記載の分析支援方法。
【請求項３】
前記重み付けを行う処理は、
前記構成要素集合の構成要素が前記構成要素集合とは異なる他の構成要素集合の構成要素から呼び出される数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が低くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする請求項１または２に記載の分析支援方法。
【請求項４】
前記重み付けを行う処理は、
前記構成要素集合の構成要素をスーパークラスとする前記構成要素集合の他の構成要素との継承関係の数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする請求項１〜３のいずれか一つに記載の分析支援方法。
【請求項５】
前記コンピュータが、
重み付けした前記単語の出現頻度に基づいて、前記構成要素集合の各構成要素に対応する単語のうち、当該出現頻度が高い上位複数個の単語、あるいは、当該出現頻度が所定値以上の単語を示す特徴語情報を生成し、
前記出力する処理は、
生成した前記特徴語情報を前記構成要素集合と対応付けて出力する、ことを特徴とする請求項１〜４のいずれか一つに記載の分析支援方法。
【請求項６】
前記構成要素集合における単語は、前記構成要素集合の構成要素の識別子から抽出される単語である、ことを特徴とする請求項１〜５のいずれか一つに記載の分析支援方法。
【請求項７】
ソフトウェアの複数の構成要素の構成要素間の依存関係をもとに当該複数の構成要素を分割して得られる構成要素集合について、前記構成要素間の依存関係に基づいて、当該構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
制御部を有することを特徴とする分析支援装置。
【請求項８】
コンピュータに、
ソフトウェアの複数の構成要素の構成要素間の依存関係をもとに当該複数の構成要素を分割して得られる構成要素集合について、前記構成要素間の依存関係に基づいて、当該構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行させることを特徴とする分析支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分析支援方法、分析支援装置、および分析支援プログラムに関する。
【背景技術】
【０００２】
ソフトウェアを開発・改良・保守するためには、そのソフトウェアの理解が重要となる。しかし、ソフトウェアは大規模になればなるほど、その構造は複雑なものとなり、その把握は容易ではない。このため、ソフトウェアを理解が容易な程度に小規模な部分集合に分割することが行われる場合がある。
【０００３】
先行技術としては、プログラムで使用される変数の意味を説明する変数説明情報を作成するためのものがある。例えば、ソースプログラム中の変数のとるべき値が影響を受ける単語列から切り出した単語単位の字句が、変数の意味をどの程度表しているかを示すスコアを計算し、計算した字句のスコアに基づき複数の字句から選んだ字句を日本語に変換する意味抽出装置がある。
【０００４】
また、データ分類の信頼性あるいは視認性を向上させるための技術がある。例えば、階層的に分類された各クラスタについて、クラスタを代表する語句と代表性を表すスコアを求めて妥当性を判定し、妥当でないと判定したクラスタに対して、そのクラスタの下位階層に属す複数のクラスタへとデータの再分類を行うデータ分類装置がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１４−０１６６８６号公報
【特許文献２】特開２００８−１６５５７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来技術では、ソフトウェアを分割して得られる部分集合（いわゆる、クラスタ）が、どのような性質のものであるかを把握するのに手間がかかり、ソフトウェアの構造を理解することが困難なものとなる場合がある。
【０００７】
一つの側面では、本発明は、ソフトウェアの分析を支援する分析支援方法、分析支援装置、および分析支援プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一態様によれば、ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する分析支援方法、分析支援装置、および分析支援プログラムが提案される。
【発明の効果】
【０００９】
本発明の一側面によれば、ソフトウェアの分析を支援することができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施の形態にかかる分析支援システム１００のシステム構成例を示す説明図である。
【図２】図２は、クラスタのグラフ構造の一例を示す説明図（その１）である。
【図３】図３は、分析支援装置１０１のハードウェア構成例を示すブロック図である。
【図４】図４は、クライアント装置１０２のハードウェア構成例を示すブロック図である。
【図５】図５は、分析支援装置１０１の機能的構成例を示すブロック図である。
【図６】図６は、クラスタ情報の具体例を示す説明図である。
【図７】図７は、プログラム間の依存関係を示す説明図（その１）である。
【図８】図８は、プログラム間の依存関係を示す説明図（その２）である。
【図９】図９は、遍在係数を求める関数のグラフを示す説明図である。
【図１０】図１０は、プログラム間の依存関係を示す説明図（その３）である。
【図１１】図１１は、サブクラス係数を求める関数のグラフを示す説明図である。
【図１２】図１２は、ランク値格納テーブルの記憶内容の一例を示す説明図である。
【図１３】図１３は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その１）である。
【図１４】図１４は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その１）である。
【図１５】図１５は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その１）である。
【図１６】図１６は、クラスタ特徴語情報の具体例を示す説明図である。
【図１７】図１７は、ソフトウェアＳＷの構造を地図上に可視化して示す説明図である。
【図１８】図１８は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その２）である。
【図１９】図１９は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その２）である。
【図２０】図２０は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その２）である。
【図２１】図２１は、クラスタのグラフ構造の一例を示す説明図（その２）である。
【図２２】図２２は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その３）である。
【図２３】図２３は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その３）である。
【図２４】図２４は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その３）である。
【図２５】図２５は、分析支援装置１０１の分析支援処理手順の一例を示すフローチャートである。
【図２６】図２６は、重み付け係数算出処理の具体的な処理手順の一例を示すフローチャートである。
【図２７】図２７は、呼出元係数算出処理の具体的な処理手順の一例を示すフローチャートである。
【図２８】図２８は、遍在係数算出処理の具体的な処理手順の一例を示すフローチャートである。
【図２９】図２９は、サブクラス係数算出処理の具体的な処理手順の一例を示すフローチャートである。
【図３０】図３０は、特徴スコア算出処理の具体的な処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下に図面を参照して、本発明にかかる分析支援方法、分析支援装置、および分析支援プログラムの実施の形態を詳細に説明する。
【００１２】
（実施の形態）
図１は、実施の形態にかかる分析支援システム１００のシステム構成例を示す説明図である。図１において、分析支援システム１００は、分析支援装置１０１と、クライアント装置１０２と、を含む。分析支援システム１００において、分析支援装置１０１およびクライアント装置１０２は、有線または無線のネットワーク１１０を介して接続される。ネットワーク１１０は、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどである。
【００１３】
ここで、分析支援装置１０１は、ソースコードＤＢ（ＤａｔａＢａｓｅ）１２０を有し、ソフトウェアＳＷの分析を支援するコンピュータである。分析支援装置１０１は、例えば、サーバである。ソースコードＤＢ１２０は、ソフトウェアＳＷのソースコードを記憶する。
【００１４】
ソフトウェアＳＷは、分析対象となるコンピュータプログラムであり、コンピュータを動作させる命令、手順などを記述したものである。ソフトウェアＳＷは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。
【００１５】
クライアント装置１０２は、分析支援システム１００のユーザが使用するコンピュータである。例えば、クライアント装置１０２は、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）、タブレットＰＣなどである。分析支援システム１００のユーザは、例えば、ソフトウェアＳＷの作成者や分析者である。
【００１６】
ここで、ソフトウェアＳＷを開発・改良・保守するためにはソフトウェアＳＷの理解が重要となる一方で、ソフトウェアＳＷが大規模になればなるほど、ソフトウェアＳＷの構造は複雑なものとなる。このため、ソフトウェアＳＷの構造の把握を容易にすべく、ソフトウェアＳＷを小規模な部分集合（いわゆる、クラスタ）に分割する技術がある。
【００１７】
ソフトウェアＳＷを分割する技術としては、例えば、ソフトウェアＳＷに含まれるソースファイル同士の依存関係に基づくクラスタリングを行って、互いに関係し合っているソースファイルのかたまりをクラスタとして分割するものがある。なお、クラスタリングの手法としては、既存の任意の手法を用いることができる。
【００１８】
ソフトウェアＳＷから分割されたクラスタを人が見て分析しようとした場合、大規模なソースファイル群から機械的に分割された各クラスタが、どのような機能や業務を実現しているものかを判断することになる。例えば、受注業務を実現しているクラスタであるのか、見積業務を実現しているクラスタであるのかといったことである。
【００１９】
クラスタはソースファイルの集まりであるため、どのような性質のクラスタであるかは、クラスタに属する個々のソースファイルを見て推測することができる。例えば、クラスタに受注業務についての処理をしているソースファイルが多く含まれていれば、受注業務を実現するクラスタであると推測できる。
【００２０】
しかし、各クラスタに属する一つ一つのソースファイルを人手により調べて、各クラスタの機能を推測するのは大変な手間がかかる。したがって、クラスタに属するソースファイルから情報を得て、どのような性質のクラスタであるかを人が容易に理解するための手掛かりを自動的に生成して提供することは有用である。
【００２１】
既存技術としては、クラスタに属する各ソースファイルの識別子（例えば、クラス名、ファイル名、ディレクトリ名、パッケージ名、関数名など）から単語を抽出して、各クラスタに特徴的な語（特徴語）を求める方法がある。
【００２２】
例えば、Ｊａｖａ（登録商標）言語で作成されたソフトウェアＳＷの場合、完全修飾クラス名が「ｃｏｍ．ａｂｃ．ｇｕｉ．ＥｄｉｔｏｒＦｒａｍｅ」であれば、「ｃｏｍ，ａｂｃ，ｇｕｉ，ｅｄｉｔｏｒ，ｆｒａｍｅ」といった具合に単語に切り分ける。各クラスについて単語を切り分けた後に、各クラスタに特徴的な語がどれであるかを計算する。
【００２３】
特徴語の計算方法としては、例えば、ｔｆ−ｉｄｆ（ｔｅｒｍ  ｆｒｅｑｕｅｎｃｙ−ｉｎｖｅｒｓｅ  ｄｏｃｕｍｅｎｔ  ｆｒｅｑｕｅｎｃｙ）法を利用することができる。ｔｆ−ｉｄｆ法をソフトウェアクラスタに適用する場合、各クラスタの単位をｔｆ−ｉｄｆ計算のための一つの「文書」とみなし、クラスタに含まれる各ソースファイルから得た語の集まりを、その文書を構成する単語群とみなす。
【００２４】
これにより、ソフトウェア全体のクラスタの集まりをｔｆ−ｉｄｆ計算のためのコーパス全体とみなせる。そして、「文書」と「単語」との対応関係に基づいて、各クラスタの各単語についてスコアとしてｔｆ−ｉｄｆ値を求めることにより、例えば、スコアの大きな語のいくつかを、そのクラスタを説明するラベルとして用いることができる。
【００２５】
ところが、ｔｆ−ｉｄｆ法をそのままソフトウェアクラスタに適用した場合、本来出てきて欲しい単語が特徴語として出てこないことがある。例えば、一つのクラスタには、そのクラスタの主要な目的を担うソースファイルと、そこから使用されている手段としてのソースファイルをともに含むことがよくある。
【００２６】
クラスタの主要な目的としては、例えば、請求処理、支払証明書作成、商品マスタ管理といったソフトウェアＳＷのひとつの機能や業務が挙げられる。一方、手段としては、例えば、テキスト編集サブルーチン、検索機能、ファイル入出力ユーティリティといったものが挙げられる。
【００２７】
ｔｆ−ｉｄｆ法をそのままソフトウェアクラスタに適用すると、これら目的と手段の両方のソースファイルを同格のものとして扱い、単語の出現頻度によって特徴語を求めることになる。このため、手段に属するソースファイルが多いと、手段に関連する単語の出現頻度が高くなり、クラスタの主要な目的を表す単語がその中に埋没してしまうという問題がある。
【００２８】
ここで、図２の例題を用いて、ｔｆ−ｉｄｆ法をそのままソフトウェアクラスタに適用した場合に生じる問題点について説明する。
【００２９】
図２は、クラスタのグラフ構造の一例を示す説明図（その１）である。図２において、グラフ２００は、ソフトウェアＳＷに対してクラスタリングを行った結果として得られたあるクラスタを、当該クラスタに属するプログラム間の呼び出し関係を有向辺とする有向グラフ構造により表現したものである。
【００３０】
図２の例では、グラフ２００の上の方に呼び出し元、下の方に呼び出し先のプログラム（ソースファイル）がくるように配置されている。具体的には、グラフ２００の上の方には、「支払証明書（月別）」、「支払証明書（日別）」という２つのプログラムｐ１，ｐ２がある。プログラムｐ１，ｐ２は、同じクラスタ内の他のプログラムｐ３〜ｐ９からは参照されない、最も呼び出し元側に位置するものである。
【００３１】
グラフ２００によれば、プログラムｐ１，ｐ２は、「利用金額計算」、「明細編集」、「金額編集」といった他のプログラムｐ３〜ｐ５を呼び出して業務を実現していることがわかる。また、プログラムｐ３〜ｐ５は、「利用状況検索」、「編集サブルーチン」、「金額計算」といった他のプログラムｐ６〜ｐ８を呼び出していることがわかる。
【００３２】
図２の例は、支払証明書の処理についてのクラスタである。このため、クラスタを特徴付ける特徴語として、「支払証明書」を表す単語が出てくることが望ましい。ところが、処理の途中の手段であるプログラムに現れる「金額」や「利用」といった単語の出現頻度が高いために、「支払証明書」を表す単語が、これらの単語に埋もれてしまう。
【００３３】
具体的には、例題のクラスタ内の各単語の出現回数は、「支払＝２」、「証明書＝２」、「利用＝２」、「状況＝１」、「金額＝３」、「明細＝１」、「検索＝２」、「計算＝２」、「ユーティリティ＝１」、「編集＝１」、「サブルーチン＝１」となる。ｔｆ−ｉｄｆ法では、単語のある文書内での出現回数（ｔｆ）に、その単語がコーパス全体の中でどれだけ多くの文書に出現するかによって決まるｉｄｆを乗じてスコアを計算する。ただし、ここでは簡単のため、各単語の出現回数（ｔｆ）をそのまま、各単語がクラスタの特徴をどの程度表すかのスコアとして用いる場合を例に挙げて説明する。
【００３４】
この場合、「金額」という一般的な単語が最も高いスコア「３」となる。また、「検索、状況」などの一般的な単語と、クラスタの処理の目的を表す「支払、証明書」とが同じスコア「２」となる。したがって、スコアの高いほうからいくつか単語を選んでクラスタの特徴語とすると、本来出てきて欲しい「支払、証明書」といった語が、「金額、検索、状況」などの他の単語に埋もれてしまう。
【００３５】
なお、この計算例で省略したｉｄｆの計算を適用する場合、「金額」「検索」などの語がソフトウェア全体に満遍なく出現するのであればｉｄｆによってフィルタされてスコアが低められる。しかしながら、これらの単語の出現に局所性がある、つまり一部のクラスタにしか現れない場合は、このような効果を期待することはできない。
【００３６】
また、図２に示した例では、各プログラムが日本語の名前を持つものとして説明したが、Ｊａｖａ言語やＣ言語等で一般的な英単語に基づいた識別子を用いる場合でも同じ議論が成り立つ。
【００３７】
そこで、本実施の形態では、クラスタの主要な目的を表す単語が、手段としてのプログラムに関係した単語に埋もれてしまうことを防いで、どのような性質のクラスタであるかを人が理解しやすい説明語句を生成可能にする分析支援方法について説明する。
【００３８】
なお、本実施の形態では、分析支援装置１０１とクライアント装置１０２とを別々に設けることにしたが、これに限らない。例えば、分析支援装置１０１は、クライアント装置１０２により実現されることにしてもよい。
【００３９】
（分析支援装置１０１のハードウェア構成例）
つぎに、分析支援装置１０１のハードウェア構成例について説明する。
【００４０】
図３は、分析支援装置１０１のハードウェア構成例を示すブロック図である。図３において、分析支援装置１０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、メモリ３０２と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３０３と、ディスクドライブ３０４と、ディスク３０５と、を有する。また、各構成部は、バス３００によってそれぞれ接続される。
【００４１】
ここで、ＣＰＵ３０１は、分析支援装置１０１の全体の制御を司る。メモリ３０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ３０１のワークエリアとして使用される。メモリ３０２に記憶されるプログラムは、ＣＰＵ３０１にロードされることで、コーディングされている処理をＣＰＵ３０１に実行させる。
【００４２】
Ｉ／Ｆ３０３は、通信回線を通じてネットワーク１１０に接続され、ネットワーク１１０を介して外部のコンピュータ（例えば、図１に示したクライアント装置１０２）に接続される。そして、Ｉ／Ｆ３０３は、ネットワーク１１０と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。Ｉ／Ｆ３０３には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００４３】
ディスクドライブ３０４は、ＣＰＵ３０１の制御に従ってディスク３０５に対するデータのリード／ライトを制御する。ディスク３０５は、ディスクドライブ３０４の制御で書き込まれたデータを記憶する。ディスク３０５としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００４４】
なお、分析支援装置１０１は、上述した構成部のほかに、例えば、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、キーボード、マウス、ディスプレイ等を有することにしてもよい。
【００４５】
（クライアント装置１０２のハードウェア構成例）
つぎに、クライアント装置１０２のハードウェア構成例について説明する。
【００４６】
図４は、クライアント装置１０２のハードウェア構成例を示すブロック図である。図４において、クライアント装置１０２は、ＣＰＵ４０１と、メモリ４０２と、ディスクドライブ４０３と、ディスク４０４と、Ｉ／Ｆ４０５と、ディスプレイ４０６と、入力装置４０７と、を有する。また、各構成部はバス４００によってそれぞれ接続される。
【００４７】
ここで、ＣＰＵ４０１は、クライアント装置１０２の全体の制御を司る。メモリ４０２は、例えば、ＲＯＭ、ＲＡＭおよびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ４０１のワークエリアとして使用される。メモリ４０２に記憶されるプログラムは、ＣＰＵ４０１にロードされることで、コーディングされている処理をＣＰＵ４０１に実行させる。
【００４８】
ディスクドライブ４０３は、ＣＰＵ４０１の制御に従ってディスク４０４に対するデータのリード／ライトを制御する。ディスク４０４は、ディスクドライブ４０３の制御で書き込まれたデータを記憶する。ディスク４０４としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００４９】
Ｉ／Ｆ４０５は、通信回線を通じてネットワーク１１０に接続され、ネットワーク１１０を介して外部のコンピュータ（例えば、図１に示した分析支援装置１０１）に接続される。そして、Ｉ／Ｆ４０５は、ネットワーク１１０と装置内部のインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。
【００５０】
ディスプレイ４０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ４０６は、例えば、液晶ディスプレイ、有機ＥＬ（Ｅｌｅｃｔｒｏｌｕｍｉｎｅｓｃｅｎｃｅ）ディスプレイ、ＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）などを採用することができる。
【００５１】
入力装置４０７は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置４０７は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００５２】
なお、クライアント装置１０２は、上述した構成部のうち、例えば、ディスクドライブ４０３、ディスク４０４などを有さないことにしてもよい。
【００５３】
（分析支援装置１０１の機能的構成例）
つぎに、分析支援装置１０１の機能的構成例について説明する。
【００５４】
図５は、分析支援装置１０１の機能的構成例を示すブロック図である。図５において、分析支援装置１０１は、取得部５０１と、分割部５０２と、係数算出部５０３と、抽出部５０４と、重み付け部５０５と、出力部５０６と、を含む構成である。取得部５０１〜出力部５０６は制御部となる機能であり、具体的には、例えば、図３に示したメモリ３０２、ディスク３０５などの記憶装置に記憶されたプログラムをＣＰＵ３０１に実行させることにより、または、Ｉ／Ｆ３０３により、その機能を実現する。各機能部の処理結果は、例えば、メモリ３０２、ディスク３０５などの記憶装置に記憶される。
【００５５】
取得部５０１は、分析対象となるソフトウェアＳＷを取得する機能を有する。上述したように、ソフトウェアＳＷは、複数の構成要素を含む。構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。
【００５６】
具体的には、例えば、取得部５０１は、不図示の入力装置を用いたユーザの操作入力により、ソフトウェアＳＷのソースコードを取得することにしてもよい。また、取得部５０１は、例えば、ネットワーク１１０（図１参照）を介して、外部のコンピュータ（例えば、図１に示したクライアント装置１０２）からソフトウェアＳＷのソースコードを取得することにしてもよい。取得されたソフトウェアＳＷは、例えば、図１に示したソースコードＤＢ１２０に記憶される。
【００５７】
分割部５０２は、ソフトウェアＳＷをクラスタリングする。ここで、クラスタリングとは、例えば、ソフトウェアＳＷをグラフで表現し、当該グラフをクラスタに分割することである。クラスタは、ソフトウェアＳＷのグラフを部分グラフに分割したときの、部分グラフまたは部分グラフに属する構成要素の集合（構成要素集合）のことである。
【００５８】
具体的には、例えば、分割部５０２は、既存の構文解析技術および静的解析技術により、ソースコードＤＢ１２０（図１参照）に記憶されたソフトウェアＳＷのソースコードを解析し、ソフトウェアＳＷに含まれる構成要素間の依存関係を抽出する。構成要素間の依存関係は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などの呼び出し関係、継承関係、包含関係やデータアクセス関係などの関係である。
【００５９】
なお、ソースコードＤＢ１２０には、例えば、ソフトウェアＳＷの複数の構成要素の構成要素間の依存関係を示す依存関係情報が記憶されていてもよい。この場合、分割部５０２は、ソースコードＤＢ１２０に記憶された依存関係情報を参照して、ソフトウェアＳＷに含まれる構成要素間の依存関係を抽出することができる。
【００６０】
そして、分割部５０２は、抽出した構成要素間の依存関係に基づいて、ソフトウェアＳＷに含まれる複数のプログラムを複数のクラスタに分割することにより、クラスタ情報を分割結果として出力する。なお、ソフトウェアＳＷを複数のクラスタに分割する具体的な処理内容については、例えば、特開２０１３−１４８９８７号公報を参照することができる。
【００６１】
以下の説明では、ソフトウェアＳＷの構成要素として、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラムを例に挙げて説明する。また、ソフトウェアＳＷに含まれる複数のプログラムを分割して得られる複数のクラスタを「クラスタＣ１〜Ｃｎ」と表記する場合がある（ｎ：２以上の自然数）。また、クラスタＣ１〜Ｃｎのうちの任意のクラスタを「クラスタＣｉ」と表記する場合がある（ｉ＝１，２，…，ｎ）。
【００６２】
ここで、分割結果として出力されるクラスタ情報の具体例について説明する。
【００６３】
図６は、クラスタ情報の具体例を示す説明図である。図６において、クラスタ情報６００は、クラスタＩＤとプログラム名とを対応付けて示す情報である。クラスタＩＤは、クラスタＣｉを一意に識別する識別子である。プログラム名は、クラスタＣｉに属するプログラムの名称である。
【００６４】
クラスタ情報６００によれば、ソフトウェアＳＷに含まれる複数のプログラムを分割して得られた各クラスタＣｉに属するプログラムを特定することができる。なお、図２の例題は、クラスタ情報６００が示すクラスタＣ１に対応する。
【００６５】
図５の説明に戻り、係数算出部５０３は、クラスタＣｉ内の各プログラムのランク値に基づいて、クラスタＣｉ内の各プログラムに対応する第１の係数をそれぞれ算出する。ここで、ランク値とは、クラスタＣｉ内のプログラム間の依存関係の連鎖の大本となるプログラムと、クラスタＣｉ内の各プログラムとの関係度合いを示す値である。
【００６６】
換言すれば、ランク値は、クラスタＣｉにおいて、あるプログラムが、プログラム間の依存関係の連鎖の大本となるプログラムにどれだけ近いかを示す値である。したがって、ランク値は、プログラム間の依存関係の連鎖の大本となるプログラムに近いほど大きな値となる。
【００６７】
第１の係数（以下、「呼出元係数」と称する）は、クラスタＣｉ内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタＣｉにおける当該単語の出現頻度に重みを付ける係数である。呼出元係数は、ランク値が高いプログラムほど、係数値が高くなるように算出される。
【００６８】
ここで、図７を用いて、呼出元係数について説明する。
【００６９】
図７は、プログラム間の依存関係を示す説明図（その１）である。図７において、グラフ７００は、クラスタＣｉ内のプログラム間の呼び出し関係の一例を示している。グラフ７００では、呼び出し元から呼び出し先へと、上から下へ並ぶようにプログラム７０１〜７０７が配置されている。
【００７０】
ここで、クラスタＣｉ内で最も呼び出し元側に位置するプログラム、および、当該プログラムに近いプログラムは、クラスタＣｉの目的を表すプログラムであるといえる。そこで、係数算出部５０３は、クラスタＣｉ内の呼び出し元に近いほうに位置するプログラムほど、クラスタＣｉの目的を表しているとみなし、例えば、当該プログラムに１より大きな値の呼出元係数を設定する。
【００７１】
具体的には、例えば、係数算出部５０３は、グラフ７００において最も呼び出し元側に位置するプログラム７０１，７０２に、呼出元係数「２．０」を設定することにしてもよい。また、係数算出部５０３は、それ以外のプログラム７０３〜７０７に、呼出元係数「１．０」を設定することにしてもよい。すなわち、プログラム７０３〜７０７については、呼出元係数を乗じても単語の出現頻度に影響を与えないものとしてもよい。
【００７２】
また、係数算出部５０３は、最も呼び出し元側に位置するプログラムでなく、最も呼び出し元側から２番目や３番目に位置するプログラムに対しても、１より大きな値の呼出元係数を設定することにしてもよい。この場合、呼出元係数は、例えば、最も呼び出し元側が最も高い値で、２番目がその次、３番目がその次に高い値となるように設定される。
【００７３】
より詳細に説明すると、まず、係数算出部５０３は、例えば、クラスタＣｉ内のプログラム間の依存関係に基づいて、各プログラムにランク値を設定する。具体的には、例えば、係数算出部５０３は、クラスタＣｉ内の最も呼び出し元側に近いプログラム（プログラム間の依存関係の連鎖の大本となるプログラム）から、最も呼び出し先側に近いプログラムに向かって順に値が低くなるようにランク値を設定する。
【００７４】
なお、係数算出部５０３は、必要に応じて、プログラム間の相互参照のサイクルを事前に削除する。例えば、係数算出部５０３は、既存技術のＧｒｅｅｄｙ  Ｃｙｃｌｅ  Ｒｅｍｏｖａｌ法を用いて、プログラム間の相互参照のサイクルを削除することができる。
【００７５】
つぎに、係数算出部５０３は、設定した各プログラムのランク値に応じて、各プログラムに呼出元係数を設定する。例えば、係数算出部５０３は、ランク値が高いほど、呼出元係数の係数値が高くなるように、各プログラムに呼出元係数を設定する。
【００７６】
より具体的には、例えば、係数算出部５０３は、プログラムのランク値が「クラスタＣｉ内の各プログラムのランク値の最大値−ｋ」以上であれば、当該プログラムに呼出元係数「２．０」を設定することにしてもよい。また、係数算出部５０３は、プログラムのランク値が「クラスタＣｉ内の各プログラムのランク値の最大値−ｋ」未満であれば、当該プログラムに呼出元係数「１．０」を設定することにしてもよい。
【００７７】
ｋは、任意に設定可能な０以上の整数値である。例えば、「ｋ＝０」の場合、最もランク値の高いプログラムにのみ呼出元係数「２．０」が設定されることになる。
【００７８】
また、係数算出部５０３は、クラスタＣｉ内の各プログラムが他のクラスタＣｊ（ｊ≠ｉ、ｊ＝１，２，…，ｎ）内のプログラムから呼び出される数に基づいて、クラスタＣｉ内の各プログラムに対応する第２の係数をそれぞれ算出する。クラスタＣｉ内の各プログラムが他のクラスタＣｊ内のプログラムから呼び出される数は、ソフトウェアＳＷに含まれるプログラム間の依存関係から特定される。
【００７９】
第２の係数（以下、「遍在係数」と称する）は、クラスタＣｉ内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタＣｉにおける当該単語の出現頻度に重みを付ける係数である。遍在係数は、他のクラスタＣｊ内のプログラムから呼び出される数が多いプログラムほど、係数値が低くなるように算出される。
【００８０】
ここで、図８を用いて、遍在係数について説明する。
【００８１】
図８は、プログラム間の依存関係を示す説明図（その２）である。図８において、グラフ８１０は、クラスタＣｉ内のプログラム（プログラム８１１〜８１９）間の呼び出し関係の一例を示している。また、グラフ８２０は、他のクラスタＣｊ内のプログラム（８２１〜８２３）間の呼び出し関係の一例を示している。
【００８２】
ここで、呼び出し関係（依存関係）によるクラスタリングは、呼び出し関係の密なプログラムの集まりをクラスタとして発見するものである。ところが、プログラムの中には、所属するクラスタＣｉ以外の他のクラスタＣｊに属するプログラムと呼び出し関係を有するものが多かれ少なかれ存在する。
【００８３】
図８の例では、クラスタＣｉ（グラフ８１０）内のプログラム８１５は、他のクラスタＣｊ（グラフ８２０）内のプログラム８２２，８２３からも呼び出されるプログラムである。所属するクラスタＣｉ以外の他のクラスタＣｊに属するプログラムからも呼び出されているプログラムは、他のクラスタＣｉの機能や業務を実現するためにも呼び出されるプログラムである。
【００８４】
したがって、所属するクラスタＣｉ以外の他のクラスタＣｊに属するプログラムからも多数呼び出されているプログラムは、所属するクラスタＣｉの目的や特徴を表すものではなく、汎用のユーティリティ機能を提供するプログラムである可能性が高い。この推定は、他のクラスタＣｊがクラスタＣｉとは異なる機能や業務を実装しているプログラムの集合であることが想定されるため成り立つ。
【００８５】
そこで、係数算出部５０３は、他のクラスタＣｊに属するプログラムから呼び出されているプログラムに対しては、その呼び出し数の多さに応じて低い値（０．０以上かつ１．０未満）の遍在係数を設定する。図８の例では、係数算出部５０３は、例えば、プログラム８２２，８２３に対しては、他のクラスタＣｊのプログラムからの呼び出し数（例えば、プログラム８２２，８２３の２つ）の多さに応じて低い値の遍在係数を設定する。
【００８６】
ただし、クラスタＣｉ内の最も呼び出し元側のプログラムは、クラスタＣｉの機能を起動するために、他のクラスタＣｊのプログラムから呼び出されることがある。このため、係数算出部５０３は、最も呼び出し元側に位置するプログラムについては、他のクラスタＣｊに属するプログラムからの呼び出し数の多さにかかわらず低い値の遍在係数を設定しない。
【００８７】
より詳細に説明すると、係数算出部５０３は、下記式（１）および（２）を用いて、クラスタＣｉ内の各プログラムに対応する遍在係数をそれぞれ算出することにしてもよい。ただし、ｆ（ｃout）は、遍在係数である。ｃoutは、クラスタＣｉ内のプログラムが他のクラスタＣｊに属するプログラムから呼び出される数である。ｌは、遍在係数の下限値（ｌ＞０）であり、任意に設定可能である。ｔは、閾値であり、任意に設定可能である。
【００８８】
ｆ（ｃout）＝ｌ    （ｃout≧ｔのとき）  …（１）
【００８９】
ｆ（ｃout）＝（ｌ−１）／ｔ×ｃout＋１    （ｃout＜ｔのとき）  …（２）
【００９０】
なお、クラスタＣｉ内のプログラム間の依存関係の連鎖の大本となるプログラム、すなわち、クラスタＣｉ内で最も呼び出し元側に位置するプログラムについての呼び出し数ｃoutは、「ｃout＝０」とする。したがって、クラスタＣｉ内で最も呼び出し元側に位置するプログラムの遍在係数は、上記式（２）を用いて算出される。
【００９１】
図９は、遍在係数を求める関数のグラフを示す説明図である。図９において、グラフ９００は、上記式（１）および（２）の関係をグラフ化したものである。閾値ｔは、例えば、１０程度の値に設定される。また、下限値ｌは、例えば、０．１程度の値に設定される。仮に下限値ｌを「ｌ＝１」とすると、呼び出し数ｃoutが閾値ｔ以上のプログラムは全く影響しないことになる。
【００９２】
なお、ここでは、遍在係数を求める関数として、他のクラスタＣｊのプログラムからの呼び出し数ｃoutに応じて直線的に減少する関数を用いることにしたが、これに限らない。例えば、遍在係数を求める関数として、反比例などの単調減少する他の関数を用いることにしてもよい。
【００９３】
また、係数算出部５０３は、クラスタＣｉ内のプログラムをスーパークラスとするクラスタＣｉ内の他のプログラムとの継承関係の数に基づいて、クラスタＣｉ内の各プログラムに対応する第３の係数をそれぞれ算出する。スーパークラス（親クラス）とは、オブジェクト指向プログラミングにおいて、あるクラスの仕様を継承して新しいクラス（サブクラス（子クラス））を作成する際に元となるクラスのことである。
【００９４】
第３の係数（以下、「サブクラス係数」と称する）は、クラスタＣｉ内の各プログラムにおける単語の出現頻度に当該係数を乗じることにより、クラスタＣｉにおける当該単語の出現頻度に重みを付ける係数である。サブクラス係数は、クラスタＣｉ内の他のプログラムとの継承関係の数が多いプログラムほど、係数値が高くなるように算出される。
【００９５】
ここで、図１０を用いて、サブクラス係数について説明する。
【００９６】
図１０は、プログラム間の依存関係を示す説明図（その３）である。図１０において、グラフ１０００は、クラスタＣｉ内のプログラム（プログラム１００１〜１００７）間の呼び出し関係の一例を示している。ここでは、プログラミング言語として、Ｊａｖａ言語やＣ＋＋言語のようなオブジェクト指向言語が用いられている場合を想定する。
【００９７】
プログラム１００７（受講コース）は、プログラム１００３（年会費コース）、プログラム１００４（月会費コース）、プログラム１００５（毎回払いコース）およびプログラム１００６（体験コース）の４つのクラスのスーパークラスである。また、プログラム１００７と各プログラム１００３〜１００６との間の矢印は、継承関係を意味している。
【００９８】
すなわち、これら４つのサブクラス（プログラム１００３〜１００６）は、スーパークラス（プログラム１００７）を継承したうえで、それぞれのコースに応じた固有な実装を追加して定義されたクラスである。この場合、プログラム１００７は、クラスタＣｉ内の４つのサブクラス（プログラム１００３〜１００６）に共通の性質を表すクラスである。
【００９９】
したがって、プログラム１００７は、クラスタＣｉの性質を理解するうえで重要であるといえる。そこで、係数算出部５０３は、クラスタＣｉ内のスーパークラスとなるプログラムに対しては、クラスタＣｉ内の他のプログラムとの継承関係の数の多さに応じて高い値のサブクラス係数を設定する。なお、継承ではなく委譲とみなせる場合にも同様に扱うことにしてもよい。
【０１００】
より詳細に説明すると、まず、係数算出部５０３は、クラスタＣｉ内の個々のプログラム間の依存関係について、継承であるか否かを判断する。プログラム間の依存関係が継承関係であるかの判断には、例えば、ソースコード解析等の手段によって明示された継承関係が得られる場合には、その情報を用いることにしてもよい。
【０１０１】
一方、継承関係とメソッド呼び出しやフィールド参照との区別が失われており、単なる依存関係としてしか得られない場合には、例えば、多数のクラスから参照されており、名前に共通性がある場合には継承関係とみなすことができる。名前の共通性とは、図１０の例では、「××コース」である。
【０１０２】
サブクラスを定義する際に、スーパークラスにつけられた一般的な名前に修飾語を加えることで意味を限定して命名することは一般的に広く行われている。例えば、Ｊａｖａ言語の標準ライブラリではＲｅａｄｅｒクラスに対して、ＢｕｆｆｅｒｅｄＲｅａｄｅｒ、ＳｔｒｉｎｇＲｅａｄｅｒ、ＩｎｐｕｔＳｔｒｅａｍＲｅａｄｅｒなどのサブクラスが定義されている。したがって、このような名前の共通性を見る方法で継承関係を推定することが可能である。
【０１０３】
つぎに、係数算出部５０３は、継承であるか否かを判断した結果に基づいて、クラスタＣｉ内の各プログラムをスーパークラスとする継承関係の数を計数する。そして、係数算出部５０３は、例えば、下記式（３）を用いて、クラスタＣｉ内の各プログラムに対応するサブクラス係数をそれぞれ算出する。ただし、ｆ（ｃsub）は、サブクラス係数である。ｃsubは、クラスタＣｉ内のプログラムをスーパークラスとする継承関係の数である。ｓは、任意に設定可能なパラメータであり、係数値が２倍になるのに必要な継承関係の数に相当する。
【０１０４】
ｆ（ｃsub）＝ｃsub／ｓ＋１      …（３）
【０１０５】
図１１は、サブクラス係数を求める関数のグラフを示す説明図である。図１１において、グラフ１１００は、上記式（３）の関係をグラフ化したものである。パラメータｓは、５程度の値に設定される。例えば、パラメータｓを「ｓ＝５」とすると、クラスタＣｉ内に自分のサブクラスが５つあるとサブクラス係数が２になる（つまり、単語の影響力が２倍になる）。
【０１０６】
なお、ここでは、サブクラス係数を求める関数として、継承関数の数に対して直線的に増加する関数を用いることにしたが、これに限らない。例えば、サブクラス係数を求める関数として、対数関数のように単調増加する他の関数を用いることにしてもよい。
【０１０７】
図５の説明に戻り、また、係数算出部５０３は、算出したクラスタＣｉ内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数の少なくともいずれかの係数を用いて、当該各プログラムに対応する重み付け係数を決定する。ここで、重み付け係数とは、クラスタＣｉにおける単語の出現頻度の重み付けを行う際に用いる係数である。
【０１０８】
具体的には、例えば、係数算出部５０３は、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のいずれかの係数を、各プログラムに対応する重み付け係数に決定してもよい。また、例えば、係数算出部５０３は、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のうちの２つ以上の係数を乗じて得られる値を、各プログラムに対応する重み付け係数に決定してもよい。
【０１０９】
決定された重み付け係数は、例えば、クラスタＣｉ内の各プログラムと対応付けて重み付け係数格納テーブル（後述する図１３、図１８、図２２参照）に記憶される。なお、各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のいずれの係数を用いて、各プログラムに対応する重み付け係数を決定するかは任意に設定可能である。
【０１１０】
抽出部５０４は、クラスタＣｉ内の各プログラムに対応する単語を抽出する。具体的には、例えば、抽出部５０４は、クラスタＣｉ内の各プログラムのプログラム名、クラス名、ファイル名、ディレクトリ名、パッケージ名、関数名などの識別子から単語を抽出する。
【０１１１】
一例として、プログラム名から単語を抽出する場合を例に挙げると、抽出部５０４は、プログラム名を形態素解析して単語に切り分けることで、各プログラムに対応する単語を抽出することができる。ただし、各プログラムは自然言語（日本語）のプログラム名を持っているものとする。英語やフランス語のように単語が空白で分けられている言語の場合は、抽出部５０４は、例えば、プログラム名から空白で区切られた各単語を取り出すことで、各プログラムに対応する単語を抽出することができる。
【０１１２】
また、Ｊａｖａ言語の完全修飾クラス名を用いる場合は、抽出部５０４は、区切りの記号や大文字小文字の切り替わる箇所を利用して単語を取り出すことで、各プログラムに対応する単語を抽出することができる。例えば、「ｊａｖａ．ｉｏ．ＦｉｌｅＩｎｐｕｔＳｔｒｅａｍ」という完全修飾クラス名を持つクラスであれば、「ｊａｖａ，ｉｏ，ｆｉｌｅ，ｉｎｐｕｔ，ｓｔｒｅａｍ」という各単語を取り出すことができる。他のプログラミング言語ではソースファイルのファイル名とディレクトリ名を同様に扱うことができる。
【０１１３】
抽出された単語は、例えば、クラスタＣｉ内の各プログラムと対応付けて抽出単語格納テーブル（後述する図１４、図１９、図２３参照）に記憶される。
【０１１４】
重み付け部５０５は、クラスタＣｉにおける単語の出現頻度に重み付けを行う。具体的には、例えば、重み付け部５０５は、抽出された単語ごとに、クラスタＣｉ内の各プログラムにおける当該単語の出現頻度に、決定された当該各プログラムに対応する重み付け係数を乗じた値を累積することにより、特徴スコアを算出する。
【０１１５】
ここで、各プログラムにおける単語の出現頻度は、各プログラムにおける単語の出現回数、すなわち、各プログラムから抽出された当該単語の個数に相当する。また、特徴スコアは、クラスタＣｉにおける重み付けされた単語の出現頻度に相当し、当該単語がクラスタＣｉの特徴をどの程度表しているのかを示す指標値である。
【０１１６】
算出された単語の特徴スコアは、例えば、クラスタＣｉと対応付けて特徴スコア格納テーブル（後述する図１５、図２０、図２４参照）に記憶される。
【０１１７】
出力部５０６は、クラスタＣｉに対応付けて、クラスタＣｉにおける重み付けされた単語の出現頻度を出力する。出力部５０６の出力形式としては、例えば、Ｉ／Ｆ３０３による他のコンピュータ（例えば、クライアント装置１０２）への送信、メモリ３０２、ディスク３０５などの記憶装置への記憶、不図示のディスプレイへの表示、不図示のプリンタへの印刷出力などがある。
【０１１８】
具体的には、例えば、出力部５０６は、特徴スコアテーブル（後述する図１５、図２０、図２４参照）を参照して、クラスタＣｉに対応付けて、各単語の特徴スコアを示すクラスタ特徴語情報を出力することにしてもよい。この際、出力部５０６は、例えば、特徴スコアが相対的に高い上位複数個（例えば、３個）の単語についての特徴スコアを示すクラスタ特徴語情報を生成して出力することにしてもよい。
【０１１９】
また、出力部５０６は、例えば、特徴スコアが所定値以上の単語についての特徴スコアを示すクラスタ特徴語情報を生成して出力することにしてもよい。所定値は、任意に設定可能である。なお、クラスタ特徴語情報の具体例については、図１６を用いて後述する。
【０１２０】
（特徴スコアの第１の算出例）
つぎに、重み付け係数を用いた特徴スコアの算出例について説明する。ここでは、まず、図１２〜図１５を用いて、上述した「呼出元係数」を重み付け係数とした場合の特徴スコアの第１の算出例について説明する。また、例題として、図２に示したようなグラフ構造を有するクラスタＣ１を用いる。
【０１２１】
この場合、まず、係数算出部５０３は、クラスタＣ１内のプログラム間の依存関係に基づいて、各プログラムｐ１〜ｐ９（図２参照）にランク値を設定する。具体的には、例えば、係数算出部５０３は、最も呼び出し元側に近いプログラムに対して値が高くなるように、また、最も呼び出し先側に近いプログラムに対して値が低くなるようにランク値を設定する。
【０１２２】
設定されたランク値は、例えば、図１２に示すようなランク値格納テーブルに記憶される。ここで、ランク値格納テーブルの記憶内容について説明する。
【０１２３】
図１２は、ランク値格納テーブルの記憶内容の一例を示す説明図である。図１２において、ランク値格納テーブル１２００は、クラスタＩＤ、プログラム名およびランク値のフィールドを有し、各フィールドに情報を設定することで、ランク値情報１２００−１〜１２００−９をレコードとして記憶する。
【０１２４】
ここで、クラスタＩＤは、クラスタＣｉを一意に識別する識別子である。プログラム名は、クラスタＣｉに属するプログラムの名称である。ランク値は、クラスタＣｉに属するプログラムのランク値である。例えば、ランク値情報１２００−１は、クラスタＣ１に属するプログラム名「支払証明書（月別）」のプログラムｐ１のランク値「４」を示す。
【０１２５】
つぎに、係数算出部５０３は、ランク値格納テーブル１２００を参照して、各プログラムｐ１〜ｐ９のランク値に応じて、各プログラムｐ１〜ｐ９に呼出元係数を設定する。具体的には、例えば、係数算出部５０３は、ランク値が「クラスタＣ１内の各プログラムのランク値の最大値−ｋ」以上であるプログラムに呼出元係数「２．０」を設定する（ただし、「ｋ＝０」とする）。また、係数算出部５０３は、ランク値が「クラスタＣ１内の各プログラムのランク値の最大値−ｋ」未満であるプログラムに呼出元係数「１．０」を設定する。
【０１２６】
ここで、クラスタＣ１内の各プログラムのランク値の最大値は「４」である。また、「ｋ」を「ｋ＝０」とする。この場合、例えば、プログラム名「支払証明書（月別）」のプログラムｐ１の呼出元係数は「２．０」となる。また、例えば、プログラム名「検索ユーティリティ」のプログラムｐ９の呼出元係数は「１．０」となる。
【０１２７】
そして、係数算出部５０３は、設定した各プログラムｐ１〜ｐ９の呼出元係数を、各プログラムｐ１〜ｐ９の重み付け係数に決定する。決定された各プログラムｐ１〜ｐ９の重み付け係数は、図１３に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
【０１２８】
図１３は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その１）である。図１３において、重み付け係数格納テーブル１３００は、クラスタＩＤ、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報１３００−１〜１３００−９をレコードとして記憶する。
【０１２９】
ここで、クラスタＩＤは、クラスタＣｉを一意に識別する識別子である。プログラム名は、クラスタＣｉに属するプログラムの名称である。重み付け係数は、クラスタＣｉに属するプログラムに対応する重み付け係数である。例えば、重み付け係数情報１３００−１は、クラスタＣ１に属するプログラム名「支払証明書（月別）」のプログラムｐ１の重み付け係数「２．０」を示す。
【０１３０】
抽出部５０４は、クラスタＣ１内の各プログラムｐ１〜ｐ９に対応する単語を抽出する。具体的には、例えば、抽出部５０４は、クラスタＣ１内の各プログラムｐ１〜ｐ９のプログラム名から単語を抽出する。抽出された単語は、例えば、図１４に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
【０１３１】
図１４は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その１）である。図１４において、抽出単語格納テーブル１４００は、クラスタＩＤ、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報１４００−１〜１４００−９をレコードとして記憶する。
【０１３２】
ここで、クラスタＩＤは、クラスタＣｉを一意に識別する識別子である。プログラム名は、クラスタＣｉに属するプログラムの名称である。単語群は、クラスタＣｉに属するプログラムから抽出された単語をスペース区切りで並べたものである。重み付け係数は、クラスタＣｉに属するプログラムに対応する重み付け係数（呼出元係数）である。
【０１３３】
例えば、抽出単語情報１４００−１は、クラスタＣ１に属するプログラム名「支払証明書（月別）」のプログラムｐ１から抽出された単語群「支払  証明書  月別」およびプログラムｐ１の重み付け係数「２．０」を示す。
【０１３４】
そして、重み付け部５０５は、抽出単語格納テーブル１４００を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「支払」は、プログラム名「支払証明書（月別）」のプログラムｐ１と、プログラム名「支払証明書（日別）」のプログラムｐ２とからそれぞれ一つ抽出される。すなわち、各プログラムｐ１，ｐ２における単語「支払」の出現頻度（出現回数）は「１」である。また、各プログラムｐ１，ｐ２に対応する重み付け係数は「２．０」である。
【０１３５】
この場合、重み付け部５０５は、例えば、プログラムｐ１における単語「支払」の出現頻度「１」に重み付け係数「２．０」を乗じた値と、プログラムｐ２における単語「支払」の出現頻度「１」に重み付け係数「２．０」を乗じた値とを加算する。これにより、単語「支払」の特徴スコア「４」を算出することができる。
【０１３６】
算出された単語の特徴スコアは、例えば、図１５に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
【０１３７】
図１５は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その１）である。図１５において、特徴スコア格納テーブル１５００は、クラスタＩＤ、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報１５００−１〜１５００−１３をレコードとして記憶する。
【０１３８】
ここで、クラスタＩＤは、クラスタＣｉを一意に識別する識別子である。単語は、クラスタＣｉに属するプログラムから抽出された単語である。特徴スコアは、クラスタＣｉにおける重み付けされた単語の出現頻度に相当し、当該単語がクラスタＣｉの特徴をどの程度表しているのかを示す指標値である。
【０１３９】
例えば、特徴スコア情報１５００−１は、クラスタＣ１に属する単語「支払」の特徴スコア「４」を示す。また、例えば、特徴スコア情報１５００−１４は、クラスタＣ１に属する単語「ユーティリティ」の特徴スコア「１」を示す。
【０１４０】
なお、クラスタＣｉ内のプログラムにおける単語の出現頻度（出現回数）は、例えば、ｔｆ−ｉｄｆ法におけるｔｆ値に相当する。ｉｄｆ値まで考慮する場合には、上述した特徴スコアにｉｄｆ値を乗算することにしてもよい。ただし、この場合、重み付け部５０５は、クラスタＣ１〜Ｃｎについての抽出単語情報を生成した後に、各単語のｉｄｆ値を計算して特徴スコアに乗じることになる。
【０１４１】
（クラスタ特徴語情報の具体例）
ここで、図１６を用いて、特徴スコア格納テーブル１５００をもとに生成されるクラスタ特徴語情報の具体例について説明する。
【０１４２】
図１６は、クラスタ特徴語情報の具体例を示す説明図である。図１６において、クラスタ特徴語情報１６００は、クラスタＩＤと、単語と、特徴スコアとを対応付けて示す情報である。クラスタ特徴語情報１６００によれば、「支払」と「証明書」が、特徴スコア「４」で最も高い値となっており、クラスタＣ１の特徴を表す特徴語として最も相応しい単語であると判断することができる。
【０１４３】
これにより、ｔｆ−ｉｄｆ法をそのままソフトウェアクラスタに適用した際には他の単語に埋もれてしまう「支払」と「証明書」を、クラスタＣ１の特徴語として抽出することができる。クラスタ特徴語情報１６００は、例えば、分析支援装置１０１からクライアント装置１０２に送信される。
【０１４４】
この結果、クライアント装置１０２において、例えば、後述の図１７に示すように、ソフトウェアＳＷの構造を地図上に可視化して、図４に示したディスプレイ４０６に表示することができるようになる。なお、ソフトウェアＳＷの構造を地図上に可視化する具体的な処理内容については、例えば、特開２０１３−１５２５７６号公報を参照することができる。
【０１４５】
図１７は、ソフトウェアＳＷの構造を地図上に可視化して示す説明図である。図１７において、ソフトウェアＳＷから分割された複数のクラスタ（例えば、クラスタＣ１）が、地図を模した形式によって可視化されている。
【０１４６】
ここでは、プログラム（ソースファイル）１個が、地図上の建物１つにあたる。建物の色は、例えば、プログラムが属するパッケージ（あるいは、ディレクトリ）によって分けられている。建物のまとまった区画が、クラスタリングによって発見されたクラスタに相当する。
【０１４７】
また、地図の各区画には、当該各区画に対応するクラスタの特徴語がラベルとして表示される。図１７の例では、クラスタＣ１に対応する区画１７１０に、クラスタＣ１の特徴語「支払；証明書」がラベル１７２０として表示されている。この特徴語「支払；証明書」は、図１６に示したクラスタ特徴語情報１６００から特定される、クラスタＣ１の単語群のうち特徴スコアが最も高い単語である。
【０１４８】
各区画に対応するラベルによれば、各区間、すなわち、各クラスタがどのような性質のものであるかを人が理解しやすいように支援することができる。例えば、ラベル１７２０によれば、クライアント装置１０２のユーザは、クラスタＣ１が支払証明書の処理についてのものであることがわかる。
【０１４９】
（特徴スコアの第２の算出例）
図１８〜図２０を用いて、上述した「遍在係数」を重み付け係数とした場合の特徴スコアの第２の算出例について説明する。また、例題として、図２に示したようなグラフ構造を有するクラスタＣ１を用いる。
【０１５０】
ただし、ここでは、プログラム名「金額編集」のプログラムｐ５が、他のクラスタに属するプログラム１０本からも呼ばれていた場合を想定する。また、クラスタＣ１内のプログラムｐ５以外の他のプログラムｐ１〜ｐ４，ｐ６〜ｐ９は、他のクラスタに属するプログラムから呼ばれていないものとする。
【０１５１】
まず、係数算出部５０３は、上記式（１）および（２）を用いて、クラスタＣ１内の各プログラムｐ１〜ｐ９に対応する遍在係数をそれぞれ算出する。ここでは、閾値ｔを「ｔ＝１０」とし、遍在係数の下限値ｌを「ｌ＝０．１」とする。
【０１５２】
この場合、クラスタＣ１内のプログラムｐ５以外の他のプログラムｐ１〜ｐ４，ｐ６〜ｐ９の呼び出し数ｃoutは、全て「０」であり閾値ｔ未満となる。したがって、プログラムｐ５以外の他のプログラムｐ１〜ｐ４，ｐ６〜ｐ９の遍在係数は、全て「１．０」となる。一方で、プログラムｐ５の呼び出し数ｃoutは、「１０」であり閾値ｔ以上となる。したがって、プログラムｐ５の遍在係数は、「０．１」となる。
【０１５３】
そして、係数算出部５０３は、算出した各プログラムｐ１〜ｐ９の遍在係数を、各プログラムｐ１〜ｐ９の重み付け係数に決定する。決定された各プログラムｐ１〜ｐ９の重み付け係数は、図１８に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
【０１５４】
図１８は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その２）である。図１８において、重み付け係数格納テーブル１８００は、クラスタＩＤ、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報１８００−１〜１８００−９をレコードとして記憶する。
【０１５５】
例えば、重み付け係数情報１８００−１は、クラスタＣ１に属するプログラム名「支払証明書（月別）」のプログラムｐ１の重み付け係数「１．０」を示す。また、例えば、重み付け係数情報１８００−５は、クラスタＣ１に属するプログラム名「金額編集」のプログラムｐ５の重み付け係数「０．１」を示す。ここでは、プログラムｐ１〜ｐ９のうち、他のクラスタに属するプログラムからも呼び出されるプログラムｐ５の重み付け係数が相対的に低くなっている。
【０１５６】
抽出部５０４は、クラスタＣ１内の各プログラムｐ１〜ｐ９に対応する単語を抽出する。抽出された単語は、例えば、図１９に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
【０１５７】
図１９は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その２）である。図１９において、抽出単語格納テーブル１９００は、クラスタＩＤ、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報１９００−１〜１９００−９をレコードとして記憶する。
【０１５８】
例えば、抽出単語情報１９００−５は、クラスタＣ１に属するプログラム名「金額編集」のプログラムｐ５から抽出された単語群「金額  編集」およびプログラムｐ５の重み付け係数（遍在係数）「０．１」を示す。
【０１５９】
そして、重み付け部５０５は、抽出単語格納テーブル１９００を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「金額」は、プログラム名「利用金額計算」のプログラムｐ３と、プログラム名「金額編集」のプログラムｐ５と、プログラム名「金額計算」のプログラムｐ８とからそれぞれ一つ抽出される。
【０１６０】
すなわち、各プログラムｐ３，ｐ５，ｐ８における単語「金額」の出現頻度（出現回数）は「１」である。また、プログラムｐ３に対応する重み付け係数は「１．０」である。プログラムｐ５に対応する重み付け係数は「０．１」である。プログラムｐ８に対応する重み付け係数は「１．０」である。
【０１６１】
この場合、重み付け部５０５は、例えば、プログラムｐ３における単語「金額」の出現頻度「１」に重み付け係数「１．０」を乗じた値と、プログラムｐ５における単語「金額」の出現頻度「１」に重み付け係数「０．１」を乗じた値と、プログラムｐ８における単語「金額」の出現頻度「１」に重み付け係数「１．０」を乗じた値とを加算する。これにより、単語「金額」の特徴スコア「２．１」を算出することができる。
【０１６２】
算出された単語の特徴スコアは、例えば、図２０に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
【０１６３】
図２０は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その２）である。図２０において、特徴スコア格納テーブル２０００は、クラスタＩＤ、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報２０００−１〜２０００−１３をレコードとして記憶する。
【０１６４】
例えば、特徴スコア情報２０００−６は、クラスタＣ１に属する単語「金額」の特徴スコア「２．１」を示す。また、例えば、特徴スコア情報２０００−９は、クラスタＣ１に属する単語「編集」の特徴スコア「１．１」を示す。このように、単語「金額」と単語「編集」の特徴スコアがそれぞれ、上述した第１の算出例の場合に比べて低い値となっており、クラスタＣ１の目的や特徴を表さないこれら単語の特徴スコアを低めることができている。
【０１６５】
（特徴スコアの第３の算出例）
つぎに、図２１〜図２４を用いて、上述した「サブクラス係数」を重み付け係数とした場合の特徴スコアの第３の算出例について説明する。また、例題として、図２１に示すようなグラフ構造を有するクラスタＣ１を用いる。
【０１６６】
図２１は、クラスタのグラフ構造の一例を示す説明図（その２）である。図２１において、グラフ２１００は、ソフトウェアＳＷに対してクラスタリングを行った結果として得られたクラスタＣ１を、クラスタＣ１に属するプログラム間の呼び出し関係を有向辺とする有向グラフ構造により表現したものである。
【０１６７】
このグラフ２１００は、図２に示したグラフ２００に対して、プログラム名「支払証明書」のプログラムｐ１０を追加したものである。プログラムｐ１０は、プログラム名「支払証明書（月別）」のプログラムｐ１とプログラム名「支払証明書（日別）」のプログラムｐ２のスーパークラスとして定義されているものである。つまり、これら２つのサブクラス（プログラムｐ１，ｐ２）が、「支払証明書」を継承し、「月別」「日別」のための個別処理のみをサブクラスで定義しているという関係がある。
【０１６８】
まず、係数算出部５０３は、上記式（３）を用いて、クラスタＣ１内の各プログラムｐ１〜ｐ１０に対応するサブクラス係数をそれぞれ算出する。ここでは、パラメータｓを「ｓ＝５」とする。図２１の例では、クラスタＣ１内のプログラムｐ１０以外の他のプログラムｐ１〜ｐ９の継承関係の数ｃsubは、全て「０」である。
【０１６９】
したがって、プログラムｐ１０以外の他のプログラムｐ１〜ｐ９のサブクラス係数は、全て「１．０」となる。一方で、プログラムｐ１０の継承関係の数ｃsubは、「２」である。したがって、プログラムｐ１０のサブクラス係数は、「１．４（＝２／５＋１）」となる。
【０１７０】
そして、係数算出部５０３は、算出した各プログラムｐ１〜ｐ１０のサブクラス係数を、各プログラムｐ１〜ｐ１０の重み付け係数に決定する。決定された各プログラムｐ１〜ｐ１０の重み付け係数は、図２２に示すような重み付け係数格納テーブルに記憶される。ここで、重み付け係数格納テーブルの記憶内容について説明する。
【０１７１】
図２２は、重み付け係数格納テーブルの記憶内容の一例を示す説明図（その３）である。図２２において、重み付け係数格納テーブル２２００は、クラスタＩＤ、プログラム名および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、重み付け係数情報２２００−１〜２２００−１０をレコードとして記憶する。
【０１７２】
例えば、重み付け係数情報２２００−１は、クラスタＣ１に属するプログラム名「支払証明書（月別）」のプログラムｐ１の重み付け係数「１．０」を示す。また、例えば、重み付け係数情報２２００−３は、クラスタＣ１に属するプログラム名「支払証明書」のプログラムｐ１０の重み付け係数「１．４」を示す。ここでは、プログラムｐ１〜ｐ１０のうち、サブクラスを２つ持つプログラムｐ１０の重み付け係数が相対的に高くなっている。
【０１７３】
抽出部５０４は、クラスタＣ１内の各プログラムｐ１〜ｐ１０に対応する単語を抽出する。抽出された単語は、例えば、図２３に示すような抽出単語格納テーブルに記憶される。ここで、抽出単語格納テーブルの記憶内容について説明する。
【０１７４】
図２３は、抽出単語格納テーブルの記憶内容の一例を示す説明図（その３）である。図２３において、抽出単語格納テーブル２３００は、クラスタＩＤ、プログラム名、単語群および重み付け係数のフィールドを有し、各フィールドに情報を設定することで、抽出単語情報２３００−１〜２３００−１０をレコードとして記憶する。
【０１７５】
例えば、抽出単語情報２３００−３は、クラスタＣ１に属するプログラム名「支払証明書」のプログラムｐ１０から抽出された単語群「支払  証明書」およびプログラムｐ１０の重み付け係数（サブクラス係数）「１．４」を示す。
【０１７６】
そして、重み付け部５０５は、抽出単語格納テーブル２３００を参照して、抽出された単語ごとの特徴スコアを算出する。例えば、単語「支払」は、プログラム名「支払証明書（月別）」のプログラムｐ１と、プログラム名「支払証明書（日別）」のプログラムｐ２と、プログラム名「支払証明書」のプログラムｐ１０とからそれぞれ一つ抽出される。
【０１７７】
すなわち、各プログラムｐ１，ｐ２，ｐ１０における単語「支払」の出現頻度（出現回数）は「１」である。また、プログラムｐ１に対応する重み付け係数は「１．０」である。プログラムｐ２に対応する重み付け係数は「１．０」である。プログラムｐ１０に対応する重み付け係数は「１．４」である。
【０１７８】
この場合、重み付け部５０５は、例えば、プログラムｐ１における単語「支払」の出現頻度「１」に重み付け係数「１．０」を乗じた値と、プログラムｐ２における単語「支払」の出現頻度「１」に重み付け係数「１．０」を乗じた値と、プログラムｐ１０における単語「支払」の出現頻度「１」に重み付け係数「１．４」を乗じた値とを加算する。これにより、単語「支払」の特徴スコア「３．４」を算出することができる。
【０１７９】
算出された単語の特徴スコアは、例えば、図２４に示すような特徴スコア格納テーブルに記憶される。ここで、特徴スコア格納テーブルの記憶内容について説明する。
【０１８０】
図２４は、特徴スコア格納テーブルの記憶内容の一例を示す説明図（その３）である。図２４において、特徴スコア格納テーブル２４００は、クラスタＩＤ、単語および特徴スコアのフィールドを有し、各フィールドに情報を設定することで、特徴スコア情報２４００−１〜２４００−１３をレコードとして記憶する。
【０１８１】
例えば、特徴スコア情報２４００−１は、クラスタＣ１に属する単語「支払」の特徴スコア「３．４」を示す。また、例えば、特徴スコア情報２４００−２は、クラスタＣ１に属する単語「証明書」の特徴スコア「３．４」を示す。このように、スーパークラスである「支払証明書」を構成する単語「支払」と単語「証明書」とが持ち上げられていることがわかる。
【０１８２】
なお、第３の計算例では、例えば、呼び出し元側に位置するほど高い重みを与える呼出元係数を使用していない。呼出元係数とサブクラス係数を併用すると、単語「支払」と単語「証明書」の特徴スコアはより高く持ち上げられることになる。
【０１８３】
（分析支援装置１０１の分析支援処理手順）
つぎに、図２５〜図３０を用いて、分析支援装置１０１の分析支援処理手順について説明する。
【０１８４】
図２５は、分析支援装置１０１の分析支援処理手順の一例を示すフローチャートである。図２５のフローチャートにおいて、まず、分析支援装置１０１は、ソースコードＤＢ１２０から分析対象となるソフトウェアＳＷのソースコードを読み込む（ステップＳ２５０１）。
【０１８５】
そして、分析支援装置１０１は、ソフトウェアＳＷのソースコードを解析して、ソフトウェアＳＷをクラスタリングする（ステップＳ２５０２）。つぎに、分析支援装置１０１は、クラスタＣｉの「ｉ」を「ｉ＝１」とし（ステップＳ２５０３）、クラスタリングにより得られたクラスタＣ１〜ＣｎからクラスタＣｉを選択する（ステップＳ２５０４）。
【０１８６】
そして、分析支援装置１０１は、選択したクラスタＣｉ内の各プログラムに対応する重み付け係数を算出する重み付け係数算出処理を実行する（ステップＳ２５０５）。なお、重み付け係数算出処理の具体的な処理手順については、図２６を用いて後述する。
【０１８７】
つぎに、分析支援装置１０１は、選択したクラスタＣｉ内の各プログラムに対応する単語の特徴スコアを算出する特徴スコア算出処理を実行する（ステップＳ２５０６）。なお、特徴スコア算出処理の具体的な処理手順については、図３０を用いて後述する。
【０１８８】
つぎに、分析支援装置１０１は、算出された単語の特徴スコアに基づいて、選択したクラスタＣｉのクラスタ特徴語情報を生成する（ステップＳ２５０７）。そして、分析支援装置１０１は、生成したクラスタＣｉのクラスタ特徴語情報を出力する（ステップＳ２５０８）。
【０１８９】
つぎに、分析支援装置１０１は、クラスタＣｉの「ｉ」をインクリメントして（ステップＳ２５０９）、「ｉ」が「ｎ」より大きくなったか否かを判断する（ステップＳ２５１０）。ここで、「ｉ」が「ｎ」以下の場合（ステップＳ２５１０：Ｎｏ）、分析支援装置１０１は、ステップＳ２５０４に戻る。一方、「ｉ」が「ｎ」より大きい場合（ステップＳ２５１０：Ｙｅｓ）、分析支援装置１０１は、本フローチャートによる一連の処理を終了する。
【０１９０】
これにより、ソフトウェアＳＷをクラスタリングして得られる各クラスタＣｉを特徴付ける単語を抽出することが可能となる。
【０１９１】
つぎに、図２５に示したステップＳ２５０５の重み付け係数算出処理の具体的な処理手順について説明する。
【０１９２】
図２６は、重み付け係数算出処理の具体的な処理手順の一例を示すフローチャートである。図２６のフローチャートにおいて、まず、分析支援装置１０１は、クラスタＣｉに属する各プログラムに対応する呼出元係数を算出する呼出元係数算出処理を実行する（ステップＳ２６０１）。なお、呼出元係数算出処理の具体的な処理手順については、図２７を用いて後述する。
【０１９３】
つぎに、分析支援装置１０１は、クラスタＣｉに属する各プログラムに対応する遍在係数を算出する遍在係数算出処理を実行する（ステップＳ２６０２）。なお、遍在係数算出処理の具体的な処理手順については、図２８を用いて後述する。
【０１９４】
つぎに、分析支援装置１０１は、クラスタＣｉに属する各プログラムに対応するサブクラス係数を算出するサブクラス係数算出処理を実行する（ステップＳ２６０３）。なお、サブクラス係数算出処理の具体的な処理手順については、図２９を用いて後述する。
【０１９５】
そして、分析支援装置１０１は、算出したクラスタＣｉ内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数に基づいて、当該各プログラムに対応する重み付け係数を決定する（ステップＳ２６０４）。
【０１９６】
これにより、クラスタＣｉ内の各プログラムに対応する重み付け係数を算出することができる。なお、呼出元係数、遍在係数およびサブクラス係数のいずれの係数を用いて、重み付け係数を決定するかは、例えば、設定ファイル、または、ユーザにより指定される。
【０１９７】
つぎに、図２６に示したステップＳ２６０１の呼出元係数算出処理の具体的な処理手順について説明する。
【０１９８】
図２７は、呼出元係数算出処理の具体的な処理手順の一例を示すフローチャートである。図２７のフローチャートにおいて、まず、分析支援装置１０１は、クラスタＣｉ内のプログラム間の依存関係に基づいて、各プログラムにランク値を設定する（ステップＳ２７０１）。
【０１９９】
つぎに、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムを選択する（ステップＳ２７０２）。そして、分析支援装置１０１は、選択したプログラムのランク値に応じて、当該プログラムに呼出元係数を算出する（ステップＳ２７０３）。つぎに、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムがあるか否かを判断する（ステップＳ２７０４）。
【０２００】
ここで、未選択のプログラムがある場合（ステップＳ２７０４：Ｙｅｓ）、分析支援装置１０１は、ステップＳ２７０２に戻る。一方、未選択のプログラムがない場合（ステップＳ２７０４：Ｎｏ）、分析支援装置１０１は、呼出元係数算出処理を呼び出したステップに戻る。
【０２０１】
これにより、クラスタＣｉ内の各プログラムに対応する呼出元係数を算出することができる。
【０２０２】
つぎに、図２６に示したステップＳ２６０２の遍在係数算出処理の具体的な処理手順について説明する。
【０２０３】
図２８は、遍在係数算出処理の具体的な処理手順の一例を示すフローチャートである。図２８のフローチャートにおいて、まず、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムを選択する（ステップＳ２８０１）。そして、分析支援装置１０１は、クラスタＣｉ内のプログラム間の依存関係に基づいて、選択したプログラムが他のクラスタＣｊ内のプログラムから呼び出される数を算出する（ステップＳ２８０２）。
【０２０４】
つぎに、分析支援装置１０１は、算出した他のクラスタＣｊ内のプログラムからの呼び出し数に基づいて、上記式（１）および（２）を用いて、選択したプログラムに対応する遍在係数を算出する（ステップＳ２８０３）。そして、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムがあるか否かを判断する（ステップＳ２８０４）。
【０２０５】
ここで、未選択のプログラムがある場合（ステップＳ２８０４：Ｙｅｓ）、分析支援装置１０１は、ステップＳ２８０１に戻る。一方、未選択のプログラムがない場合（ステップＳ２８０４：Ｎｏ）、分析支援装置１０１は、遍在係数算出処理を呼び出したステップに戻る。
【０２０６】
これにより、クラスタＣｉ内の各プログラムに対応する遍在係数を算出することができる。
【０２０７】
つぎに、図２６に示したステップＳ２６０３のサブクラス係数算出処理の具体的な処理手順について説明する。
【０２０８】
図２９は、サブクラス係数算出処理の具体的な処理手順の一例を示すフローチャートである。図２９のフローチャートにおいて、まず、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムを選択する（ステップＳ２９０１）。そして、分析支援装置１０１は、選択したプログラムをスーパークラスとするクラスタＣｉ内の他のプログラムとの継承関係の数を算出する（ステップＳ２９０２）。
【０２０９】
つぎに、分析支援装置１０１は、算出した他のプログラムとの継承関係の数に基づいて、上記式（３）を用いて、選択したプログラムに対応するサブクラス係数を算出する（ステップＳ２９０３）。そして、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムがあるか否かを判断する（ステップＳ２９０４）。
【０２１０】
ここで、未選択のプログラムがある場合（ステップＳ２９０４：Ｙｅｓ）、分析支援装置１０１は、ステップＳ２９０１に戻る。一方、未選択のプログラムがない場合（ステップＳ２９０４：Ｎｏ）、分析支援装置１０１は、サブクラス係数算出処理を呼び出したステップに戻る。
【０２１１】
これにより、クラスタＣｉ内の各プログラムに対応するサブクラス係数を算出することができる。
【０２１２】
つぎに、図２５に示したステップＳ２５０６の特徴スコア算出処理の具体的な処理手順について説明する。
【０２１３】
図３０は、特徴スコア算出処理の具体的な処理手順の一例を示すフローチャートである。図３０のフローチャートにおいて、まず、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムを選択する（ステップＳ３００１）。つぎに、分析支援装置１０１は、選択したプログラムに対応する単語を抽出する（ステップＳ３００２）。
【０２１４】
そして、分析支援装置１０１は、抽出した単語を、選択したプログラムと対応付けて抽出単語格納テーブルに記録する（ステップＳ３００３）。つぎに、分析支援装置１０１は、クラスタＣｉ内の未選択のプログラムがあるか否かを判断する（ステップＳ３００４）。
【０２１５】
ここで、未選択のプログラムがある場合（ステップＳ３００４：Ｙｅｓ）、分析支援装置１０１は、ステップＳ３００１に戻る。一方、未選択のプログラムがない場合（ステップＳ３００４：Ｎｏ）、分析支援装置１０１は、抽出単語格納テーブルを参照して、未選択の単語を選択する（ステップＳ３００５）。
【０２１６】
そして、分析支援装置１０１は、選択した単語が、特徴スコア格納テーブルに登録済みであるか否かを判断する（ステップＳ３００６）。ここで、選択した単語が登録済みの場合（ステップＳ３００６：Ｙｅｓ）、分析支援装置１０１は、ステップＳ３００８に移行する。
【０２１７】
一方、選択した単語が未登録の場合（ステップＳ３００６：Ｎｏ）、分析支援装置１０１は、クラスタＣｉのクラスタＩＤと対応付けて、選択した単語を特徴スコア格納テーブルに登録する（ステップＳ３００７）。つぎに、分析支援装置１０１は、抽出単語格納テーブルを参照して、選択した単語の重み付け係数を特定する（ステップＳ３００８）。
【０２１８】
そして、分析支援装置１０１は、特定した単語の重み付け係数を、特徴スコア格納テーブル内の当該単語の特徴スコアに加算する（ステップＳ３００９）。つぎに、分析支援装置１０１は、抽出単語格納テーブルから選択していない未選択の単語があるか否かを判断する（ステップＳ３０１０）。
【０２１９】
ここで、未選択の単語がある場合（ステップＳ３０１０：Ｙｅｓ）、分析支援装置１０１は、ステップＳ３００５に戻る。一方、未選択の単語がない場合（ステップＳ３０１０：Ｎｏ）、分析支援装置１０１は、特徴スコア算出処理を呼び出したステップに戻る。
【０２２０】
これにより、クラスタＣｉ内の各プログラムに対応する単語の特徴スコアを算出することができる。
【０２２１】
以上説明したように、実施の形態にかかる分析支援装置１０１によれば、分析対象となるソフトウェアＳＷの複数のプログラムのプログラム間の依存関係に基づいて、複数のプログラムを分割して得られるクラスタＣｉにおける単語の出現頻度に重み付けを行うことができる。そして、分析支援装置１０１によれば、重み付けした単語の出現頻度（特徴スコア）をクラスタＣｉと対応付けて出力することができる。
【０２２２】
これにより、ソフトウェアＳＷのプログラム間の依存関係から特定される、クラスタＣｉに特徴的な単語に対して重みを付けることができる。このため、クラスタＣｉの主要な目的を表す単語が、当該目的を担うプログラムから使用される手段としてのプログラムに関係した単語に埋もれてしまうことを防いで、より直感的にクラスタＣｉの特徴を理解しやすい単語を抽出することが可能となる。
【０２２３】
また、分析支援装置１０１によれば、クラスタＣｉ内の各プログラムのランク値に基づいて、当該ランク値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタＣｉにおける単語の出現頻度に重み付けを行うことができる。ランク値は、クラスタＣｉ内のプログラム間の依存関係の連鎖の大本となるプログラムとクラスタＣｉ内の各プログラムとの関係度合いを示す値である。具体的には、例えば、分析支援装置１０１は、クラスタＣｉ内の各プログラムについて、ランク値の高さに応じて係数値が高くなる呼出元係数を設定する。そして、分析支援装置１０１は、設定した各プログラムの呼出元係数（重み付け係数）に基づいて、当該呼出元係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタＣｉにおける単語の出現頻度に重み付けを行う。
【０２２４】
これにより、クラスタＣｉ内の呼び出し元に近いほうに位置し、クラスタＣｉの主要な目的を担っている可能性が高いプログラムに対応する単語の評価を相対的に高くすることができ、より直感的にクラスタＣｉの特徴を理解しやすい単語を抽出可能となる。
【０２２５】
また、分析支援装置１０１によれば、クラスタＣｉ内の各プログラムが他のクラスタＣｊ内のプログラムから呼び出される数に基づいて、当該数が大きいプログラムに対応する単語の出現頻度が低くなるように、クラスタＣｉにおける単語の出現頻度の重み付けを行うことができる。具体的には、例えば、分析支援装置１０１は、クラスタＣｉ内の各プログラムについて、各プログラムが他のクラスタＣｊ内のプログラムから呼び出される数の大きさに応じて係数値が低くなる遍在係数を算出することができる。そして、分析支援装置１０１は、算出した各プログラムの遍在係数（重み付け係数）に基づいて、当該遍在係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタＣｉにおける単語の出現頻度に重み付けを行う。
【０２２６】
これにより、他のクラスタＣｊ内のプログラムから多数呼び出され、汎用のユーティリティ機能を提供するものである可能性が高いプログラムに対応する単語の評価を相対的に低くすることができる。換言すれば、クラスタＣｉの主要な目的を担っている可能性が低いプログラムに対応する単語の評価を相対的に低くすることができ、より直感的にクラスタＣｉの特徴を理解しやすい単語を抽出可能となる。
【０２２７】
また、分析支援装置１０１によれば、クラスタＣｉ内のプログラムをスーパークラスとするクラスタＣｉ内の他のプログラムとの継承関係の数に基づいて、当該数が大きいプログラムに対応する単語の出現頻度が高くなるように、クラスタＣｉにおける単語の出現頻度の重み付けを行うことができる。具体的には、例えば、分析支援装置１０１は、クラスタＣｉ内の各プログラムについて、各プログラムをスーパークラスとするクラスタＣｉ内の他のプログラムとの継承関係の数の大きさに応じて係数値が高くなるサブクラス係数を算出する。そして、分析支援装置１０１は、算出した各プログラムのサブクラス係数（重み付け係数）に基づいて、当該サブクラス係数の係数値が高いプログラムに対応する単語の出現頻度が高くなるように、クラスタＣｉにおける単語の出現頻度に重み付けを行う。
【０２２８】
これにより、クラスタＣｉ内の多数のサブクラスのスーパークラスであり、クラスタＣｉ内の複数のプログラムの共通の性質を表すものである可能性が高いプログラムに対応する単語の評価を相対的に高くすることができる。換言すれば、クラスタＣｉの性質を理解するうえで重要であるといえるプログラムに対応する単語の評価を相対的に高くすることができ、より直感的にクラスタＣｉの特徴を理解しやすい単語を抽出可能となる。
【０２２９】
また、分析支援装置１０１によれば、クラスタＣｉ内の各プログラムに対応する呼出元係数、遍在係数およびサブクラス係数のうちの２つ以上の係数を乗じて得られる値を、各プログラムに対応する重み付け係数に決定することができる。これにより、呼出元係数、遍在係数およびサブクラス係数のそれぞれの係数の特徴を組み合わせて、クラスタＣｉにおける単語の出現頻度に重み付けを行うことができる。
【０２３０】
例えば、クラスタリングによってクラスタＣｉを得た際、クラスタＣｉ内の依存関係の階層の下位のほうで、多数の依存関係が一つのプログラムに対して集中していることがある。これら依存関係には、スーパークラスへの参照（継承）と、汎用のユーティリティ機能の呼び出しとの両方がある。スーパークラスへの参照（継承）のほうは、参照先のプログラムの名前がクラスタＣｉの特徴の理解のために重要であるが、汎用のユーティリティ機能の呼び出しのほうは重要ではない。両者の判別は、クラスタＣｉのグラフ構造だけでは判断できないが、遍在係数とサブクラス係数とを併用することにより可能となる。例えば、他のクラスタＣｉからの呼び出しが多数であれば、汎用のユーティリティ機能と判断されて遍在係数が低い値に計算され、クラスタＣｉ内の他のプログラムとの継承関係の数が多ければ、サブクラス係数が高くなるという形で重要性を判別することができる。すなわち、遍在係数とサブクラス係数とを乗算した重み付け係数を用いることで、スーパークラスであり、かつ、クラスタＣｉ外から多数参照されている場合には互いの効果が相殺されることになる。
【０２３１】
また、分析支援装置１０１によれば、重み付けした単語の出現頻度に基づいて、クラスタＣｉ内の各プログラムに対応する単語のうち、当該出現頻度が高い上位複数個の単語、あるいは、当該出現頻度が所定値以上の単語を示すクラスタ特徴語情報を生成することができる。そして、分析支援装置１０１によれば、生成したクラスタ特徴語情報を出力することができる。これにより、クラスタＣｉの特徴を表すものとして相応しい単語を絞り込んで提供することができる。
【０２３２】
これらのことから、分析支援装置１０１によれば、ソフトウェアＳＷを分割して得られるクラスタＣｉが、どのような性質のものであるかを人が理解しやすい説明語句を生成することが可能となり、ソフトウェアＳＷの分析を支援することができる。
【０２３３】
なお、本実施の形態で説明した分析支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析支援プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本分析支援プログラムは、インターネット等のネットワークを介して配布してもよい。
【０２３４】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２３５】
（付記１）コンピュータが、
ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行することを特徴とする分析支援方法。
【０２３６】
（付記２）前記重み付けを行う処理は、
前記構成要素集合の構成要素間の依存関係の連鎖の大本となる構成要素と前記構成要素集合の各構成要素との関係度合いを示すランク値に基づいて、当該ランク値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記１に記載の分析支援方法。
【０２３７】
（付記３）前記コンピュータが、
前記各構成要素について、前記連鎖の大本となる構成要素との関係度合いを示すランク値の高さに応じて係数値が高くなる第１の係数を設定する、処理を実行し、
前記重み付けを行う処理は、
設定した前記各構成要素の第１の係数に基づいて、当該第１の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記２に記載の分析支援方法。
【０２３８】
（付記４）前記重み付けを行う処理は、
前記構成要素集合の構成要素が前記構成要素集合とは異なる他の構成要素集合の構成要素から呼び出される数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が低くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする付記１〜３のいずれか一つに記載の分析支援方法。
【０２３９】
（付記５）前記コンピュータが、
前記構成要素集合の各構成要素について、前記各構成要素が前記他の構成要素集合の構成要素から呼び出される数の大きさに応じて係数値が低くなる第２の係数を算出する、処理を実行し、
前記重み付けを行う処理は、
算出した前記各構成要素の第２の係数に基づいて、当該第２の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記４に記載の分析支援方法。
【０２４０】
（付記６）前記第２の係数を算出する処理は、
前記各構成要素について、前記構成要素集合の構成要素間の依存関係の連鎖の大本となる構成要素を除く構成要素が前記他の構成要素集合の構成要素から呼び出される数の大きさに応じて係数値が低くなる第２の係数を算出する、ことを特徴とする付記５に記載の分析支援方法。
【０２４１】
（付記７）前記重み付けを行う処理は、
前記構成要素集合の構成要素をスーパークラスとする前記構成要素集合の他の構成要素との継承関係の数に基づいて、当該数が大きい構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度の重み付けを行う、ことを特徴とする付記１〜６のいずれか一つに記載の分析支援方法。
【０２４２】
（付記８）前記コンピュータが、
前記構成要素集合の各構成要素について、前記各構成要素をスーパークラスとする前記構成要素集合の他の構成要素との継承関係の数の大きさに応じて係数値が高くなる第３の係数を算出する、処理を実行し、
前記重み付けを行う処理は、
算出した前記各構成要素の第３の係数に基づいて、当該第３の係数の係数値が高い構成要素に対応する単語の出現頻度が高くなるように、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記７に記載の分析支援方法。
【０２４３】
（付記９）前記コンピュータが、
重み付けした前記単語の出現頻度に基づいて、前記構成要素集合の各構成要素に対応する単語のうち、当該出現頻度が高い上位複数個の単語、あるいは、当該出現頻度が所定値以上の単語を示す特徴語情報を生成し、
前記出力する処理は、
生成した前記特徴語情報を前記構成要素集合と対応付けて出力する、ことを特徴とする付記１〜８のいずれか一つに記載の分析支援方法。
【０２４４】
（付記１０）前記構成要素集合における単語は、前記構成要素集合の構成要素の識別子から抽出される単語である、ことを特徴とする付記１〜９のいずれか一つに記載の分析支援方法。
【０２４５】
（付記１１）前記コンピュータが、
記憶部に記憶された前記ソフトウェアのソースコードを解析して、前記ソフトウェアの複数の構成要素の構成要素間の依存関係を抽出する、処理を実行し、
前記重み付けを行う処理は、
抽出した前記構成要素間の依存関係に基づいて、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記１〜１０のいずれか一つに記載の分析支援方法。
【０２４６】
（付記１２）前記重み付けを行う処理は、
前記ソフトウェアの複数の構成要素の構成要素間の依存関係を示す依存関係情報を記憶する記憶部を参照して、前記構成要素集合における単語の出現頻度に重み付けを行う、ことを特徴とする付記１〜１１のいずれか一つに記載の分析支援方法。
【０２４７】
（付記１３）ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
制御部を有することを特徴とする分析支援装置。
【０２４８】
（付記１４）コンピュータに、
ソフトウェアの複数の構成要素の構成要素間の依存関係に基づいて、前記複数の構成要素を分割して得られる構成要素集合における単語の出現頻度に重み付けを行い、
重み付けした前記単語の出現頻度を前記構成要素集合と対応付けて出力する、
処理を実行させることを特徴とする分析支援プログラム。
【符号の説明】
【０２４９】
１００  分析支援システム
１０１  分析支援装置
１０２  クライアント装置
１２０  ソースコードＤＢ
５０１  取得部
５０２  分割部
５０３  係数算出部
５０４  抽出部
５０５  重み付け部
５０６  出力部
１２００  ランク値格納テーブル
１３００，１８００，２２００  重み付け係数格納テーブル
１４００，１９００，２３００  抽出単語格納テーブル
１５００，２０００，２４００  特徴スコア格納テーブル
１６００  クラスタ特徴語情報
Ｃ１〜Ｃｎ，Ｃｉ，Ｃｊ  クラスタ
ＳＷ  ソフトウェア
【図１】
0006658098.tif 000002
【図２】
0006658098.tif 000003
【図３】
0006658098.tif 000004
【図４】
0006658098.tif 000005
【図５】
0006658098.tif 000006
【図６】
0006658098.tif 000007
【図７】
0006658098.tif 000008
【図８】
0006658098.tif 000009
【図９】
0006658098.tif 000010
【図１０】
0006658098.tif 000011
【図１１】
0006658098.tif 000012
【図１２】
0006658098.tif 000013
【図１３】
0006658098.tif 000014
【図１４】
0006658098.tif 000015
【図１５】
0006658098.tif 000016
【図１６】
0006658098.tif 000017
【図１７】
0006658098.tif 000018
【図１８】
0006658098.tif 000019
【図１９】
0006658098.tif 000020
【図２０】
0006658098.tif 000021
【図２１】
0006658098.tif 000022
【図２２】
0006658098.tif 000023
【図２３】
0006658098.tif 000024
【図２４】
0006658098.tif 000025
【図２５】
0006658098.tif 000026
【図２６】
0006658098.tif 000027
【図２７】
0006658098.tif 000028
【図２８】
0006658098.tif 000029
【図２９】
0006658098.tif 000030
【図３０】
0006658098.tif 000031