ソフトウェア・シンポジウム2019 in 熊本

LSTM を用いたソースコード内の演算子推定手法
舟山 優

水野 修

京都工芸繊維大学 大学院工芸科学研究科

京都工芸繊維大学 情報工学・人間科学系

博士前期課程 情報工学専攻

o-mizuno@kit.ac.jp

y-funayama@se.is.kit.ac.jp

要旨

次に連なる字句を推測して候補を提示する機能である．
この機能は，開発時にソースコードを記述する速度を向統合開発環境（IDE）には関数名や変数名の候補を表上させたり誤字を減らしたりすることなどを目的として示するなどの補完機能が備わっているものが多い．この導入される．

ような機能は，素早くソースコードを記述したり，不具ユーザに対して有用な情報を提示することに関して合の混入を抑制したりするなど，ソフトウェア開発の生様々な研究が行われている．例えば，Yang ら [1] は，プ産性を向上させている．このような生産性に関連する研ログラムを修正した際にその修正した要素と類似したも究は数多く行われている．のを抽出し，次に修正する可能性がある部分を強調して本研究ではソースコード中の演算子に関する有用な情表示するツール SimilarHighlight を作成した．このツー報をユーザに提示することを目的とする．有用な情報のルを使用することで，プログラム開発の生産性が向上し例としては，演算子の補完機能や，ソースコード中の不たり，レビューをする際に簡単に類似の要素を見つける適切な演算子の検出が考えられる．ソースコード中の不ことができるようになった．また，山本ら [2] は，ユー適切な演算子とは，例えば ”if(a > 5)” とするべきとザが開発作業を中断することなく，必要に応じてソースころを ”if(a >= 5)” としてしまった場合などである．

コードを再利用できる手法を提案した．過去のソフト

目的達成のための第一歩として，本研究ではソースコーウェアに含まれる既存のソースコードをコーパス化してド中のある箇所の演算子の種類が不明な場合に，その箇データベースを作成し，ユーザが書いている途中のソー所に最も当てはまる演算子を推定する手法を提案した．

スコードの後に続くソースコードとして，過去のソフト

Java で記述されたソースコードをトークンの並びに変換し，それをもとに欠落した演算子を推定する LSTMを用いた機械学習モデルを作成した．LSTM を用いたモデルを 3 つ作成し，それらのモデルを用いた手法と欠落した演算子をランダムに推定する手法で実験し，考察を行った．実験の結果，最大で約 72%の正解率を得られた．
この結果から，ソースコードには欠落した演算子の特定に有用な特徴が含まれており，LSTM を用いることでそれらの特徴を学習できると考えられる．

ウェアの中で確率が高かったものを提示する．
本研究では，ソースコード中の演算子に関する有用な情報をユーザに提示することを目的とする．最終的にはソースコード中の任意の箇所を推定し提示することを目指すが，その第一歩としてまずは推定の対象を演算子のみに限定し，ソースコード中のある箇所の演算子の種類が不明な場合に，その箇所に最も当てはまる演算子を推定する手法を提案する．
「演算子の種類が不明なソースコード中のある箇所」を，これ以降便宜的に「空欄」と呼称する．将来的には，演算子の補完機能の開発や，ソースコード中の不適切な演算子の検出などに貢献できると

1. はじめに考えられる．
演算子を推定する方法として，本研究では Long short-統合開発環境（IDE）には補完機能が備わっているもterm memory（LSTM）を用いる．LSTM は自然言語ののが多い．補完機能とは，文字列を入力しているときに84SEA

ソフトウェア・シンポジウム2019 in 熊本

分野などで利用されている．本研究で作成した機械学習
モデルは，ソースコードの一部をトークン列へ変換したものを LSTM への入力とすることで空欄に当てはまる演算子を推定する．作成したモデルを用いて，空欄より前の部分のソースコードを入力とした場合，空欄より後の部分のソースコードを入力とした場合，その両方を入力とした場合，ソースコードを入力とせず出現頻度で重み付けされた確率に基づいてランダムに推定した場合の4 つの実験を行い，比較した．

2. 研究の目的
本研究の目的は，ソースコードに関する有用な情報をユーザに提示するため，ソースコード中の任意の箇所を推定し提示することの第一歩として，ファイルに含まれ

図 1. トークナイザによる変換例

るソースコードの情報をもとに，ソースコード中のある箇所の演算子の種類が不明とされた場合に，その箇所に3.2. トークナイズ

最も当てはまる演算子を LSTM を用いて推定することである．

トークナイズ（tokenize）とは，ソースコードをトーク

本研究では以下に示す研究設問について検証を行う．

ンの並びに変換することである．トークンとはキーワー

RQ1: 空欄より前の情報から空欄に入る演算子をどの程度の精度で推定できるか．

ドや識別子，演算子などを指す．トークナイズを行うプ
ログラム等のことをトークナイザと呼ぶ．Java で記述されたソースコードに対して本研究で用いたトークナイ

RQ2: 空欄より後の情報から空欄に入る演算子をどの程度の精度で推定できるか．

ザを使用した例を図 1 に示す．このトークナイザはコメントと括弧，区切り文字 ’;’ を無視しつつ，先頭から順にトークンを抽出する．

RQ3: 空欄の前後の情報から空欄に入る演算子をどの程度の精度で推定できるか．

3.3. 深層学習
RQ4: LSTM に与える情報によって推定した結果に差異はあるか．

深層学習とは機械学習の一種であり，人間の脳神経回路を模倣して考案されたニューラルネットワークの層を3. 準備増やし，階層を深めたアルゴリズムのことである．階層を深くすることで複雑なパターンのデータも学習するこ

3.1. 演算子とができ，モデルの表現力を向上させることができる．

本研究では Java で記述されたソースコードを対象と3.3.1. Keras

する．Java には数多くの演算子があるが，その全てを扱うと問題が複雑になるため，二項演算子である

Keras [3] とは，Python で記述されたニューラルネットワークを扱うライブラリである．TensorFlow などの+, -, *, /, %, <, >, <=, >=, ==, !=, &&, ||上で実行できる．Keras は迅速な実験を可能にすることの 13 種の演算子を実験対象とした．に重点を置いて開発されており，学習コストが低く手軽に使用できることから，事業や研究で幅広く利用されている．本研究では Keras を用いて学習モデルを作成した．

85

SEA

ソフトウェア・シンポジウム2019 in 熊本

バイアスを表す．
このゲートは，一つ前の記憶 ct−1 から不要な情報を捨てる働きをする．
入力ゲート
図 2 の’i’ に相当し，次の式で表される．

i = σ(xt Wxi + ht−1 Whi + bi )(2)

LSTM には前述した忘却ゲートによる不要な情報を捨てる機能だけでなく，新しい情報を得るための機能がある（図 2 の’g’）．これは次の式で表される．
g = tanh(xt Wxg + ht−1 Whg + bg )図 2. LSTM の計算グラフ(3)

この機能に対して制御を行うゲートを入力ゲートと呼ぶ．入力ゲートは追加される新しい情報にどれだ

3.3.2. LSTM 層けの価値があるのかを判断する．

Long short-term memory（LSTM）層は，受け取った出力ゲート入力から隠れ状態を計算し結果を出力する層である．再図 2 の’o’ に相当し，次の式で表される．

帰型ニューラルネットワーク（RNN）と同じく，出力された隠れ状態を自身への入力とすることで再帰的な計算

o = tanh(xt Wxo + ht−1 Who + bo )(4)を行う．
隠れ状態 ht は ct に tanh 関数を適用することで求LSTM の中身を計算グラフを用いて表したものを図 2に示す．この図は時刻 t のときの LSTM の状態を表しており，入力 xt と，一つ前の時刻 t − 1 の後述する記憶
セル ct−1 と隠れ状態 ht−1 を受け取り，ct と ht を出力する．また，図中の’σ’ はシグモイド関数を表している．
LSTM は RNN とよく似ているが，LSTM には記憶セル c と呼ばれるものがある．LSTM 層から出力された記憶セルは自分自身のみへの入力として使用される．記憶セルの計算にはゲートという機能を使用する．ゲートはデータの流れをコントロールするための機能で，0 以上 1 以下の実数で表される．0 はデータを全く流さない閉じた状態を表し，1 はデータを全て流す全開の状態を表す．
ゲートには，忘却ゲート，入力ゲート，出力ゲートの3 種類がある．

められるが，その際に出力ゲートは tanh(ct ) の各要素が次の時刻の隠れ状態としてどれだけ重要であるかを調整する．
これらのゲートを用いて記憶セル ct と隠れ状態 ht はア
ダマール積（◦）を用いて次の式で表される．

ct= f ◦ ct−1 + g ◦ i(5)ht= o ◦ tanh(ct )(6)

ゲートと記憶セルによって，RNN を使用した場合にしばしば問題となる勾配消失を抑制することができる．

LSTM では過去の情報が記憶されるため，過去のデー
タと現在のデータに関連性があるようなデータ，例えば時系列データを扱う際によく用いられる．文章も単語の並びに関連性があると考えると，時系列データの一種と忘却ゲートみなせる．

図 2 の’f’ に相当し，次の式で表される．

f = σ(xt Wxf + ht−1 Whf + bf )(1)

3.3.3. ドロップアウト層

式中の Wxf は入力 xt に対する重みであり，Whf はドロップアウト層は，学習時にランダムにニューロン一つ前の隠れ状態 ht−1 に対する重みである．bf はを選びそのニューロンを無視することでその先に信号が86SEA

ソフトウェア・シンポジウム2019 in 熊本

伝達するのを止める層である．ドロップアウト層を追加
表 1. 2 クラスの混同行列の例
予測値

することでランダムな無視が制約となり，過学習を防ぐことができる．過学習とは，学習データに対して特化した学習を行ってしまったために未知のデータに対しては正しい答えを出せないような状態のことである．過学習

真値を防ぐということはニューラルネットワークの汎化性能PositiveNegativeTPFP

FNTN

Positive
Negativeを向上させるということである．
表 2. 3 クラスの混同行列の例
予測値

3.4. 多クラス分類
本研究はソースコード中の空欄に当てはまる演算子を推定するものであり，推定する演算子の候補は 3.1 節で真値述べたようにようにあらかじめ限定されている．よって，空欄に当てはまる確率が候補の中で最も高いものを選ぶ

AB
CA

BCTA
FAB
FAC

FBA
TB
FBC

FCA
FCB
TC

多クラス分類を行えばよい．
多クラス分類を行うニューラルネットワークでは，ニイザ（optimizer）と呼ぶ．タスクによって最適なオプューラルネットワークが出力するスコアにソフトマック

ティマイザは異なるが，確率的勾配降下法（SGD）やス関数を適用してスコアを確率に変換し，損失関数としAdaptive moment estimation（Adam）[4] などがよく利用される．て交差エントロピー誤差を用いて損失を求めることが多い．ここで，損失関数とはある学習時点における学習結果が正解データとどのくらい異なっているかを示す「損3.5. 評価尺度失」を求める関数のことである．学習がうまく行えていると損失は徐々に小さくなり，損失の更新量が一定より3.5.1. 多クラスの混同行列小さくなると学習は終了する．

説明のため，A，B，C の 3 つのクラスを分類する問
題を考える．2 クラスの場合の混同行列は表 1 のように

3.4.1. ソフトマックス関数

なるが，3 クラスの場合の混同行列は表 2 のようになる．

ソフトマックス関数は，ニューラルネットワークから

表 2 の TA は真値が A で予測値も A であったときの出力されるスコアを確率に変換する関数であり，次の式数を表し，FAB は真値は B だが予測値が A であったとで表される．

きの数を表す．以降の説明では，表 2 に基づいて評価尺exp(sk )yk = ∑ni=1 exp(si )

度を表す．

(7)

式（7）はクラスが n 個あるときの k 番目のクラスの出

3.5.2. 正解率 (Accuracy）

力 yk を求めている．
ソフトマックス関数を適用した n 個の各出力は 0 以上

正解率とは，正しく予測した割合であり，次の式で表1 以下の実数となり，n 個全ての出力を足し合わせると1.0 になる．このことからソフトマックス関数の出力は確率であるとみなせる．

される．

∑Accuracy = ∑i∈{A,B,C} Ti

i∈{A,B,C} Ti +∑∑i,j∈{A,B,C},j̸=i Fij(8)
正解率は予測の全体的な傾向を把握するには有用である
が，クラスの数の偏りなどに大きく影響を受ける．

3.4.2. オプティマイザ
機械学習の分野において，損失関数の値をできるだけ小さくするパラメータの値を見つけることを最適化（optimization）と呼び，その手法のことをオプティマ

87SEAソフトウェア・シンポジウム2019 in 熊本

3.5.3. 適合率（Precision）のように変換する場合は，クラス i に対する適合率とは，予測値が i であるもの

TPのうち真値が i であったものの割合であり，次の式で表T Ni
Ti +∑Tij∈{A,B,C},j̸=i Fij∑

=(9)
TN∑

=3.5.4. 再現率（Recall）

FP

うち予測値が i であるものの割合であり，次の式で表さFNれる．

∑Ti

j∈{A,B,C},j̸=i Fji∑

Fjk

j∈{A,B,C} k∈{A,B,C}
j̸=ik̸=iT Ni∑Fiji∈{A,B,C} j∈{A,B,C}
j̸=i

クラス i に対する再現率とは，真値が i であるものの

Ti +

∑=

∑Tj +j∈{A,B,C}
j̸=ii∈{A,B,C}

Recalli =Ti

i∈{A,B,C}

される．

P recisioni =∑=∑=∑Fjii∈{A,B,C} j∈{A,B,C}j̸=i(10)(12)のように計算することで変換できる．式（12）で計算し3.5.5. F 値た結果を用いて適合率などを求めることで学習モデル全体の評価を行うことができる．F P と F N が等しくなる

F 値（F1 値などとも呼ばれる）とは，適合率と再現率のトレードオフに対して最適解を求めるための尺度であり，適合率と再現率の調和平均で計算される．クラスi に対する F 値は次の式で表される．
2 · P recisioni · Recalli
Fi =P recisioni + Recalli

ため，適合率と再現率は等しくなる．適合率と再現率が等しいとき，式（11）より F 値も適合率および再現率と等しくなる．また，マイクロ平均を用いると正解率も適合率や再現率，F 値と等しい値になる．

(11)4. 提案手法

適合率か再現率どちらか一方が大きい値を記録しても良い結果とは言えない．適合率と再現率がどちらも大きい

4.1. 提案手法の概要場合に F 値も大きくなる．F 値は各クラスのデータ数に提案手法では，ソースコードの情報を入力とする学偏りがある場合にも有効な尺度である．

習モデルを用いて空欄に当てはまる演算子を推定した．

LSTM 層などによって構成される 3 種の学習モデルを作成した．

3.5.6. マイクロ平均
上で述べた適合率や再現率，F 値は各クラスごとに計4.2. モデルの定義算する方法であり，学習モデル全体の評価を行うにはそれらの平均を取ることなどが考えられる．各クラスごと空欄より前の部分のソースコードをトークン化したもの指標の平均を求める方法はマクロ平均と呼ばれる．マのを tF ，後の部分のソースコードをトークン化したもクロ平均はデータの偏りを考慮していない．のを tB とする．

データの偏りを考慮した方法にマイクロ平均というものがある．マイクロ平均はクラスごとに計算するのではなく，多クラスの混同行列を 2 クラスの混同行列に変換

4.2.1. 学習モデル MFして 2 値分類と同様に計算する方法である．表 2 を表 1

tF を用いて空欄に当てはまる演算子を推定する学習モデル MF を図 3 に示す．バッチサイズは 116 に，埋め込み層の出力の次元数は 100 に，LSTM 層の隠れ状態の数は 128 に，ドロップアウト層のドロップする割合は88

SEA

ソフトウェア・シンポジウム2019 in 熊本

図 4. 学習モデル MF B の概要図

図 3. 学習モデル MF , MB の概要図れる．同様に，右側の入力層に入力された tB は埋め込50%に，エポック数は 10 に設定した．オプティマイザには Adam を使用した．また，活性化関数はソフトマックス関数を用い，損失関数は交差エントロピー誤差を用いた．

み層により分散表現へと変換され，右側の LSTM 層に出力される．その後，左右それぞれで MF や MB と同様の計算を行い，出力を加算する．加算した結果にソフトマックス関数を適用し，最終的な演算子ごとの確率から演算子の推定を行う．

4.2.2. 学習モデル MB

5. 実験方法

tB を用いて空欄に当てはまる演算子を推定する学習モデル MB を図 3 に示す．バッチサイズなどのパラメー
タは MF と同じものを使用する．
MB は MF とほぼ同じであるが，MF と異なり，入力の順を逆順に並び替える．例えば， ”a = b ?? c + d” というソースコードの場合は， ’d’ ， ’+’ ， ’c’ の順で入力される．

5.1. データの前処理
5.1.1. 使用するソースコード
実験には Apache [5] のオープンソースソフトウェアプ
ロジェクトである Ant, Camel, Eagle, James の全 Java
ファイルのうち，実験対象の 13 種の演算子のうちいずれかを 1 つ以上含んでいるファイル 11,600 個を使用し4.2.3. 学習モデル MF B

た．この 11,600 個のデータを，リポジトリを区別せず

tF と tB を用いて空欄に当てはまる演算子を推定する学習モデル MF B を図 4 に示す．バッチサイズなどのパラメータは MF と同じだが，エポック数は 20 とした．
エポック数が異なるのは，損失が収束するまでの学習回数が異なるためである．
図 4 の左側の入力層に入力された tF は埋め込み層により分散表現へと変換され，左側の LSTM 層に出力さファイル名でソートし先頭から順に，学習データ 6,960個，検証データ 2,436 個，テストデータ 2,204 個に分けて実験を行なった．学習データはモデルの学習のために用いられ，検証データは学習が 1 エポック終了する毎にモデルの性能を検証するために用いられる．テストデー
タは学習が終了したモデルの最終的な評価を行うために用いられる．

89

SEA

ソフトウェア・シンポジウム2019 in 熊本

5.1.2. 前処理の手順

表 3. 各データの演算子の数実験に使用する学習データ，検証データ，テストデー
学習データ

検証データ

全て

空欄

全て

空欄

全て

空欄

+

31,024

2,677

9,223

1,003

13,347835-7,1075892,048187

2,140203*

1,023

133358

44539

90/

217

16855134

7%

122

15394

536

<

6,141734

1,994

255

1,818216>

5,667

478

1,789

165

1,699

141

<=

35836

121131269>=

400

30

137

13201

15

タに対して行う前処理について述べる．

1. トークナイザを用いて Java ソースコードをトークンの並びに変換する．変換したものをトークンファ
イルと呼ぶこととする．
2. トークンファイルの中から実験対象の演算子を無作為に 1 つ選び，”??” に置き換える．”??” は空欄を意味する．この時，置き換えた演算子（つまり教師ラベル）を保存しておく．

5.1.3. 実験データに含まれる演算子

テストデータ

==

8,486

839

2,750

298

2,755261

実験データに含まれる演算子を表 3 に示す．
「全て」は!=

10,417

947

3,487

277

3,048289

各データのトークンファイルに含まれる全ての演算子の&&

4,390

325

1,808

115

1,419

85

数を，
「空欄」は実験のためトークンファイルの演算子||

2,05814179957727

47

一つを空欄に置き換えたときの置き換えられた演算子の数，つまり教師ラベルの数を表している．例えば，’+’ の5.5. RQ4 の実験手順

行の左端の 31,024 は学習データの全トークンファイルに ’+’ が 31,024 個現れることを表している．また，そのLSTM を用いた 3 つの実験の結果と比較するため，本
実験ではソースコード内の演算子出現数にもとづいて重み付けされた確率でランダムに推定するモデル MR を作成した．確率に重み付けをする際は学習データの教師ラベルの数を元に計算した（詳細な数は表 3 の学習データの空欄列を参照）．例えば，学習データの教師ラベル 6,960 個のうち’+’ が正解のものは 2,677 個あるので，’+’ の重み付けされた確率は約 38%となる．テスト
データを用いて推定した結果を混合行列で表した．その後，全モデルの推定結果を F 値を用いて比較した．

右の 2,667 は学習データのうち教師ラベルが ’+’ のものが 2,667 個あることを表している．

5.2. RQ1 の実験手順
本実験では，空欄より前のトークン tF をモデル MFの入力とし，空欄に当てはまる演算子を推定する．テス
トデータを用いて推定した結果を混合行列で表した．

5.3. RQ2 の実験手順
本実験では，空欄より後のトークン tB をモデル MB

6. 実験結果の入力とし，空欄に当てはまる演算子を推定する．テス
トデータを用いて推定した結果を混合行列で表した．

それぞれの実験の推定結果から得られた混同行列のヒートマップを図 5〜8 に示す．ヒートマップとは行列5.4. RQ3 の実験手順

型の数字データの強弱に色をつけることで行列を見やすくしたものである．数字が大きくなると色が濃くなり，本実験では，空欄より前のトークン tF と空欄より後反対に数字が小さくなると色が薄くなる．本実験で作のトークン tB の両方をモデル MF B の入力とし，空欄成したヒートマップは混同行列の正規化を行い色付けをに当てはまる演算子を推定する．テストデータを用いてしているが，表示されている数字は正規化する前のもの推定した結果を混合行列で表した．

である．True label は正解の演算子を表し，Predictedlabel はモデルが推定した演算子を表す．例えば，図 590SEA

ソフトウェア・シンポジウム2019 in 熊本

図 5. MF を用いた実験の結果の混同行列
図 7. MF B を用いた実験の結果の混同行列

図 6. MB を用いた実験の結果の混同行列の 1 行 2 列目の 100 は，空欄に当てはまる正解の演算子

図 8. MR を用いた実験の結果の混同行列

は ’+’ だがモデル MF が推定した結果が ’-’ である場合の数が 100 であったことを示している．
各モデルで推定した結果から得られた F 値を表 4 に示す．MF B を用いた推定結果が最も良く，MR を用いた推定結果が最も悪い結果となった．3.5.6 節で述べたよ表 4. 各モデルの実験結果の F 値
F値

うに，マイクロ平均を用いた場合 F 値と正解率は一致するので，表 4 は正解率の表ともいえる．
各モデルで，学習データ全てを用いて学習を行ったと
きと，テストデータ全てを用いて演算子の推定を行った
ときの所要時間を表 5 に示す1 ．MF B の場合，推定時間

MF0.653

MB0.609

MF B

0.721

MR0.192

1 Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz を 2 つと64 GB の RAM を使用した．GPU は使用していない．

91SEA

ソフトウェア・シンポジウム2019 in 熊本の関係性があり，深層学習を用いることでその関係性を
表 5. 各モデルの学習時間と推定時間
学習時間（秒） 推定時間（秒）MF

19,524

174

MB

9,311

84

MF B

40,468181

MR--学習できると考えられる．
空欄より後の情報から推定した MB の実験結果の正解率が 61%であった．MB の推定手法では，例えば ”if(a < b)” というソースコードがあったとき，ト ー ク ナ イ ズ し て 演 算 子 を ’??’ に 置 き 換 え る と ，”if a ?? b” というトークン列になり， ”if” を読まずに ”??” を推定することになる．しかし，図 6 より，’<’ は約 82%， ’>’ は約 46%の正解率が得られた．また，’<’ と ’>’ の出現回数に大きな差はない．これらのことから， ’if’ などのキーワードが無くともその後の文からある程度の正解率で空欄に当てはまる演算子を推定できることを示している．空欄より前の部分を使用した場合には劣るが，空欄より後の部分にも演算子の正しい推定に重要な特徴が多く含まれていると考えられる．しかし， ’<’ と ’>’ の正解率の差については構文解析を利用するなど，別途考察する必要があると考えられる．
空欄より前の情報から推定する MF と空欄の前後の情報から推定する MF B の間には約 7%の正解率の差があった．空欄より前の情報だけでは演算子の候補を絞りきれない場合に，空欄より後の情報も用いることによって正しく推定できるようになったと考えられる．演算子の種類や空欄の場所により，空欄の前後の情報のどちらが演算子を正しく推定するための情報として有用であるかが変化することが考えられる．
表 5 より，MF と MB の学習時間と推定時間に差があるのは空欄前後のトークンの数が異なるためであると考えられる．空欄より前の部分のトークン tF には import
文やクラス名などがトークンとなって含まれており，空欄より後の部分のトークン tB に比べてトークンの量が多くなる傾向があると考えられる．それぞれの合計ファイルサイズを測定した結果，tF は 26 MB，tB は 16 MBであった．

は 181 秒でありテストデータのファイル数は 2,204 個であるので，1 つの演算子を推定するのに約 0.08 秒の時間を要することがわかる．また，MR は学習モデルではないため計測していない．

7. 考察
7.1. 研究設問への回答
実験結果をもとに，研究設問に回答する．

RQ1: 空欄より前の情報から空欄に入る演算子をどの程度の精度で推定できるか．
約 65%の正解率で推定できた．
RQ2: 空欄より後の情報から空欄に入る演算子をどの程度の精度で推定できるか．
約 61%の正解率で推定できた．
RQ3: 空欄以外の情報から空欄に入る演算子をどの程度の精度で推定できるか．
約 72%の正解率で推定できた．
RQ4: 以上の 3 つの方法で推定した結果に差異はある
か．
4〜11%程度の正解率の差があった．
7.2. 結果全体に関して

7.3. 妥当性への脅威

表 3 より， ’+’ はソースコードに出現する演算子の約本研究ではソースコードをトークンに変換するため自4 割を占めるが，他の演算子の出現率は 1 割程度以下となっている． ’+’ を除くと演算子の出現率の偏りが小さいことから，重み付けされた確率からランダムに推定する手法の正解率は低くなることが予想され，その結果は
表 4 より約 19%となった．一方，提案手法では最大 72%の正解率を得ることができた．これらの結果から，空欄の前後のソースコードと欠落した演算子の間には何らか作したトークナイザを使用している．しかし，一部のソースコードに対してこのトークナイザを適用する場合に不具合があることが確認されている．例えば， ’<’ や ’>’ が演算子として使われていない場合でも演算子として扱ってしまう．そのため，構文解析を利用するなどして，より精度の高いトークナイザを準備する必要があると考え

92

SEA

ソフトウェア・シンポジウム2019 in 熊本

られる．

今後の課題としては，トークナイザやモデルの改良，空欄より前の情報から推定する MF は後の情報から推実験対象となる演算子や言語を追加して汎用性を向上さ定する MB に比べて正解率が 4%程度優れていた．しかせることが挙げられる．

し，7.2 節にて言及した，トークンファイル tF と tB の参考文献

間にサイズ差があることが MF と MB の推定精度の差に影響することが考えられる．そのため，空欄より前の[1] Y. Yang，K. Sakamoto，H. Washizaki, and Y.
Fukazawa, “A tool for suggesting similar program
element modifications,” 研究報告ソフトウェア工学（SE）, vol.2014, no.20, pp.1–6, jul 2014.

部分と後の部分のどちらがより多くの特徴量を含んでいるか議論するには，トークンファイルに手を加えるなどして検証する必要がある．

7.4. 今後の課題[2] 山本哲男，吉田則裕，肥後芳樹，“ソースコードコーパスを利用したシームレスなソースコード再利用手法，” 情報処理学会論文誌，vol.53，no.2，pp.644–652，
feb 2012．

LSTM 層の多層化
本研究で作成したモデルでは LSTM を 1 層だけ使用している．LSTM を複数使用して層を深くすることによりモデルの表現力が増し性能が向上することが一般的に示されている．ただし，層を深くしすぎると反対に性能が下がる場合もあるので，適切な深さを調整する必要がある．本研究のモデルはそのような調整を行っていないので，LSTM 層の深さを調整する必要がある．

[3] Keras, Home - Keras Documentation, （オンライン）, 入手先〈https://keras.io/ja/〉（参照 2019-213）.
[4] D.P. Kingma and J. Ba, “Adam: A Methodfor Stochastic Optimization,” arXiv e-prints,p.arXiv:1412.6980, Dec. 2014.

演算子の種類の追加
本研究では推定する演算子の種類を限定した．しか[5] The Apache Software Foundation, Welcome to The
Apache Software Foundation!, （オンライン）, 入手
先〈https://www.apache.org/〉（参照 2019-2-1）.

し，実用することを視野に入れるには推定できる演算子の種類を増やす必要がある．そのため，実験対象の演算子の種類を増やし，モデルやパラメータの調整をする必要がある．
他の言語での実験
本研究では Java のみを実験対象とした．他の言語に対応したトークナイザを用意することで，様々な言語のソースコードを対象に実験を行うことができる．それぞれの言語に対応させるため，実験を行いモデルの改良をする必要がある．

8. まとめ本研究では，ソースコードをトークンに変換して機械学習モデルの入力とすることで空欄に当てはまる演算子を推定する手法を提案した．実験の結果，61〜72%の正解率で推定できた．このことから，ソースコードには空欄に入る演算子を推定するための特徴が含まれており，深層学習を用いることでその特徴を学習できると考えられる．

93SEA