(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023164020
(43)【公開日】2023-11-10
(54)【発明の名称】ソースコード判定モデル作成装置、ソースコード判定装置、ソースコード判定モデル作成方法、及びソースコード判定方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20231102BHJP
G06F 8/75 20180101ALI20231102BHJP
G06F 16/383 20190101ALI20231102BHJP
G06F 8/77 20180101ALI20231102BHJP
G06N 20/00 20190101ALI20231102BHJP
【FI】
G06F11/36 116
G06F8/75
G06F16/383
G06F8/77
G06N20/00 130
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2022075314
(22)【出願日】2022-04-28
(71)【出願人】
【識別番号】000005108
【氏名又は名称】株式会社日立製作所
(74)【代理人】
【識別番号】110000176
【氏名又は名称】弁理士法人一色国際特許事務所
(72)【発明者】
【氏名】小山 恭平
(72)【発明者】
【氏名】新原 敦介
(72)【発明者】
【氏名】佐藤 直人
【テーマコード(参考)】
5B042
5B175
5B376
【Fターム(参考)】
5B042HH08
5B042HH10
5B042JJ30
5B042KK15
5B175DA01
5B376BC31
5B376BC36
5B376BC38
(57)【要約】 (修正有)
【課題】互いに入出力関係にある複数の関数を有するソースコードに対する判定を行う学習済みモデルを効率よく作成するソースコード判定モデル作成装置、ソースコード判定装置、ソースコード判定モデル作成方法及びソースコード判定方法を提供する。
【解決手段】ソースコード判定システム1において、ソースコード判定モデル作成装置10は、ソースコードを記憶する記憶装置及びソースコードから、第1の関数の記述部分及び第1の関数を呼び出している第2の関数の記述部分を抽出し、第1の関数の記述部分のベクトルデータである文字列特徴ベクトルを作成し、第2の関数の記述部分に基づき、第2の関数から第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルを作成し、文字列特徴ベクトル及び入力特徴ベクトルと、第1の関数及び第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを作成する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
ソースコードを記憶する記憶装置、及び、
前記ソースコードから、第1の関数の記述部分及び前記第1の関数を呼び出している第2の関数の記述部分を抽出し、
前記第1の関数の記述部分のベクトルデータである文字列特徴ベクトルを作成し、
前記第2の関数の記述部分に基づき、前記第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルを作成し、
前記文字列特徴ベクトル及び前記入力特徴ベクトルと、前記第1の関数及び前記第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを作成する処理装置
を備える、ソースコード判定モデル作成装置。
【請求項2】
前記処理装置は、
前記第1の関数の記述部分を複数のトークンに変換し、変換した各前記トークンと、前記トークンに対応付けられる重み値とに基づき各前記トークン間の関連度を算出し、算出した各前記関連度に基づき前記文字列特徴ベクトルを作成し、
前記学習済みモデルを作成する際に、前記重み値を決定する、
請求項1に記載のソースコード判定モデル作成装置。
【請求項3】
前記処理装置は、
前記第2の関数の記述部分に基づき、前記第2の関数が前記第1の関数を呼び出す際の引数の情報を含む文字列データである入力情報を作成し、作成した入力情報をベクトルデータに変換することにより、前記入力特徴ベクトルを作成する、
請求項1に記載のソースコード判定モデル作成装置。
【請求項4】
前記処理装置は、
前記第1の関数の記述部分を複数のトークンに変換し、変換した各前記トークンと、前記トークンに対応付けられる重み値とに基づき各前記トークン間の関連度を算出し、算出した各前記関連度に基づき前記文字列特徴ベクトルを作成し、
前記第2の関数の記述部分に基づき、前記第2の関数が前記第1の関数を呼び出す際の引数の情報を含む文字列データである入力情報を作成し、作成した入力情報をベクトルデータに変換することにより、前記入力特徴ベクトルを作成し、
前記作成した文字列特徴ベクトル及び前記作成した入力特徴ベクトルを合成したベクトルデータである分類特徴ベクトルを作成し、
前記作成した分類特徴ベクトルと、前記判定値との関係を記憶した前記学習済みモデルを作成し、
前記学習済みモデルを作成する際に、前記重み値を決定する、
請求項1に記載のソースコード判定モデル作成装置。
【請求項5】
前記処理装置は、
前記第2の関数内における処理経路を探索し、探索した処理経路を特定する条件分岐を示す文字列と、当該処理経路による処理の実行により前記第2の関数が前記第1の関数を呼び出す際の引数の名称及び当該引数の値を示す文字列とを含む文字列データである前記入力情報を作成し、作成した前記入力情報をベクトルデータに変換することにより、前記入力特徴ベクトルを作成する、
請求項3に記載のソースコード判定モデル作成装置。
【請求項6】
ソースコードにおける第1の関数の記述部分のベクトルデータである文字列特徴ベクトル及び、前記第1の関数を呼び出している第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルと、前記第1の関数及び前記第2の
関数が行う処理に対する判定値との関係を記憶した学習済みモデルを記憶する記憶装置、及び、
ソースコードの入力を受け付け、
入力された前記ソースコードから、第3の関数の記述部分及び前記第3の関数を呼び出している第4の関数の記述部分を抽出し、
前記第3の関数の記述部分のベクトルデータである第2文字列特徴ベクトルを作成し、
前記第4の関数の記述部分に基づき、前記第4の関数から前記第3の関数への入力データの内容を示すベクトルデータである第2入力特徴ベクトルを作成し、
前記学習済みモデルに、前記作成した第2文字列特徴ベクトル及び第2入力特徴ベクトルを入力することで、前記第3の関数及び前記第4の関数が行う処理に対する判定値を出力する処理装置
を備える、ソースコード判定装置。
【請求項7】
情報処理装置が、
ソースコードを記憶し、
前記ソースコードから、第1の関数の記述部分及び前記第1の関数を呼び出している第2の関数の記述部分を抽出し、
前記第1の関数の記述部分のベクトルデータである文字列特徴ベクトルを作成し、
前記第2の関数の記述部分に基づき、前記第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルを作成し、
前記文字列特徴ベクトル及び前記入力特徴ベクトルと、前記第1の関数及び前記第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを作成する、
ソースコード判定モデル作成方法。
【請求項8】
情報処理装置が、
ソースコードにおける第1の関数の記述部分のベクトルデータである文字列特徴ベクトル及び、前記第1の関数を呼び出している第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルと、前記第1の関数及び前記第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを記憶し、
ソースコードの入力を受け付け、
入力された前記ソースコードから、第3の関数の記述部分及び前記第3の関数を呼び出している第4の関数の記述部分を抽出し、
前記第3の関数の記述部分のベクトルデータである第2文字列特徴ベクトルを作成し、
前記第4の関数の記述部分に基づき、前記第4の関数から前記第3の関数への入力データの内容を示すベクトルデータである第2入力特徴ベクトルを作成し、
前記学習済みモデルに、前記作成した第2文字列特徴ベクトル及び第2入力特徴ベクトルを入力することで、前記第3の関数及び前記第4の関数が行う処理に対する判定値を出力する、
ソースコード判定方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソースコード判定モデル作成装置、ソースコード判定装置、ソースコード判定モデル作成方法、及びソースコード判定方法に関する。
【背景技術】
【0002】
プログラムのソースコードは近年大型化、複雑化しており、開発者による、ソースコードのバグの検知や性能遅延の原因の特定はより難しくなっている。
【0003】
プログラムの解析を行う技術として、特許文献1には、階層化されたプログラムコードを既定の分割条件に従って複数のプログラム要素に分割し、複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、複数のプログラム要素における階層とを抽出する解析部と、解析部により抽出された各プログラム要素の属性と複数のプログラム要素における階層とに基づいて機械学習を行って、複数のプログラム要素を複数のグループにグルーピングするグルーピング部とを有する情報処理装置が記載されている。
【0004】
ここで、ソースコードに対する自然言語処理を自動的に行わせることで、プログラムの解析をより効率よく行うことが提案されている。例えば、非特許文献1には、自然言語処理が可能な機械学習の手法であるBERT(Bidirectional Encoder Representations from Transformers)を用いた文章解析技術が開示されており、具体的には、ドキュメントを固
定長で分割し、分割したデータをBERTにより特徴ベクトル化し、それらの特徴ベクトルを1つのベクトルに合成することが開示されている。
【先行技術文献】
【特許文献】
【0005】
【非特許文献】
【0006】
【非特許文献1】Raghavendra Pappagari, Piotr Zelasko, Jesus Villalba, Yishay Carmiel, Najim Dehak、"Hierarchical Transformers for Long Document Classification"、2019 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU)、2019、[online]、[令和4年(2022年)4月14日検索]、インターネット(URL: https://ieeexplore.ieee.org/document/9003958)
【発明の概要】
【発明が解決しようとする課題】
【0007】
ソースコードのバグや性能遅延は、複数の要因が絡み合って起きることが多い。特に、ソースコードの複数間の関数の依存関係(データの入出力)がそれらの大きな原因となりうる。しかしながら、上記の各文献では、そのような入出力関係を充分に考慮することができず、もしくはそれらの処理に大きな処理負荷がかかる。
【0008】
本発明は、このような事情に鑑みてなされたものであり、その目的は、互いに入出力関係にある複数の関数を有するソースコードに対する判定を行う学習済みモデルを効率よく作成することが可能なソースコード判定モデル作成装置、ソースコード判定装置、ソースコード判定モデル作成方法、及びソースコード判定方法を提供することを目的とする。
【課題を解決するための手段】
【0009】
上記課題を解決するための本発明の一つは、ソースコードを記憶する記憶装置、及び、前記ソースコードから、第1の関数の記述部分及び前記第1の関数を呼び出している第2の関数の記述部分を抽出し、前記第1の関数の記述部分のベクトルデータである文字列特徴ベクトルを作成し、前記第2の関数の記述部分に基づき、前記第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルを作成し、前記文字列特徴ベクトル及び前記入力特徴ベクトルと、前記第1の関数及び前記第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを作成する処理装置を備える、ソースコード判定モデル作成装置、である。
【0010】
また、上記課題を解決するための本発明の他の一つは、ソースコードにおける第1の関数の記述部分のベクトルデータである文字列特徴ベクトル及び、前記第1の関数を呼び出している第2の関数から前記第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルと、前記第1の関数及び前記第2の関数が行う処理に対する判定値との関係を記憶した学習済みモデルを記憶する記憶装置、及び、ソースコードの入力を受け付け、入力された前記ソースコードから、第3の関数の記述部分及び前記第3の関数を呼び出している第4の関数の記述部分を抽出し、前記第3の関数の記述部分のベクトルデータである第2文字列特徴ベクトルを作成し、前記第4の関数の記述部分に基づき、前記第4の関数から前記第3の関数への入力データの内容を示すベクトルデータである第2入力特徴ベクトルを作成し、前記学習済みモデルに、前記作成した第2文字列特徴ベクトル及び第2入力特徴ベクトルを入力することで、前記第3の関数及び前記第4の関数が行う処理に対する判定値を出力する処理装置を備える、ソースコード判定装置である。
【発明の効果】
【0011】
本発明によれば、互いに入出力関係にある複数の関数を有するソースコードに対する判定を行う学習済みモデルを効率よく作成することができる。
上記した以外の構成及び効果等は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【0012】
【
図1】本実施形態に係るソースコード判定システムの構成の一例を示す図である。
【
図2】ソースコード判定モデル作成装置が備える機能部の一例を説明する図である。
【
図3】ソースコード判定装置備える機能部の一例を説明する図である。
【
図4】ソースコード判定モデル作成装置が備えるハードウェアの一例を示す図である。
【
図5】ソースコード判定システムで行われる処理の概要を説明する図である。
【
図9】文字列特徴ベクトル変換処理の詳細を説明するフロー図である。
【
図10】トークン列を埋め込みベクトルに変換する処理の一例を説明する図である。
【
図11】埋め込みベクトルから関連度データを算出する処理の一例を示す図である。
【
図12】関連度データ(attention weight)から文字列特徴ベクトルを算出する処理の一例を示す図である。
【
図13】入力特徴ベクトル変換処理の詳細を説明するフロー図である。
【
図15】合成処理の一例を説明するフロー図である。
【発明を実施するための形態】
【0013】
本発明の実施の形態を、図面を参照しつつ説明する。
図1は、本実施形態に係るソースコード判定システム1の構成の一例を示す図である。ソースコード判定システム1は、ソースコードに存在する不具合を判定するための学習済みモデルであるソースコード判定モデルを作成するソースコード判定モデル作成装置10、ソースコードを開発するユーザが使用するユーザ端末20、及び、ソースコード判定モデルを用いてユーザが指定したソースコードの不具合を判定するソースコード判定装置30の各情報処理装置を含んで構成されている。
【0014】
なお、ソースコード判定モデルは、ソースコードを機械学習することで作成される学習済みモデルである。また、ソースコードは文字列等からなるテキストデータであり、複数の関数の記述を含んでいる。
【0015】
ソースコード判定モデル作成装置10、ユーザ端末20、及びソースコード判定装置30の間は、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)、又は専用線等の有線又は無線の通信ネットワーク5により通信可能となっ
ている。
【0016】
図2は、ソースコード判定モデル作成装置10が備える機能部の一例を説明する図である。ソースコード判定モデル作成装置10は、分類対象選択部101、文字列特徴ベクトル変換部102、呼び元検索部103、入力情報抽出部104、入力特徴ベクトル変換部105、分類特徴ベクトル変換部106、及び学習部107の各機能部を備える。
【0017】
分類対象選択部101は、ソースコード判定モデルの学習データであるソースコード(以下、学習対象ソースコードという)から、他の関数により呼び出されている関数(以下、第1の関数、又は呼び先関数ともいう)の部分を抽出する。
【0018】
文字列特徴ベクトル変換部102は、抽出された第1の関数の部分のデータをベクトル化したデータである文字列特徴ベクトルを作成する。
【0019】
呼び元検索部103は、学習対象ソースコードから、第1の関数を呼び出している関数(以下、第2の関数、呼び元関数ともいう)の部分を抽出する。
【0020】
入力情報抽出部104は、抽出された第2の関数の部分に基づき、第2の関数が第1の関数を呼び出す際の引数の情報を含む文字列データである入力情報を作成する。
【0021】
入力特徴ベクトル変換部105は、入力情報に基づき、第2の関数から第1の関数への入力データの内容を示すベクトルデータである入力特徴ベクトルを作成する。
【0022】
分類特徴ベクトル変換部106は、文字列特徴ベクトル及び入力特徴ベクトルを合成したベクトルデータである分類特徴ベクトルを作成する。
【0023】
学習部107は、分類特徴ベクトルと、学習対象ソースコードにおける、第2の関数による第1の関数の呼び出し処理に対する判定値との関係を記憶した学習済みモデル(ソースコート判定モデル)を作成する。
【0024】
なお、本実施形態では、この判定値は、例えば、第1の関数の処理性能が第2の関数の処理性能に対応しているか否か(一方の関数に極端な処理負荷がかかっているか否か)、又は、第2の関数から第1の関数への呼び出しに係る引数に関してバグ又は不整合が存在するか否か、に関する判定値である。
【0025】
さらに、ソースコード判定モデル作成装置10は、学習対象ソースコードが記憶されているソースコードDB110、作成された入力情報を記憶するための入力情報DB111、判定値の情報が記憶されている教師情報DB112、及び、作成されたソースコード判定モデルを記憶するためのモデル情報113を備える。
【0026】
なお、ソースコード判定モデル作成装置10は、予め、ユーザから、学習対象ソースコード及びこれに対応する判定値の入力を受け付けておき、その学習対象ソースコード及び判定値をソースコードDB110及び教師情報DB112にそれぞれ格納する。もしくは、ソースコード判定モデル作成装置10は、所定の情報処理装置から自動的に学習対象ソースコード及び判定値を取得してもよい。
【0027】
次に、
図3は、ソースコード判定装置30が備える機能部の一例を説明する図である。
【0028】
第2分類対象選択部301は、処理性能又はバグ等の判定を行うソースコード(以下、判定対象ソースコードという)から、他の関数から呼び出されている関数(以下、第3の関数ともいう)の部分を抽出する。
【0029】
第2文字列特徴ベクトル変換部302は、第3の関数の部分のデータをベクトル化したデータである第2文字列特徴ベクトルを作成する。
【0030】
第2呼び元検索部303は、第3の関数を呼び出している関数(以下、第4の関数ともいう)の部分を抽出する。
【0031】
第2入力情報抽出部304は、抽出された第4の関数の部分に基づき、第4の関数が第3の関数を呼び出す際の引数の情報を含む文字列データである第2入力情報を作成する。
【0032】
第2入力特徴ベクトル変換部305は、第2入力情報に基づき、第4の関数から第3の関数への入力データの内容を示すベクトルデータである第2入力特徴ベクトルを作成する。
【0033】
第2分類特徴ベクトル変換部306は、第2文字列特徴ベクトル及び第2入力特徴ベクトルを合成したベクトルデータである第2分類特徴ベクトルを作成する。
【0034】
分類部307は、ソースコート判定モデルに、第2分類特徴ベクトルを入力することで、判定対象ソースコードにおける、第4の関数による第3の関数の呼び出し処理に対する判定値(バグ、性能遅延等に関する判定値)を出力する。
【0035】
また、ソースコード判定装置30は、判定対象ソースコードが記憶されているソースコードDB310、及び、ソースコード判定モデルから出力された判定値の情報が記憶されている判定値情報DB111を備える。
【0036】
なお、ソースコード判定装置30は、予め、ユーザから、判定対象ソースコードの入力を受け付けておき、その判定対象ソースコードをソースコードDB310に格納する。もしくは、ソースコード判定装置30は、所定の情報処理装置から自動的に判定対象ソースコードを取得してもよい。
【0037】
ここで、
図4は、ソースコード判定モデル作成装置10が備えるハードウェアの一例を示す図である。ソースコード判定モデル作成装置10は、CPU (Central Processing Unit)、DSP (Digital Signal Processor)、GPU (Graphics Processing Unit)、FPGA (Field-P
rogrammable Gate Array)等の処理装置41(プロセッサ)と、ROM (Read Only Memory)
、RAM (Random Access Memory)等の主記憶装置42(メモリ)と、HDD (Hard Disk Drive)、SSD (Solid State Drive)などの補助記憶装置43と、NIC(Network Interface Card)、無線通信モジュール、USB (Universal Serial Interface)モジュール、又はシリアル通信モジュール等で構成される通信装置44と、マウスやキーボード等で構成される入力装置45と、液晶ディスプレイまたは有機EL (Electro-Luminescence)ディスプレイ等で
構成される出力装置46とを備えていてもよい。なお、ユーザ端末20及びソースコード判定装置30も、ソースコード判定モデル作成装置10と同様のハードウェアを備える。
【0038】
以上に説明したソースコード判定モデル作成装置10、ユーザ端末20、及びソースコード判定装置30の各情報処理装置の各機能部の機能は、処理装置が、主記憶装置又は補助記憶装置に格納されているプログラムを読み出して実行することにより実現される。また上記のプログラムは、例えば、記録媒体に記録して配布することができる。なお、各情報処理装置は、その全部または一部が、例えば、クラウドシステムによって提供される仮想サーバのように、仮想化技術やプロセス空間分離技術等を用いて提供される仮想的な情報処理資源を用いて実現されるものであってもよい。また、各情報処理装置によって提供される機能の全部または一部は、例えば、クラウドシステムがAPI (Application Programming Interface)等を介して提供するサービスによって実現してもよい。
【0039】
次に、ソースコード判定システム1で行われる処理について説明する。
図5は、ソースコード判定システム1で行われる処理の概要を説明する図である。まず、ソースコード判定モデル作成装置10は、学習対象ソースコード及び判定値に基づきソースコード判定モデルを作成する、学習処理s10を実行する。
【0040】
その後、ソースコード判定装置30は、判定対象ソースコードの指定をユーザから受け付け、学習処理s10で作成したソースコード判定モデルに基づき、判定対象ソースコードの判定を行う判定処理s20を実行する。
なお、学習処理s10及び判定処理s20はそれぞれ、複数回繰り返し実行されてもよい。
【0041】
次に、学習処理s10の詳細を説明する。
<学習処理>
図6は、学習処理の概要を説明する図である。学習処理s10は、例えば、ソースコード判定モデル作成装置10に所定の入力があった場合に開始される。
【0042】
分類対象選択部101は、学習対象ソースコードから、他の関数から呼び出されている関数(呼び先関数)を検索する(s11)。具体的には、分類対象選択部101は、ソースコードDB110に記憶されている学習対象ソースコードを取得し、取得したソースコードのうち、他の関数から呼び出される関数であって、呼び出される場合に当該他の関数から引き渡される入力データが存在する関数(例えば、仮引数の定義部分を有している関数)の部分を抽出する。
【0043】
ここで、
図7は、呼び先関数の一例を示す図である。この呼び先関数700は、呼び元関数の引数に対応する仮引数701(呼び元関数から呼び先関数への入力データ)と、戻り値702とを有する。
【0044】
次に、
図6に示すように、文字列特徴ベクトル変換部102は、s11で検索した呼び先関数をベクトルデータ(文字列特徴ベクトル)に変換する(文字列特徴ベクトル変換処理s12)。
【0045】
一方、呼び元検索部103は、学習対象ソースコードから、呼び先関数を呼び出している関数(呼び元関数)を検索して特定する(s13)。具体的には、呼び元検索部103は、ソースコードDB110に記憶されている学習対象ソースコードを取得し、取得したソースコードのうち、呼び先関数を呼び出している関数であって、呼び先関数にデータを引き渡している関数(例えば、実引数を有する関数)の部分を全て抽出する。
【0046】
ここで、
図8は、呼び元関数の一例を示す図である。この呼び元関数800は、所定の変数値801(len(x))が示す回数分処理が繰り返される繰り返し処理部分802と、呼び先関数を呼び出す部分803とを有する。呼び先関数を呼び出している部分803(関数)は、繰り返し処理部分802の処理により算出された変数を実引数804(呼び元関数から呼び先関数への入力データ)として有する。
【0047】
次に、
図6に示すように、入力情報抽出部104は、s13で検索した関数のそれぞれについて、その関数の入力情報を作成し、作成した入力情報を入力情報DB111に記憶する(s14)。
【0048】
入力特徴ベクトル変換部105は、s14で作成した各入力情報をベクトルデータ(入力特徴ベクトル)に変換する(入力特徴ベクトル変換処理s15)。
【0049】
そして、分類特徴ベクトル変換部106は、s12で作成した文字列特徴ベクトルと、s15で作成した各入力特徴ベクトルとを合成したベクトルデータ(分類特徴ベクトル)を作成する(合成処理s16)。
【0050】
以上のs11~s16の処理が、ソースコードDB110に記憶されている学習対象ソースコードのそれぞれについて繰り返される。なお、s11~s12の処理と、s13~s15の処理との間の実行順序は、上記で説明した順序に限られない。分類特徴ベクトル変換部106が実行される前に、文字列特徴ベクトル及び入力特徴ベクトルが作成されていればよい。
【0051】
次に、学習部107は、s16で作成した分類特徴ベクトルと、学習対象ソースコードに対する判定値(判定値DB112)とを学習データとした所定の機械学習を行って各重み値(詳細は後述)を決定することで、ソースコード判定モデルを作成する。
【0052】
この機械学習は、本実施形態では、BERT (Bidirectional Encoder Representations from Transformers)モデルを作成することで行うものとする。BERTは、ベクトルの入力層
及び出力層を有し、隠れ層としてTransformerを備えるニューラルネットワークである。
学習部107は、作成したソースコード判定モデルを記憶する。以上で学習処理s10は終了する。
【0053】
なお、本実施形態では、上記のように、機械学習モデルとして、BERTを用いるものとするが、記述位置の離れた単語(トークン)間の関係すなわち文脈を考慮可能な自然言語処理を実現するモデルであれば、他の機械学習モデルを採用してもよい。
次に、以上に説明した学習処理s10における各処理の詳細を説明する。
【0054】
<文字列特徴ベクトル変換処理>
図9は、文字列特徴ベクトル変換処理s12の詳細を説明するフロー図である。
文字列特徴ベクトル変換部102は、s11で検索した、学習対象ソースコードにおける呼び先関数の部分をトークン列に変換する(s121)。そして、文字列特徴ベクトル変換部102は、このトークン列をベクトルデータ(埋め込みベクトル)に変換する(s122)。この埋め込みベクトルは、入力データ(input)及びこの入力データに対する
元データ(memory)の両方の役割を果たす(self attention)。
【0055】
文字列特徴ベクトル変換部102は、変換した埋め込みベクトルから、入力データ(input)に対応するKey行列と(s123)、元データ(memory)に対するQuery行列と(s
124)を作成する。
【0056】
そして、文字列特徴ベクトル変換部102は、Key行列及びQuery行列に基づき、トークン間の関連性の強さを示す関連度データ(Attention Weight)を作成する(s125)。
【0057】
また、文字列特徴ベクトル変換部102は、元データ(memory)の各トークンのベクトルデータ(埋め込みベクトル)であるValue行列を作成する(s126)。そして、文字
列特徴ベクトル変換部102は、この作成したValue行列と、s125で作成した関連度
データ(Attention Weight)とに基づき、文字列特徴ベクトルを作成する(s127)。
【0058】
ここで、文字列特徴ベクトル作成処理s12の具体例を説明する。
図10は、トークン列を埋め込みベクトルに変換する処理の一例を説明する図である。同図に示すように、文字列特徴ベクトル変換部102は、トークン及びベクトルデータの間の関係を規定した対応情報1001(Volcabulary)を参照することにより、呼び先関
数のトークン列1002の各トークン1003を、ベクトルデータ1004に変換することで、埋め込みベクトル1005を作成する。なお、対応情報1001は、例えば、類似する単語には類似するベクトルデータを対応づけたデータである。対応情報1001は、例えば、word2vecを用いて作成される。
【0059】
次に、
図11は、埋め込みベクトルから関連度データを算出する処理の一例を示す図である。同図に示すように、文字列特徴ベクトル変換部102は、Key行列1101及びそ
のKey行列1101に対する重み値1102(w
k)の積と、Query行列1103及びそのQuery行列1103に対する重み値1104(w
q)の積との行列積を、所定の演算関数11
05(matumul)を用いて計算し、この行列積を所定の活性化関数1106(softmax)に入力することで、トークン間の関連度データ1107(attention weight)を算出する。活性化関数1106により、関連度データ1107では、各行の値の合計値は全て1となっている。なお、各重み値は機械学習によって計算される行列の構成データである。
【0060】
図12は、関連度データ(attention weight)から文字列特徴ベクトルを算出する処理の一例を示す図である。同図に示すように、文字列特徴ベクトル変換部102は、算出された関連度データ1201(attention weight)から選択されたトークン(同図の例では[CLS])のベクトル1202を抽出し、抽出したベクトル1202と、Value行列1203及び当該トークンに係る重み値1204(w
v)との積を算出することで、文字列特徴ベクトル1205を得る。なお、この重み値1204は機械学習によって計算される行列の構成データである。
【0061】
次に、入力特徴ベクトル変換処理s15について説明する。
<入力特徴ベクトル変換処理>
図13は、入力特徴ベクトル変換処理s15の詳細を説明するフロー図である。
入力特徴ベクトル変換部105は、s14で取得した入力情報を参照し、呼び先関数の呼び出し箇所を特定する(s151)。
【0062】
入力特徴ベクトル変換部105は、s14で取得した入力情報が示す呼び先関数を記号実行し、s151で特定した呼び出し箇所の処理を通過(実行)する場合の、呼び元関数における処理経路の条件(パス条件)と、呼び元関数の実引数の値との組み合わせを抽出する(s152)。また、入力特徴ベクトル変換部105は、呼び先関数に基づき、この
実引数に対応する仮引数を特定する。
【0063】
そして、入力特徴ベクトル変換部105は、s152で抽出した組み合わせに基づき、「パス条件 => 仮引数の名称=値」のデータ形式を有する文字列データ、すなわち入力情報を生成し、これを記憶する(s153)。
【0064】
入力特徴ベクトル変換部105は、s153で記憶した入力情報をベクトルデータ(入力特徴ベクトル)に変換する(s154)。
【0065】
ここで、
図14は、入力情報の作成例を説明する図である。入力特徴ベクトル変換部105は、呼び先関数の呼び出し箇所1401を通過する呼び元関数1402のパスとして、処理経路を特定する部分である条件分岐1403の「False」を経由する第1パス14
04と、条件分岐1403の「True」を経由する第2パス1405とを検索して特定する。また、入力特徴ベクトル変換部105は、この条件分岐1403におけるグローバル変数に関する値(Len(x))を記号として認識する。そして、入力特徴ベクトル変換部105は、呼び元関数1402を記号実行する。
【0066】
その結果、入力特徴ベクトル変換部105は、入力情報のうち、呼び先関数の第1仮引数a(呼び元関数の実引数sumに対応)に関する部分として、パス条件「0=>Len(x)」(第
1パス=False)及び「a=0」(仮引数の値)を含む文字列データ1406と、パス条件「0<Len(x)」(第2パス=True)及び「a=x[0]」(仮引数の値)を含む文字列データ1407とを作成する。
【0067】
また、入力特徴ベクトル変換部105は、入力情報のうち、呼び先関数の第2仮引数b
(呼び元関数の実引数numに対応)に関する部分として、パス条件「0=>Len(x)」(第1パス=False)及び「b=0」(仮引数の値)を含む文字列データ1408と、パス条件「0<Len(x)」(第2パス=True)及び「b=1」(仮引数の値)を含む文字列データ1409とを
作成する。
【0068】
なお、ここで説明した文字列データのデータ形式は一例であり、パス条件、及び、引数(の値)が含まれていればよい。例えば、仮引数ではなく実引数を用いてもよい。
【0069】
<合成処理>
次に、
図15は、合成処理s16の一例を説明するフロー図である。
分類特徴ベクトル変換部106は、1行目を、文字列特徴ベクトル変換処理s12で作成した文字列特徴ベクトル、2行目以降の各行を、入力特徴ベクトル変換処理s15で作成した各入力特徴ベクトルとする行列データを作成する(s161)。
【0070】
分類特徴ベクトル変換部106は、s123、s124と同様の処理により、s161で作成した行列データに対応するKey行列(s162)と、Query行列(s163)とを作成する。
【0071】
分類特徴ベクトル変換部106は、s125と同様の処理により、s162、s163で作成したKey行列及びQuery行列に基づき、関連度データ(Attention Weight)を作成する(s164)。
【0072】
また、分類特徴ベクトル変換部106は、s126と同様の処理により、Value行列を
作成する(s165)。そして、分類特徴ベクトル変換部106は、s127と同様の処理により、上記作成したValue行列と、s164で作成した関連度データ(Attention Weight)とに基づき、分類特徴ベクトルを作成する(s166)。
【0073】
<判定処理>
次に、
図16は、判定処理s20の概要を説明する図である。判定処理s20は、例えば、ユーザからユーザ端末20に所定の入力があった場合に開始される。
【0074】
第2分類対象選択部301は、s11の処理と同様に、判定対象ソースコードから、他の関数から呼び出されている関数(呼び先関数)を検索する(s21)。
【0075】
具体的には、第2分類対象選択部301は、判定対象ソースコードDB310に記憶されている判定対象ソースコードを取得し、取得したソースコードのうち、他の関数から呼び出される関数であって、呼び出される場合に当該他の関数から引き渡される入力データが存在する関数(例えば、仮引数の定義部分を有している関数)の部分を抽出する。なお、この際、第2分類対象選択部301は、ユーザ端末20から、判定対象ソースコードの指定を受け付けてもよい。
【0076】
第2文字列特徴ベクトル変換部302は、s12の処理と同様に、s21で検索した呼び先関数をベクトルデータ(第2文字列特徴ベクトル)に変換する(第2文字列特徴ベクトル変換処理s22)。
【0077】
一方、第2呼び元検索部303は、s13の処理と同様に、判定対象ソースコードから、呼び先関数を呼び出している関数(呼び元関数)を検索する(s23)。具体的には、第2呼び元検索部303は、判定対象ソースコードDB310に記憶されている判定対象ソースコードを取得し、取得したソースコードのうち、呼び先関数を呼び出している関数であって、呼び先関数にデータを引き渡している関数(例えば、実引数を有する関数)の部分を全て抽出する。
【0078】
第2入力情報抽出部304は、s14の処理と同様に、s23で検索した関数のそれぞれについて、その関数の第2入力情報を作成し、作成した第2入力情報を記憶する(s24)。
【0079】
第2入力特徴ベクトル変換部305は、s15の処理と同様に、s24で作成した各第2入力情報をベクトルデータ(第2入力特徴ベクトル)に変換する(第2入力特徴ベクトル変換処理s25)。
【0080】
そして、第2分類特徴ベクトル変換部306は、s16の処理と同様に、s22で作成した第2文字列特徴ベクトルと、s15で作成した各第2入力特徴ベクトルとを合成したベクトルデータ(第2分類特徴ベクトル)を作成する(合成処理s26)。
【0081】
以上のs21~s26の処理が、判定対象ソースコードDB310に記憶されている判定対象ソースコードのそれぞれについて繰り返される。なお、s21~s22の処理と、s23~s25の処理との間の実行順序は、上記で説明した順序に限られない。第2分類特徴ベクトル変換部306が実行される前に、第2文字列特徴ベクトル及び第2入力特徴ベクトルが作成されていればよい。
【0082】
次に、分類部307は、s26で作成した第2分類特徴ベクトルを、ソースコード判定モデルに入力することにより、判定値を出力する(s27)。分類部307は、出力した判定値を、ユーザ端末20の画面に表示する。
【0083】
以上のように、本実施形態のソースコード判定モデル作成装置10は、学習対象ソースコードから、呼び先関数及び呼び元関数の記述部分を抽出し、呼び先関数の記述部分のベ
クトルデータである文字列特徴ベクトルを作成し、呼び元関数から呼び先関数への入力データに関するベクトルデータである入力特徴ベクトルを作成し、文字列特徴ベクトル及び入力特徴ベクトルと、呼び先関数及び呼び元関数が行う処理に対する判定値との関係を記憶したソースコード判定モデルを作成する。
【0084】
すなわち、本実施形態のソースコード判定モデル作成装置10は、呼び元関数に関して、呼び先関数への入力部分を抽出し、この入力部分と、呼び先関数及び判定値とを学習用データとして用いて学習済みモデルを作成する。これにより、呼び元関数に関する学習データの量を抑えつつ、適切な機械学習が行えるようになる。
【0085】
このように、本実施形態のソースコード判定モデル作成装置10によれば、互いに入出力関係にある複数の関数を有するソースコードに対する判定を行う学習済みモデルを効率よく作成することができる。
【0086】
また、本実施形態のソースコード判定モデル作成装置10は、文字列特徴ベクトルに関して、呼び先関数の記述部分を複数のトークンに変換し、変換した各トークンと、トークンに対応付けられる重み値とに基づき各トークン間の関連度(Attention Weight)を算出し、算出した各関連度に基づき文字列特徴ベクトルを作成する。そして、ソースコード判定モデル作成装置10は、ソースコード判定モデルを作成する際に、それらの重み値を決定する。
【0087】
これにより、呼び先関数の記述部分を適切に特徴ベクトルに変換し、機械学習に用いることができる。
【0088】
また、本実施形態のソースコード判定モデル作成装置10は、呼び元関数の記述部分に基づき、呼び元関数が呼び先関数を呼び出す際の引数の情報を含む文字列データである入力情報を作成し、作成した入力情報をベクトルデータに変換することにより、入力特徴ベクトルを作成する。
【0089】
このように、呼び元関数の引数のデータを用いて入力特徴ベクトルを作成することで、呼び出し関数及び呼び元関数の間の入出力関係を適切に学習データとすることができる。
【0090】
また、本実施形態のソースコード判定モデル作成装置10は、呼び元関数内における処理経路(パス)を記号実行等により探索し、探索した処理経路を特定する条件分岐を示す文字列と、当該処理経路による処理の実行により呼び元関数が呼び先関数を呼び出す際の引数の名称及びその引数の値を示す文字列とを含む文字列データである入力情報を作成する。
【0091】
これにより、呼び出し関数及び呼び元関数の間の入出力関係の詳細を学習データとし、正確なソースコード判定モデルを作成することができる。
【0092】
また、本実施形態のソースコード判定モデル作成装置10は、文字列特徴ベクトル及び入力特徴ベクトルを合成したベクトルである分類特徴ベクトルを作成して機械学習に用いることで、効率的な機械学習を行うことができる。
【0093】
また、本実施形態のソースコード判定装置30は、判定対象ソースコードの入力を受け付け、判定対象ソースコードから、呼び先関数及び呼び元関数の記述部分を抽出し、呼び先関数の記述部分のベクトルデータである第2文字列特徴ベクトルを作成し、呼び元関数から呼び先関数への入力データに関するベクトルデータである第2入力特徴ベクトルを作成し、ソースコード判定モデルに、第2文字列特徴ベクトル及び第2入力特徴ベクトルを
入力することで、呼び先関数及び呼び元関数が行う処理に対する判定値を出力する。
【0094】
このように、ソースコード判定モデルを用いることで、互いに入出力関係にある複数の関数を有するソースコードに対する判定(例えば、バグ、処理の不整合、又は性能遅延の判定)を行うことができる。
【0095】
なお、本発明は、上記実施形態に限定されるものではなく、その要旨を逸脱しない範囲内で、任意の構成要素を用いて実施可能である。以上説明した実施形態や変形例はあくまで一例であり、発明の特徴が損なわれない限り、本発明はこれらの内容に限定されるものではない。また、上記では種々の実施形態や変形例を説明したが、本発明はこれらの内容に限定されるものではない。本発明の技術的思想の範囲内で考えられるその他の態様も本発明の範囲内に含まれる。
【0096】
例えば、本実施形態の各装置が備える各機能部の一部は他の装置に設けてもよいし、別装置が備える機能部を同一の装置に設けてもよい。
【符号の説明】
【0097】
1 ソースコード判定システム、10 ソースコード判定モデル作成装置、30 ソースコード判定装置