言語処理学会 第25回年次大会 発表論文集 (2019年3月)

LSTM による外部情報を利用したプログラムコメント自動生成
高橋 明義 1
椎名 広光 2
小林 伸行 3岡山理科大学大学院 総合情報研究科 情報科学専攻 1
岡山理科大学 総合情報学部 情報科学科 2
山陽学園大学 地域マネジメント学部 地域マネジメント学科 3

i18im03ta@ous.jp1 , shiina@mis.ous.ac.jp2 , kob nob@sguc.ac.jp3 ,1

はじめにプログラミング教育については，いろいろな試みがなされており，Web を利用した支援システム [1] やプ
ログラムの処理をカード型での学習 [2] などが提案されている．プログラミング教育のカリキュラムに関しては，ルーブリック [3] が提案されている．また，プログラミング的思考の重要性が言われており，プログラムそのものではなく手続きの記述と組み立てがが重要になってくると考えられる．
本研究では，プログラムの理解や手順の理解を助けるために，ソースコードから手続きを自動生成することでプログラムの理解の補助となることを目的としている．一方，ニューラルネットワークを利用した手法の発展により，自然言語の翻訳や文生成が行われている．特に LSTM を用いた Encoder-Decoder 翻訳モデルが提案されてきており，翻訳精度が向上している．
本研究では，大学の情報系学科 1 年生での講義に使われた C 言語の例や課題のプログラム 53 個を利用して，プログラムリストの 1 行とコメントのペアをニューラルネットワークの LSTM を用いた Encoder-Decoder モデルで学習することで，新しいプログラムのコメントや手続き (コメント) の生成を行っている．

図 1: Encoder-Decoder 翻訳モデルによる学習とコメント生成の概要
め，プログラムの変数に関する流れが分かりにくい傾向にある．そこで本研究では，(1) 外部情報の利用として，課題の問題文の重要語を生成結果に影響を与えるような処理，(2) 変数情報をコメント生成に反映させる処理のを新たに追加することで，課題の問題文に近くてより良いソースコードのコメントを生成することを目標としている．

ントの学習を適用するだけでは，利用者の立場からはLSTM によるソースコードからコメント生成生成されたコメントの評価が良くない場合がある．そコメント生成に対する Encoder-Decoder モデルのの原因として，もともと学習用に使われているソース

学習とコメント生成の処理は，次の 3 つの処理からなコードだけでは，コメントを生成するには，学習量とる (図 1)．

ともに関連する情報が不足していることが問題と考え(1) 学習：コメントがついたプログラムリストを教師られる．加えて，プログラムリストからのコメント生データを分離し，プログラムリストの変数名の整理を成については，学習段階を考慮すべきで，大学生レベ行った後プログラムリストの 1 行とそのコメントのペルにおいては，変数の変化について知る必要がある．

アを Encoder-Decoder モデルの学習を行う．

しかしながら，もともと学習用に使われているソース(2) コメントの生成確率：コメントの付いていないプログラムに対して Encoder-Decoder モデルを利用してしかしながら，単純に LSTM をソースコードとコメコードだけでは，変数に関する情報が不足気味なるた2― 1367 ―Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

表 1: 課題の問題文における単語の TF–IDF
単語TF–IDF

単語TF–IDF

最小

0.455410.40027

ただし0.22770.2277

用い

配列

0.385940.32545

数値
scanf
添字

0.249590.249590.24959

最大格納図 2: LSTM の構成いる
求める
整数せよ
出力

0.16841
0.16272
0.131
0.09828
0.09667

図 4: TF–IDF による問題文の影響によるコメント

図 3: 問題文を加味したコメント生成処理の概要

生成
コメント生成での単語連接確率を生成し，コメントの付いていないプログラムの課題の問題文の重要語を，コメント生成での単語連接確率に影響を与えるようにする．

(3) コメントの修正：生成したコメントについては，変数情報を補完して最終的な生成コメントとする．

(2) (1) で行った学習をもとに新たなプログラムに対するコメントを生成する．プログラムを単語ごとに分割して LSTM に入力していき，最後まで入力を行った
後に文脈情報をもとにコメントの 1 つ目の単語を出力し，出力された単語と文脈情報をもとに次の単語を生成する．

2.1

Encoder-Decoder モデルの学習と生成

2.2

外部情報を利用したコメント生成

これまでプログラムのソースコードとそのコメント

本研究で用いた LSTM の学習については，つぎの3 つ変換処理を組み合わせている．の行単位のペアを学習し，新しいソースコードに対し(1) ソースコードとコメントをそれぞれ単語単位に分割し，1 行ごとに単語のつながりの関係性を学習する．てコメントを生成している．この場合，利用できる情単語に分割したソースプログラムを 1 単語ずつ LSTM成を行うと考えられる．しかし，それだけでは課題にに入力し，文脈情報を蓄積する．その後コメントを 1対応するソースコードのコメントを生成するには利用

単語ずつ LSTM に入力し，文脈情報を蓄積しながらする情報が不足している．本研究では，課題の問題文単語を生成して学習を行う．入力単語 xi に対しては，に関連する情報をコメント生成に生かすように，外部中間層の出力 hi を保持しておき，出力単語 yt と xi の情報の利用として課題の問題文の重要語を生成結果に報が，類似するソースコードに対応するコメントの生類似度を正規化し αt とする．この αt と hi を使い文影響を与えるようにした (図 3)．課題の問題文の中か脈ベクトル ct を作り，線形作用素 W で重みをつけて活性化関数 tanh により中間層の出力 hˇt を作る．hˇt をしている．重要語によるコメント生成の手続きを次に入力として softmax 関数による変換 yt を作る.

ら重要となる単語を抽出するのには，TF–IDF を利用述べる．

― 1368 ―Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

表 2: 生成コメントに対する TF–IDF と変数情報の適用
行

TF–IDF 適用前の生成コメント

プログラム

TF–IDF 適用後の生成コメント

TF–IDF 適用＋変数情報を適用

適用前

評価
TF–IDF 後

変数

1#include < stdio.h >入出力を行うための宣言

入出力を行うための宣言

入出力を行うための宣言

4442#define NUMBER 5

文字列を表示する

配列の大きさを宣言

配列の大きさを定義づける

1

4

4

3

int main(void){main 関数の宣言

main 関数の宣言

main 関数の宣言

4

4

4

4

int i, j;

整数型変数の宣言

整数型変数の宣言

整数型変数 (i)(j) の宣言

4455

int min, max ;整数型変数の宣言

整数型変数の宣言

整数型変数 (min)(max) の宣言

4456

int min loc, max loc ;整数型変数の宣言

整数型変数の宣言

整数型変数 (min) の宣言

4427int vx[NUMBER];

整数型の配列の宣言

整数型の配列の宣言

整数型変数 (vx) の宣言

443

配列内の添え字すべてに配列内の添え字 (i) すべてに数値を入力させる

数値を入力

433配列の表示

4428for(i=0;i < NUMBER;i++){

定義づけた回数分ループ
配列のすべての添え字内

配列のすべての添え字内に数値を入力に数値を入力

scanf(%d”,&vx[i]);

整数を入力

整数を入力

整数を入力 (i)(vx)443}

そうでない場合

そうでない場合None

11512min=vx[0];min の初期値を vx[0] とする

最小値の値を記憶

配列の文を表示34113min loc=0;min のあり場所を 0min のあり場所を 0

最小値の定義づけ

33114max=vx[0];max の初期値を vx[0] とする

max の初期値を vx[0] とする

x の計算

33115

max loc=0;

max のあり場所を 0

max のあり場所を 0

最大値 (max) の文章を表示

33116for(i=1;i< NUMBER;i++){

定義づけた回数分ループ定義づけた回数分ループ

33217if(min > vx[i]){min の方が大きい場合

min の方が大きい場合

min の方が大きい場合

3

3318

min=vx[i];最小値の値を記憶最小値の値を記憶計算を行う (i)(min)43119

min loc=i;最小値の場所を記憶

最小値の場所を記憶

最小値の場所 (i) を記憶

33420}

None

None

None

55521if(max < vx[i]){max の方が小さい場合

max の方が小さい場合

max の方が小さい場合

33322max=vx[i];max はいつも一番大きく最大値の値を記憶計算を行う (i)(max)14223max loc = i;max のあり場所を 0

最大値の場所を記憶

最小値の場所 (i) を記憶

14224}

行内の繰り返し

None

None

15525}

そうでない場合数値を入力する

None

1

1526printf(“最小値%d, 添え字%d \n ”, min, min loc);

最小値と添え字を表示

最小値と添え字を表示

最小値 (min) と添え字を表示

445

最大値と添え字を表示

最大値と添え字を表示

最大値 (max) と添え字を表示

4459printf(”vx[%d]=”,i);101127printf(“最大値%d, 添え字%d \n ”, max, max loc);

配列内の添え字 (i)すべてに数値を入力

28return(0);関数を終了させる

関数を終了させる

関数を終了させる

44429}

そうでない場合数値を入力するNone115(1) はじめに元となる問題全体の文書を読み込んでおく．その後入力するプログラムの問題文を入力し，TF–IDF により文書全体に対する問題文中の各単語の重要度を求める．
(2) ソースコードを LSTM に入力していき，単語の出力時に出力確率上位 5 単語を取り出す．その 5 単語のうち問題文中の重要語にマッチする単語があった場合，生成確率に対して TF–IDF の α(= 10) 倍を掛け，その中の数値の一番高いものを LSTM の出力とする．
学習に利用している課題 53 個の問題文を全体とし

問題文



配列 5 個の数値 (整数) を，scanf を用いて格納し最大値と最小値を求める．ただし，最小値と最大値の格納されている配列の添字も出力せよ．

また，次に示す問題文に対するプログラムリストからコメントを生成する時，TF–IDF 値の高い「配列」をコメント生成に利用している様子を図 4 に示す．

コメントに変換するプログラムリスト#define NUMBER 5て，次の問題文の単語 TF–IDF を表 1 に示す．

2.3

生成コメントへの変数情報の補完プログラムリストからのコメント生成については，学習段階を考慮すべきで，初心者段階では変数を意識― 1369 ―Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

しなくてもよいと考えられる．しかし，次の段階を想コメントが 12 と多く，評価平均が 0.7 低くなって定すると変数の変化について知る必要がある．また，いる．変数の情報については，改悪されたものももともと学習用に使われているプログラムリストだけあり適用個所の工夫の必要があると考えられる．

では，変数に関する情報が不足気味なるため，プログラムの変数に関する流れが分かりにくい傾向にある．

4

次に変数名の処理と補完の処理について述べる．

(1) プログラムリストの変数名の変更処理
まず学習用ソースプログラムの変数を同じものに統一する (例:min → x , vx → x)．次に学習用コメント内の変数情報を付与する部分を仮に (x) と置く．そして変数情報の処理をした学習データを繰り返し学習する．

(2)Encoder-Decoder 翻訳モデルによる変数名補完処理
学習データと同じようにテストデータも変数の統一を行う．コメント生成時に変数情報を適用するために，テストデータから各行の変数情報を取得しておく．(1)

まとめと今後の課題
本研究では，ソースコードとコメントのペアを対訳データとして学習することで，アルゴリズムの手順を理解するために，手順生成を行った．特に，変数情報の追加，外部情報としての課題の問題文の利用によって，コメントの生成が関係のない内容を取り出してくることが少なくなったと考えられる．本研究では，外部情報としては課題の問題文を利用しているが，講義資料などの関連する情報を利用することで，より適切なコメントを生成することができると考えられる．の学習データをもとにテストデータに対するコメントを生成する．このコメントの変数情報は統一されたも参考文献のが出力されるので，各行の変数情報を適用する．

3[1] 宇野健，畝川みなみ, “C 言語学習支援のためのWeb 上でのプログラミング環境の開発, Journalof the Faculty of Management and Information

生成コメントの評価

System Prefectural of University of Hiroshima,
No. 5, pp. 77-84. 2013.

LSTM だけで生成したコメント，問題文の単語のTF–IDF を考慮して生成したコメント，変数情報の補完処理をしたコメントの３つを表 2 に示す。また，生成されたコメントを 1〜5 で評価した結果についても
表 2 に示す。

[2] 松本，林，平島, “部分間の関係を考えることに焦点を当てたカード操作によるプログラミング学
習システムの開発, 電気学会論文誌 C, Vol.138,
No.8, pp.999-1010, 2018.

• 表 2 の 2 行目は TF–IDF の適用により「文字列」→「配列」となり適用前より正しいコメントが生[3] 松永，萩谷, “共通教科情報科ルーブリックにお成された．12，13 行目などは中途半端に単語が変ける思考・判断・表現の位置づけ,換されたことにより統一性のないコメントになっ高等学校情報研究会発表会全国大会 (東京大会),ている．全体を見ると TF–IDF 適用前に比べて2017.

第 10 回全国

4 つのコメントの評価が高くなっており，評価の平均が 0.45 高くなっている．問題文の情報に関連させることで，生成したコメントの評価が改善[4] Greﬀ, K. et al., “LSTM: A Search Space
Odyssey, IEEE Transactions on Neural Networks and Learning Systems, Vol. 28, Issue10,
pp. 2222-2232, 2017.

されたと考えられる．

• 変数情報については，4，5 行目など正しい変数情報が適用されたが，6，7 行目などは変数情報の取り出しがうまくいかず付与された変数情報が間違っている．また，変数を統一した影響で 12〜15 行目のような元の変数情報の影響を強く受けたコメントなどが悪くなっている．変数情報の補
完は，TF–IDF 適用のコメントと比べて評価が高くなったコメントが 8 つだが，評価の低くなった― 1370 ―Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.