(57)【要約】      （修正有）【課題】プログラムで使用される変数の意味を説明する変数説明情報を作成する手段を提供する。【解決手段】変数の意味を抽出する意味抽出装置１００は、解析対象のソースプログラム２００に対する静的解析により、ソースプログラム２００中の変数ごとに、ソースプログラム２００に記載された一つ以上の単語からなる単語列であって前記変数のとるべき値が影響を受ける単語列である複数の依存情報を抽出するプログラム静的解析部１２０と、抽出された複数の依存情報から、単語単位の字句を切り出す字句解析部１３０と、切り出された字句が字句の対応する変数の意味をどの程度表しているかを示すスコアを、所定のスコア計算規則によって計算する字句の有意味度計算部１４０と、字句の有意味度計算部１４０により計算された字句のスコアに基づいて複数の字句の中から予め設定された数の字句を選び、選んだ字句を日本語に変換する日本語変換部１５０とを備えた。【選択図】図１
2014016686.tif 000002
【特許請求の範囲】
【請求項１】
解析対象のソースプログラムに対する静的解析により、前記ソースプログラムの中の変数ごとに、前記ソースプログラムに記載された一つ以上の単語からなる単語列であって前記変数のとるべき値が影響を受ける単語列である複数の依存情報を抽出するプログラム静的解析部と、
前記プログラム静的解析部によって抽出された前記単語列である前記複数の依存情報から、単語単位の字句を切り出す字句解析部と、
前記字句解析部によって切り出された前記字句が前記字句の対応する前記変数の意味をどの程度表しているかを示す値であるスコアを、所定のスコア計算規則によって計算する有意味度計算部と、
前記有意味度計算部によって計算された前記字句の前記スコアに基づいて複数の前記字句の中から予め設定された数の前記字句を選び、選んだ前記字句を所定の原語に変換する原語変換部と
を備えたことを特徴とする意味抽出装置。
【請求項２】
前記プログラム静的解析部は、
前記依存情報として、
クラス名と、メソッド名と、メンバ名と、変数名とを抽出対象として抽出することを特徴とする請求項１記載の意味抽出装置。
【請求項３】
前記プログラム静的解析部は、
前記メソッド名を抽出する際において、抽出する前記メソッド名のメソッドから呼び出されるメソッドが一つ以上ある場合には、前記呼び出されるメソッドのなかでネストの深さが最も深いメソッドのネストの深さを、ネストの深さの最大値として抽出し、
前記有意味度計算部は、
前記プログラム静的解析部によって抽出された前記ネストの深さの最大値を用いて、前記ネストの深さの最大値に対応する前記メソッド名から前記字句解析部によって切り出された前記字句の前記スコアを計算することを特徴とする請求項２記載の意味抽出装置。
【請求項４】
前記プログラム静的解析部は、
前記ソースプログラム内のメソッドの呼出関係を示すコールグラフを作成し、作成した前記コールグラフから前記ネストの深さの最大値を抽出することを特徴とする請求項３記載の意味抽出装置。
【請求項５】
前記有意味度計算部は、
前記字句解析部によって切り出された前記字句ごとのＴＦ（Ｔｅｒｍ  Ｆｒｅｑｕｅｎｃｙ）値を計算するＴＦ値計算部と、
前記字句解析部によって切り出された前記字句ごとのＩＤＦ値（Ｉｎｖｅｒｔｅｄ  Ｄｏｃｕｍｅｎｔ  Ｆｒｅｑｕｅｎｃｙ）を計算するＩＤＦ値計算部と、
前記ＴＦ値計算部が計算した前記ＴＦ値と、前記ＩＤＦ値計算部が計算した前記ＩＤＦ値とから、これらを乗じたＴＦ・ＩＤＦ値を計算し、計算した前記ＴＦ・ＩＤＦ値から前記ＴＦ・ＩＤＦ値に対応する前記字句の前記スコアを決定するＴＦ・ＩＤＦ値計算部と
を備えたことを特徴とする請求項３または４のいずれかに記載の意味抽出装置。
【請求項６】
前記有意味度計算部は、さらに、
前記ソースプログラム全体を字句解析し、前記ソースプログラム全体の字句一覧を生成する有意味度側字句解析部を備え、
前記ＩＤＦ値計算部は、
前記有意味度側字句解析部が生成した前記ソースプログラム全体の字句一覧を用いて、前記字句解析部によって切り出された前記字句ごとのＩＤＦ値を計算し、
前記ＴＦ・ＩＤＦ値計算部は、
前記ＴＦ値計算部が計算した前記ＴＦ値と、前記ＩＤＦ値計算部が前記ソースプログラム全体の字句一覧を用いて計算した前記ＩＤＦ値とから、これらを乗じたＴＦ・ＩＤＦ値を計算し、計算した前記ＴＦ・ＩＤＦ値から前記ＴＦ・ＩＤＦ値に対応する前記字句の前記スコアを決定することを特徴とする請求項５記載の意味抽出装置。
【請求項７】
前記有意味度計算部は、さらに、
前記ソースプログラムに含まれるクラスごとに字句解析し、前記クラスごとに字句一覧を生成する有意味度側字句解析部を備え、
前記ＩＤＦ値計算部は、
前記有意味度側字句解析部が前記クラスごとに生成した前記字句一覧を用いて、前記字句解析部によって切り出された前記字句ごとのＩＤＦ値を計算し、
前記ＴＦ・ＩＤＦ値計算部は、
前記ＴＦ値計算部が計算した前記ＴＦ値と、前記ＩＤＦ値計算部が前記クラスごとの字句一覧を用いて計算した前記ＩＤＦ値とから、これらを乗じたＴＦ・ＩＤＦ値を計算し、計算した前記ＴＦ・ＩＤＦ値から前記ＴＦ・ＩＤＦ値に対応する前記字句の前記スコアを決定することを特徴とする請求項５または６のいずれかに記載の意味抽出装置。
【請求項８】
前記ＴＦ値計算部は、
前記ＴＦ値を計算する際に、前記プログラム静的解析部によって抽出された前記ネストの深さの最大値を用いて、前記ＴＦ値を計算することを特徴とする請求項５〜７のいずれかに記載の意味抽出装置。
【請求項９】
コンピュータを、
解析対象のソースプログラムに対する静的解析により、前記ソースプログラムの中の変数ごとに、前記ソースプログラムに記載された一つ以上の単語からなる単語列であって前記変数のとるべき値が影響を受ける単語列である複数の依存情報を抽出するプログラム静的解析部、
前記プログラム静的解析部によって抽出された前記単語列である前記複数の依存情報から、単語単位の字句を切り出す字句解析部、
前記字句解析部によって切り出された前記字句が前記字句の対応する前記変数の意味をどの程度表しているかを示す値であるスコアを、所定のスコア計算規則によって計算する有意味度計算部、
前記有意味度計算部によって計算された前記字句の前記スコアに基づいて複数の前記字句の中から予め設定された数の前記字句を選び、選んだ前記字句を所定の原語に変換する原語変換部、
として機能させるための意味抽出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置におけるプログラムの意味解析方法に関する。例えば、プログラム内の変数の意味を抽出する意味抽出装置に関する。
【背景技術】
【０００２】
プログラムの仕様書やコメントが無い環境下において、プログラム内の変数の意味を把握したいケースがある。例えば、他人が作成したプログラムを解析する場合、プログラム内の各変数の意味（用途）を知ることで、プログラムの動作が理解しやすくなる。本例以外にも、以下のようなケースで変数の意味を知るニーズがあると考える。
・開発時に、自分以外が作成したプログラムを理解する。
・複数のＤＢのカラム同士を連携する。
・プログラムのテスト時に変数に入力する値を決める。
・プログラムが重要なデータにアクセスする可能性があるかを判断する。
従来技術では、まずプログラムを字句解析（プログラムの文字の並びを、クラス名、メソッド名、メンバ名、変数名単位の文字列の並びに変換）し、プログラムを構成する字句を抽出する。字句は英語またはローマ字で記述されていることが多く、辞書を利用して字句を翻訳する。得られた情報を、変数にそのまま割り当てることで、プログラムの動作の理解を容易にする効果が期待されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００２−１１６９１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来技術では、得られた情報を変数にそのまま割り当てるだけであり、以下の理由から、説明情報としては不足する。
公開変数の命名規則については、開発・運用の観点から、人間に理解しやすい名前になるようベンダ内で一定の取り決めがされる。しかし、ローカル変数等の一時的な変数については、それほど厳格に命名規則が取り決められているわけではなく、その場限りの変数（ｈｏｇｅ，ｉ，ｔｍｐなど）が利用されることがあり、変数名からその変数を説明する情報を得ることは難しい。
またＪａｖａ（登録商標）などのバイトコードを解析するにあたり、バイトコードを逆コンパイルすることで、コンパイル前のソースコードの情報のいくつかが復元される。クラス名、メソッド名、メンバ名は復元されるが、ローカル変数名は復元されない。この場合においても、変数名からその変数を説明する情報を得ることは難しい。
ゆえに、従来技術（字句解析した後に日本語に翻訳した情報をそのまま変数に割り当てる）では、変数の意味を説明する情報として、人間が容易に理解可能な情報が得られない可能性がある。
【０００５】
この発明は、プログラムで使用される変数の意味を説明する使いやすい変数説明情報を作成する手段の提供を目的とする。
【課題を解決するための手段】
【０００６】
この発明の変数の意味を抽出する意味抽出装置は、
解析対象のソースプログラムに対する静的解析により、前記ソースプログラムの中の変数ごとに、前記ソースプログラムに記載された一つ以上の単語からなる単語列であって前記変数のとるべき値が影響を受ける単語列である複数の依存情報を抽出するプログラム静的解析部と、
前記プログラム静的解析部によって抽出された前記単語列である前記複数の依存情報から、単語単位の字句を切り出す字句解析部と、
前記字句解析部によって切り出された前記字句が前記字句の対応する前記変数の意味をどの程度表しているかを示す値であるスコアを、所定のスコア計算規則によって計算する有意味度計算部と、
前記有意味度計算部によって計算された前記字句の前記スコアに基づいて複数の前記字句の中から予め設定された数の前記字句を選び、選んだ前記字句を所定の原語に変換する原語変換部と
を備えたことを特徴とする。
【発明の効果】
【０００７】
この発明により、プログラムで使用される変数の意味を説明する使いやすい変数説明情報を作成する手段を提供できる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態１の変数の意味を抽出する意味抽出装置１００の構成図。
【図２】実施の形態１の意味抽出装置１００の動作を示すフローチャート。
【図３】実施の形態１で説明する疑似コード１．
【図４】図３の疑似コード１における変数ｓに対する依存情報を示す図。
【図５】実施の形態１で説明する疑似コード２．
【図６】実施の形態１の疑似コード３と疑似コード３に対応するコールグラフを示す図。
【図７】図４の依存情報から得られる名前一覧１２１を示す図。
【図８】図３の疑似コード１に対するコールグラフを示す図。
【図９】図７の名前一覧１２１を字句解析して得られる字句一覧１３１を示す図。
【図１０】図９の字句一覧１３１から得られる有意味度付き字句一覧１４１を示す図。
【図１１】図１０の有意味度付き字句一覧１４１から得られる変数ｓの変数説明情報一覧１５１を示す図。
【図１２】実施の形態１の字句の有意味度計算部１４０の構成を示す図。
【図１３】図１２の字句の有意味度計算部１４０の動作を示すフローチャート。
【図１４】実施の形態１の図９の字句一覧１３１から得られる有意味度付き字句一覧１４１を示す図。
【図１５】実施の形態２の意味抽出装置１００の外観の例を示す図。
【図１６】実施の形態２の意味抽出装置１００のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【０００９】
実施の形態１．
図１は本実施の形態１に係るプログラム内の変数の意味を抽出する装置（意味抽出装置１００）の構成図である。図１において、意味抽出装置１００は、プログラム入力部１１０、プログラム静的解析部１２０、字句解析部１３０、字句の有意味度を計算する字句の有意味度計算部１４０、日本語変換部１５０（原語変換部）及び解析結果出力部１６０を備えている。
【００１０】
意味抽出装置１００では、解析対象のプログラム２００をプログラム入力部１１０より取得する。取得したプログラム２００をプログラム静的解析部１２０にて静的解析し、名前一覧１２１を得る。取得した名前一覧１２１を字句解析部１３０にて字句解析し、字句一覧１３１を得る。取得した字句一覧１３１を字句の有意味度計算部１４０にて処理し、有意味度付き字句一覧１４１を得る。取得した有意味度付き字句一覧１４１を日本語変換部１５０及び言語コーパス１７０にて日本語に変換し変数説明情報一覧１５１を得る。変数説明情報一覧１５１を解析結果出力部１６０にて処理し解析結果１６１として出力する。
【００１１】
図２は意味抽出装置１００の処理フローである。図２を参照して意味抽出装置１００の処理フローを説明する。
（Ｓ２０１：プログラム入力部１１０）
まずステップＳ２０１において、プログラム入力部１１０は解析対象のプログラム２００を読み取る。プログラム２００はソースコードの形体で入力される。解析対象のプログラム２００がバイトコード（コンパイル済みのコード）の場合、既存のライブラリを利用してあらかじめソースコードに逆コンパイルしておく。
【００１２】
（Ｓ２０２：プログラム静的解析部１２０）
ステップＳ２０２は、プログラム静的解析部１２０が行う処理である。ステップＳ２０２において、プログラム静的解析部１２０は、読み込まれたプログラム２００のエントリポイント（プログラムの開始点）からプログラムの最後までのデータフローを解析し、プログラム内の変数毎の依存関係を抽出し、当該変数の依存情報を含む名前一覧１２１を得る。図４は、図３の擬似コード１における変数ｓ（ｍａｉｎ関数中の１２行目）に対する依存情報の例を示す図である。図４は、変数ｓの依存関係上に現れる識別子（依存情報）と、依存情報の種類及びメソッドのネストの深さを含む。依存情報の種類がメソッド以外の場合は、ネストの深さはφとする。
【００１３】
（依存関係）
ここで依存関係について簡単に述べておく。
「αがβに依存している」とは「αの値がβの値に影響を受けている」ことを言う。
本明細書で扱う依存関係とは、大きく分けて２種類ある。以下２種類の依存関係（後述の明示的な依存関係及び暗黙的な依存関係）のそれぞれについて具体的に説明する。
【００１４】
（１．明示的な依存関係）
例えば図５の擬似コード２の４行目において、変数ｄには変数ａの値が代入されており、「変数ｄは変数ａに影響を受けている」ことがわかる。この代入関係による依存関係を明示的な依存関係と呼ぶ。つまり変数ｄは変数ａに影響を受けており、
よって、変数ｄは変数ａに依存している。
（２．暗黙的な依存関係）
一方、７、９行目の代入文は６行目の変数ｂの値に応じて実行されるか否かが決定する。すなわち７、９行目の変数ｃの値は６行目のｂの値に影響を受けていることがわかる。この関係のことを暗黙的な依存関係と呼ぶ。プログラム静的解析部１２０では両方の依存関係を追跡し記録していく。なお、明示的な依存関係には、メソッド呼出の返却値とそれが格納される変数との関係、メソッド呼出の実引数と仮引数との関係も含む。暗黙的な依存関係には、オブジェクトから呼ばれるメソッドと呼出元のオブジェクトとの関係も含む。
【００１５】
プログラム静的解析部１２０は、プログラム上の変数ごとに依存関係を追跡していき、依存関係として現れる識別子（クラス名、メソッド名、メンバ名及び変数名）を、その変数の依存情報として記録する。関係として現れる識別子の種類がメソッドの場合、当該メソッドから呼出されるメソッドのネスト（入れ子）の深さ（最大値）も記録する。ネストの深さは、静的解析の際に入力されたプログラム２００のコールグラフを作成することで求める。コールグラフ上で、対象とするメソッドを表すノードから連続して何ノードを辿ることができるかを計り、それをネストの深さとする。コールグラフは既存のアルゴリズムを用いて作成する。関数の再帰については、自ノードからグラフを辿り次に自ノードが現れるまでに辿ったノードの最小数をネストの深さとする。図６にメソッド呼出の部分のみ記載した擬似コード３と対応するコールグラフを示す。図６において、メソッドＡ、メソッドＢ、メソッドＣのネストの深さはそれぞれ３、２、１となる。
【００１６】
得られた依存情報（クラス，メソッド，メンバ及び変数）が名前一覧１２１として記録される。ただし、一般的なライブラリに含まれるクラス名やメソッド名などの予約語やリテラルは、名前一覧１２１に含めないよう適宜除外する。プログラム静的解析部１２０は、この作業を、プログラム内の全ての変数に対して実施する。すなわち名前一覧１２１は変数ごと用意される。
【００１７】
図４から破線で囲んだｎｏ．１〜３、ｎｏ．８、ｎｏ．１０及びｎｏ．１３のエントリを除いたものが、図７の変数ｓの名前一覧１２１になる。メソッドに対してのみネストの深さが記録される。図８に擬似コード１に対応するコールグラフを示す。解析時間やメモリの使用量を抑えるために、依存情報から名前一覧１２１に抽出する情報の種類（例、クラス名のみ，メソッド名のみ，メンバ名のみ，それらの組み合わせ）を制限することも可能である。
【００１８】
以上の説明のように、「依存情報」とは、プログラム２００（ソースプログラム）に記載された一つ以上の単語からなる単語列であって変数のとるべき値が影響を受ける単語列である。
【００１９】
（Ｓ２０３：字句解析部１３０）
次にステップＳ２０３において、字句解析部１３０は、変数毎の名前一覧１２１の各依存情報を字句解析し、字句一覧１３１を得る。図９は図７の名前一覧１２１を字句解析して得られる字句一覧１３１を示す。一般的に字句解析とは、プログラムのソースコードを構成する文字の並びを、変数名、関数名などを表現するトークン（プログラムにおける最小単位の文字列）の並びに変換することを言う。例えば、「ｇｅｔＬｅｎｇｔｈ（Ｓｔｒｉｎｇ  ｎａｍｅ））を字句解析し、字句をカンマで区切って並べると、「ｇｅＬｅｎｇｔｈ，（，Ｓｔｒｉｎｇ，ｎａｍｅ，）」となる。ただし本実施の形態においての字句解析では、プログラムにおける最小単位の文字列よりも更に小さな単位の文字列の並びに変換する（切り出す）。例えば、「ｇｅｔＬｅｎｇｔｈ」を字句解析し、カンマで区切って並べると「ｇｅｔ，Ｌｅｎｇｔｈ」となる。これは、自然言語でいう単語の単位にまで文字列を分解することに相当する。分解の方法は字句を「−（ハイフン），＿（アンダーバー）」などの記号を基準に切り出したり、アルファベットの小文字から大文字に変化する場所（ｇｅｔＬｅｎｇｔｈの例における「ｔ」，「Ｌ」）を基準に切り出したりすることが考えられる。また、英単語やローマ字に関する辞書を利用しても良い。この作業を、プログラム内の全ての変数に対して実施する。すなわち字句一覧１３１は変数ごと用意される。
【００２０】
なお、図９の３行目の「Ｋａｉｉｎ」は、図７のＮＯ２（２行目）の「Ｋａｉｉｎ」であり、つまり、字句解析部１３０は、図９の３行目の「Ｋａｉｉｎ」をそのまま図７のＮＯ２（２行目）の「Ｋａｉｉｎ」としている。このような場合も、「Ｋａｉｉｎ」（図７）を「Ｋａｉｉｎ」（図９）に切り出したと呼ぶこととする。
【００２１】
（Ｓ２０４：字句の有意味度計算部１４０）
次にステップＳ２０４において、字句の有意味度計算部１４０は、各変数が持つ字句一覧１３１の各字句に対して有意味度を所定のスコア計算規則に従って計算し、有意味度付き字句一覧１４１を作成する。ここで「所定のスコア計算規則」とは、図１２の説明で後述するＴＦ値とＩＤＦ値とからＴＦ・ＩＤＦ値（スコア）を生成する処理の規則である。
図１０は、図９の字句一覧１３１から得られる有意味度付き字句一覧１４１の例を示す図である。ここで有意味度とは、各変数が持つ字句一覧１３１の字句が、その変数の意味をどの程度表現しているかを示すスコアである。字句の有意味度計算部１４０は、字句とスコアを対応づけた、有意味度付き字句一覧１４１を作成する。この作業を、字句の有意味度計算部１４０はプログラム内の全ての変数に対して実施する。すなわち有意味度付き字句一覧１４１は変数ごと用意される。
【００２２】
スコア（有意味度）の計算には、自然言語の分野で利用されているＴＦ・ＩＤＦの考えをプログラム言語に適用する。ＴＦ・ＩＤＦとは、文書中に現れる各単語の当該文書中及び一般文書中における出現頻度を元に計算したスコアから、当該文書（自然言語）の意味をよく表す特徴的な単語を、抽出するアルゴリズムである。ＴＦ（Ｔｅｒｍ  Ｆｒｅｑｕｅｎｃｙ）はある文書中内でのある単語ｔの頻度を表す。ＩＤＦ（Ｉｎｖｅｒｔｅｄ  Ｄｏｃｕｍｅｎｔ  Ｆｒｅｑｕｅｎｃｙ）は、Ｎ個の文書のうち、ある単語ｔを含んだ文書の数をＤＦ（ｔ）としたときの、相対文書頻度（ＤＦ（ｔ）／Ｎ））の逆数の対数である。一文書中に同じ単語が多く出現すれば、ＴＦ・ＩＤＦ（ＴＦ値とＩＤＦ値の積）は大きくなる。また、多くの文書に同じ単語が出現すれば、ＴＦ・ＩＤＦは小さくなる。すなわち、ＴＦ・ＩＤＦをプログラム言語にあてはめた場合、大まかに言ってしまえば、ＴＦは「変数が依存する情報（字句一覧）における字句の頻度」を、一方ＩＤＦ値は「プログラム全体における字句の頻度」を表す。
【００２３】
ただし、ＴＦ・ＩＤＦを単純にプログラム言語にあてはめても、「変数の意味をよく表す特徴的な字句（単語）を抽出する」という期待する効果を得ることはできないと考える。なぜならＴＦ・ＩＤＦでは、文書の表面的な情報、すなわち、単語の出現頻度のみしか考慮していないためである。プログラム言語は自然言語とは異なり、メソッドの呼出し関係（ネストの深さ等）があり、メソッド呼出しの階層が深くなればなるほど（そのメソッドからのネストの深さが少ないほど）、メソッド（名）が表現する情報は具体化されていくと考えられる。
【００２４】
例えば図３の擬似コード１における、ｇｅｔＦｏｒｍＩｎｐｕｔメソッドとその中で呼出されるｓｅｔＳｅｉｂｅｔｓｕメソッド（ｇｅｔＦｏｒｍＩｎｐｕｔメソッドよりも１つ階層が深い）を比べると、変数ｓを説明する情報としては明らかにｓｅｔＳｅｉｂｅｔｓｕメソッドの方がより具体的な情報を有していると考えられる。メソッドの呼出関係、特にネストの深さも考慮してＴＦ・ＩＤＦを計算することが、本実施の形態の意味抽出装置１００のポイントである。本実施の形態におけるＴＦとＩＤＦの求め方については、字句の有意味度計算部１４０の処理フローで詳細に説明する。
【００２５】
（Ｓ２０５：日本語変換部１５０）
次にステップＳ２０５において、日本語変換部１５０は、有意味度付き字句一覧１４１の中でスコアの高い字句から順にｋ個の字句を選択し、日本語による変数説明情報一覧１５１を作成する。図１０の有意味度付き字句一覧１４１から得られる変数説明情報一覧１５１の例を図１１に示す。ｋはパラメータであり、必要に応じて変更可能である。ｋ個の字句を言語コーパス（検索エンジン）１７０に入力し検索を実行する。得られた結果のうち、ヒットした情報（マッチした文字列そのものや、周りの文字列）を変数説明情報一覧１５１に記録する。この作業を、プログラム内の全ての変数に対して実施する。すなわち変数説明情報一覧１５１は変数ごと用意される。なお日本語に変化するのは一例であり、どのような原語に変化するかは、要求に応じて決定することができるものとする。
【００２６】
（解析結果出力部１６０）
最後に、解析結果出力部１６０では、指定された変数に対して、日本語変換部１５０で得られた変数説明情報一覧１５１を解析結果１６１として出力する。
【００２７】
（字句の有意味度計算部１４０の構成）
次に、本実施の形態のポイントとなる、字句の有意味度計算部１４０の構成を述べる。
図１２は字句の有意味度計算部１４０の構成図である。図１３は字句の有意味度計算部１４０の処理フローである。図１２において、字句の有意味度計算部１４０は、ＴＦ値計算部１４１０、有意味度側字句解析部１４２０、ＩＤＦ値計算部１４３０、ＴＦ・ＩＤＦ値計算部１４４０から構成されている。
（１）字句の有意味度計算部１４０では、ＴＦ値計算部１４１０が、字句解析部１３０によって作成された変数ごとの字句一覧１３１を用いて、変数ごとに字句のＴＦ値１４１１を求める。
（２）さらに、有意味度側字句解析部１４２０が、プログラム２００を字句解析（自然言語でいう単語の単位にまで文字列を分解）し、プログラム２００全体の字句一覧１４２１及びクラス単位の字句一覧１４２２を取得する。
（３）ＩＤＦ値計算部１４３０は、３種類の字句一覧（変数ごとの字句一覧１３１、プログラム全体の字句一覧１４２１、クラス単位の字句一覧１４２２）から、３種類のＩＤＦ値１４３１を計算する。３種類のＩＤＦ値を計算する目的は、計算負荷と解析精度との兼ね合いより、ユーザが適切と判断するＩＤＦ値を選択できるようにするためである。これら３種類のＩＤＦ値以外にも適宜追加できるようにする。
（４）ＴＦ・ＩＤＦ値計算部１４４０では、ＴＦ値１４１１及びＩＤＦ値１４３１から、ＴＦ・ＩＤＦ値１４４１を計算する。得られたＴＦ・ＩＤＦ値を、有意味度付き字句一覧１４１として変数ごと記録する。
【００２８】
字句の有意味度計算部１４０の処理フローを、図１３のフローチャートを用いて説明する。
【００２９】
（Ｓ４０１：ＴＦ値計算部１４１０）
まずステップＳ４０１において、ＴＦ値計算部１４１０では、入力された変数ごとの字句一覧からＴＦ値１４１１を計算する。ＴＦ値の計算方法は以下の通りである。
【００３０】
字句一覧１３１より、ネストの深さの最大値Ｄを求める。図９の例では最大値Ｄは１となる。次に以下の式を計算する。ｄはあるメソッドのネストの深さ、αとβは係数であり、必要に応じて調整可能である。
【００３１】
字句一覧１３１に対し以下を計算する。
字句一覧１３１のエントリの集合をＥ、各エントリをｅ（ｅ∈Ｅ）、エントリ内の字句をｔ（ｅ）、エントリの種類をｋ（ｅ）、と表現する。
ＴＦ（ｘ）＝Σｔｆ（ｅ）  ｛ｅ∈Ｅ∧ｔ（ｅ）＝ｘ｝
ただし、
ｔｆ（ｅ）＝α（Ｄ−ｄ＋１）／（Ｄ＋１）・・・ｉｆ  ｋ（ｅ）＝メソッド
ｔｆ（ｅ）＝β              ・・・ｏｔｈｅｒｗｉｓｅ  ｋ（ｅ）≠メソッド
図９の字句“Ｓｅｉｂｅｔｓｕ”及び“Ｆｏｒｍ”を例に、計算方法を説明する。
ここでα＝２、β＝１、Ｄ＝１とする。
まず、
ｔ（ｅ）＝“Ｓｅｉｂｅｔｓｕ”  ｛ｅ∈Ｅ｝となるエントリに注目する（ｘ＝“Ｓｅｉｂｅｔｓｕ”）。
図９には、
ｔ（ｅ）＝“Ｓｅｉｂｅｔｓｕ”∧ｋ（ｅ）＝“メンバ”｛ｅ∈Ｅ｝
となるエントリが１つある。このエントリは、
ｔｆ（ｅ）＝１である。
また、
ｔ（ｅ）＝“Ｓｅｉｂｅｔｓｕ”∧ｋ（ｅ）＝“メソッド”｛ｅ∈Ｅ｝
となるエントリが２つあり（“Ｋａｉｉｎ．ｓｅｔＳｅｉｂｅｔｓｕ”及び“Ｋａｉｉｎ．ｇｅｔＳｅｉｂｅｔｓｕ”）、それぞれのエントリは
ｔｆ（ｅ）＝２である。
全てのｔｆ（ｅ）｛ｔ（ｅ）＝“Ｓｅｉｂｅｔｓｕ”｝を足し合わせると、
ＴＦ（“Ｓｅｉｂｅｔｓｕ”）＝１＋２＋２＝５となる。
同様にして、
ｔ（ｅ）＝“Ｆｏｒｍ”｛ｅ∈Ｅ｝
となるエントリに注目する（ｘ＝“Ｆｏｒｍ”）。
図９には、
ｔ（ｅ）＝“Ｆｏｒｍ”∧ｋ（ｅ）＝“メソッド”｛ｅ∈Ｅ｝
となるエントリが１つあり（“ｇｅｔＦｏｒｍＩｎｐｕｔ”）、
ｔｆ（ｅ）＝１である。
全てのｔｆ（ｅ）｛ｔ（ｅ）＝“Ｆｏｒｍ”｝
を足し合わせると、ＴＦ（“Ｆｏｒｍ”）＝１となる。
図９のＴＦ値を全て計算したものが図１４になる。
【００３２】
（Ｓ４０２：有意味度側字句解析部１４２０）
次にステップＳ４０２において、有意味度側字句解析部１４２０では、入力されたプログラム２００を字句解析する。ここでいう字句解析は、プログラム全体を解析し、プログラムを構成する文字の並びから、自然言語でいう単語の単位にあたる文字列の並びに変換することである。同時にクラス単位での字句解析も行う。プログラム全体の字句一覧１４２１及びクラス単位の字句一覧１４２２を得る。プログラム全体の字句一覧１４２１は１つ、クラス単位の字句一覧１４２２はプログラムを構成するクラスの数だけ作られる。
【００３３】
（Ｓ４０３：ＩＤＦ値計算部１４３０）
次にステップＳ４０３において、ＩＤＦ値計算部１４３０では、入力される３種類の字句一覧（変数ごとの字句一覧１３１、プログラム全体の字句一覧１４２１、クラス単位の字句一覧１４２２）を用いて、３種類のＩＤＦ値１４３１を計算する。３種類（ＩＤＦ１〜ＩＤＦ３）のＩＤＦ値の計算方法は以下の通りである。３種類のＩＤＦ値を計算する目的は、計算負荷と解析精度との兼ね合いより、ユーザが適切と判断するＩＤＦ値を選択できるようにするためである（実運用では、３種類のＩＤＦ値のどれかが利用される）。
【００３４】
（ＩＤＦ１）
本方法では、プログラム全体の字句一覧１４２１内の、スコア計算の対象のそれぞれの「字句ｔ」の頻度を求め、係数ｋ１を乗じたものをＤＦ１（ｔ）とする。係数ｋ１は必要に応じて調整可能である。ＤＦ１（ｔ）の逆数をＩＤＦ１（ｔ）と定義する。プログラム全体で、よく現れる字句に対してＩＤＦ１は小さな値をとることになる。
【００３５】
（ＩＤＦ２）
本方法では、クラス単位の字句一覧１４２２を１つの文書とみなす。プログラムを構成する全クラス（クラスの数をＮとする）の文書うち、スコア計算の対象のそれぞれの「字句ｔ」を含む文書の数を、ＤＦ２（ｔ）とする。ＩＤＦ２（ｔ）は自然言語におけるＴＦ・ＩＤＦと同じように、
ｌｏｇ１０（ｋ２・Ｎ／ＤＦ２（ｔ））
として定義する。係数ｋ２は必要に応じて調整可能である。これをＩＤＦ２（ｔ）とする。プログラムを構成する各クラスで共通してよく現れる字句に対して、ＩＤＦ２が小さな値になる。
【００３６】
（ＩＤＦ３）
本方法では、プログラム内の変数ごとの字句一覧１３１を文書１つとして考える。全変数（変数の数をＮとする）の文書うち、スコア計算の対象のそれぞれの「字句ｔ」を含む文書の数を、ＤＦ３（ｔ）とする。ＩＤＦ３（ｔ）は自然言語におけるＴＦ・ＩＤＦと同じように、
ｌｏｇ１０（ｋ３・Ｎ／ＤＦ３（ｔ））
として定義する。係数ｋ３は必要に応じて調整可能である。これをＩＤＦ３（ｔ）とする。プログラム内の各変数が依存する情報に共通してよく現れる字句に対して、ＩＤＦ３が小さな値になる。
【００３７】
（Ｓ４０４：ＴＦ・ＩＤＦ値計算部１４４０）
次にステップＳ４０４において、ＴＦ・ＩＤＦ値計算部１４４０では、字句ごと得られたＴＦ値１４１１とＩＤＦ値１４３１をそれぞれ乗じることで、ＴＦ・ＩＤＦ値１４４１を計算し、スコアを決定する。このＴＦ・ＩＤＦ値１４４１がスコアである。ＩＤＦ値の計算方法が３種類あるため、ＴＦ・ＩＤＦ値も３種類得られる。ＴＦ・ＩＤＦ値計算部１４４０は、計算した前記ＴＦ・ＩＤＦ値から前記ＴＦ・ＩＤＦ値に対応する前記字句の前記スコアを決定する。以上が字句の有意味度計算部１４０の説明である。
【００３８】
以上のように、入力されたプログラムの中を静的解析し、ある変数に対して得られた依存関係を遡っていき、そこに現れる名前を抽出し、有意味な字句を抽出し、コーパスによって日本語化することで、当該変数そのものの意味を、人間がわかりやすい形式で説明する情報が得られる、という効果がある。
【００３９】
実施の形態２．
図１５、図１６を参照して実施の形態２を説明する。実施の形態２は、コンピュータである意味抽出装置１００のハードウェア構成を説明する。
図１５は、コンピュータである意味抽出装置１００の外観の一例を示す図である。
図１６は、意味抽出装置１００のハードウェア資源の一例を示す図である。
【００４０】
外観を示す図１５において、意味抽出装置１００は、システムユニット８３０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶）の表示画面を有する表示装置８１３、キーボード８１４（Ｋｅｙ・Ｂｏａｒｄ：Ｋ／Ｂ）、マウス８１５、コンパクトディスク装置８１８（ＣＤＤ：Ｃｏｍｐａｃｔ  Ｄｉｓｋ  Ｄｒｉｖｅ）などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。システムユニット８３０はネットワークに接続している。
【００４１】
またハードウェア資源を示す図１６において、意味抽出装置１００は、プログラムを実行するＣＰＵ８１０（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を備えている。ＣＰＵ８１０は、バス８２５を介してＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）８１１、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）８１２、表示装置８１３、キーボード８１４、マウス８１５、通信ボード８１６、ＣＤＤ８１８、磁気ディスク装置８２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置８２０の代わりに、光ディスク装置、フラッシュメモリなどの記憶装置でもよい。
【００４２】
ＲＡＭ８１２は、揮発性メモリの一例である。ＲＯＭ８１１、ＣＤＤ８１８、磁気ディスク装置８２０等の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部、格納部、バッファの一例である。通信ボード８１６、キーボード８１４などは、入力部、入力装置の一例である。また、通信ボード８１６、表示装置８１３などは、出力部、出力装置の一例である。通信ボード８１６は、ネットワークに接続されている。
【００４３】
磁気ディスク装置８２０には、オペレーティングシステム８２１（ＯＳ）、ウィンドウシステム８２２、プログラム群８２３、ファイル群８２４が記憶されている。プログラム群８２３のプログラムは、ＣＰＵ８１０、オペレーティングシステム８２１、ウィンドウシステム８２２により実行される。
【００４４】
上記プログラム群８２３には、以上の実施の形態の説明において「〜部」として説明した機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ８１０により読み出され実行される。
【００４５】
ファイル群８２４には、以上の実施の形態１の説明において、「名前一覧１２１」、「字句一覧１３１」、「有意味度付き字句一覧１４１」、「変数説明情報一覧１５１」、「解析結果１６１」や、「〜の判定結果」、「〜の算出結果」、「〜の抽出結果」、「〜の生成結果」、「〜の処理結果」として説明した情報や、データや信号値や変数値やパラメータなどが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ８１０によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのＣＰＵの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【００４６】
また、以上に述べた実施の形態１の説明において、データや信号値は、ＲＡＭ８１２のメモリ、ＣＤＤ８１８のコンパクトディスク、磁気ディスク装置８２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｋ）等の記録媒体に記録される。また、データや信号は、バス８２５や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００４７】
また、以上の実施の形態１の説明において、「〜部」として説明したものは、「〜手段」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明したものは、ソフトウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ８１０により読み出され、ＣＰＵ８１０により実行される。すなわち、プログラムは、以上に述べた「〜部」としてコンピュータを機能させるものである。あるいは、以上に述べた「〜部」の手順や方法をコンピュータに実行させるものである。
【００４８】
以上の実施の形態１では、装置としての意味抽出装置１００を説明したが、実施の形態１の意味抽出装置１００の各構成要素（「〜部」）の動作は、意味抽出プログラムとしても把握できることは以上の説明から当然である。また、実施の形態１の意味抽出装置１００の各構成要素（「〜部」）の動作は、意味抽出方法として把握できることも明らかである。
【００４９】
以上の実施の形態１では以下を特徴とする意味抽出装置１００を説明した。
【００５０】
入力された解析対象のプログラムの中の変数に対して、静的解析により依存情報（クラス名、メソッド名、メンバ名、変数名）を抽出するプログラム静的解析部と、依存情報から単語単位の字句を切り出す字句解析部と、切り出された字句のスコア（変数の意味をどの程度表しているのかを示す値）を計算する有意味度計算部と、スコアから各変数の意味をよく表している字句を選び、それを日本語に変換する日本語変換部とを備える意味抽出装置。
【００５１】
前記プログラム静的解析部は変数の依存情報（クラス名、メソッド名、メンバ名、変数名）をプログラムのデータフロー上から抽出する意味抽出装置。
【００５２】
前記字句解析部は、変数の依存情報を字句解析し単語単位の文字列情報（字句一覧）を切り出し、変数の説明情報に用いる意味抽出装置。
【００５３】
前記有意味度計算部は、変数の依存情報から得られた字句一覧の中から、当該変数の意味を良く表す字句を規定の数だけ抽出し、変数の説明情報に用いる意味抽出装置。
【００５４】
前記日本語変換部は、規定の数だけ抽出された字句（ローマ字や英語）を、コーパス（検索エンジンの日本語検索）でそれぞれ検索し、得られた結果を、変数の説明情報に用いる意味抽出装置。
【００５５】
前記日本語変換部は、規定の数だけ抽出された字句（ローマ字や英語）を組み合わせて、コーパス（検索エンジンの日本語検索）で検索し、得られた結果を、変数の説明情報に用いる意味抽出装置。
【００５６】
前記有意味度計算部は、ＴＦ値（変数が依存する情報（字句一覧）における字句の頻度）とＩＤＦ値（プログラム全体における字句の頻度）を計算し、有意味度（ＴＦ・ＩＤＦ値）を計算し、変数の説明情報に用いる意味抽出装置。
【００５７】
前記プログラム静的解析部はプログラム内のメソッドの呼出関係（コールグラフ）を作成しメソッドのネストの深さ（メソッド呼出の深さ）を求め、前記有意味度計算部は各メソッドのネストの深さを考慮して有意味度を計算する意味抽出装置。
【符号の説明】
【００５８】
１００  意味抽出装置、１１０  プログラム入力部、１２０  プログラム静的解析部、１２１  名前一覧、１３０  字句解析部、１３１  字句一覧、１４０  字句の有意味度計算部、１４１  有意味度付き字句一覧、１５０  日本語変換部、１５１  変数説明情報一覧、１６０  解析結果出力部、１７０  言語コーパス、２００  プログラム、１４１０  ＴＦ値計算部、１４１１  ＴＦ値、１４２０  有意味度側字句解析部、１４２１  プログラム全体の字句一覧、１４２２  クラス単位の字句一覧、１４３０  ＩＤＦ値計算部、１４３１  ＩＤＦ値、１４４０  ＴＦ・ＩＤＦ値計算部、１４４１  ＴＦ・ＩＤＦ値。
【図１】
2014016686.tif 000003
【図２】
2014016686.tif 000004
【図３】
2014016686.tif 000005
【図４】
2014016686.tif 000006
【図５】
2014016686.tif 000007
【図６】
2014016686.tif 000008
【図７】
2014016686.tif 000009
【図８】
2014016686.tif 000010
【図９】
2014016686.tif 000011
【図１０】
2014016686.tif 000012
【図１１】
2014016686.tif 000013
【図１２】
2014016686.tif 000014
【図１３】
2014016686.tif 000015
【図１４】
2014016686.tif 000016
【図１５】
2014016686.tif 000017
【図１６】
2014016686.tif 000018