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

プログラム言語の構文情報を用いたLSTM によるコメントの自動生成
大西 朔永 1
行本 典弘 2
椎名 広光 3岡山理科大学 総合情報学部 情報科学科 1,2,3

i16i014os@ous.jp1 , i16i087yf@ous.jp2 , shiina@mis.ous.ac.jp3

1

はじめに
近年，AI やビックデータなど IT 技術の発展に伴い，プログラミングに関心が集まっている．これらの影響により，プログラミングの学習者が増加傾向にある．
プログラミングの学習では，プログラミング言語の文法の学習だけでなく，プログラムに必要な処理とその手順を理解することが重要である．
プログラムのソースコードからコメント（手順）を自動生成することで，プログラムの理解の補助になることを目的としている．プログラムコードの一行単位
図 1: 構文木を用いたコメント生成の概要

ではなく，ブロック単位のコメント生成やプログラムの仕様書の作成を最終目的としている．
関連するプログラムのコメント生成に関する研究と依存関係を捉えた分散表現を Encoder 側の LSTM へして，LSTM[1] によるソースコードとコメントのペアの入力に用いることで，依存関係を捉えたコメントのを用いたプログラムコメントの自動生成，外部情報を生成を試みている．また，依存関係を Word2Vec で捉利用したプログラムコメント自動生成 [2] がある．ソーえることが有効性を検証するために，乱数による初期スコードからのコメント生成の精度向上を目的とし，値を分散表現に用いた場合 (構文情報による初期分散外部情報として変数の情報を問題文から取り出し，コ表現) についても実験している．

メントの生成時に利用している．また，構文情報を用いたコメント生成の先行研究としては，Java プログ
ラムの構文を辿るコメント生成 [3] が提案されている．

2

本研究では，構文情報を用いて一行単位のプログラ

LSTM による構文情報からのコメント生成ムコメント生成を行っている．ソースコードの一行にEncoder-Decoder 翻訳モデルを利用する場合，入力対応する構文情報とコメントのペアをニューラルネッ
トワークの LSTM を用いた Encoder-Decoder 翻訳モ
デル [4] により学習し，新規ソースコードのコメント生成を行っている．学習データとして，岡山理科大学総合情報学部情報科学科の講義で使用された C 言語のプログラムを用いている．と出力の単語列を学習に利用する．2 つの表面的な文字列の組を直接的に利用し，プログラムのソースコードからそれに対応するコメントを生成する場合でも，ソースコードのトークン列とコメントのペアを学習するのが通例と考えられる．
一方，本研究では，Encoder 側の LSTM の入力をプログラムのソースコードのコメント生成には，ソースコードの行を跨いだ依存関係が強く関わると考えられる．本研究ではコード間の関係を深く取得するために，プログラムのソースコードの構文木を入力として，事前に Word2Vec[5] を用いて分散表現を構築し，そのソースコードのトークン列から構文木のノード列に変更している．ソースコードの 1 行に当たるノード列を入力し，そのソースコードに対応するコメントを正解コメントとし，学習を行った．

― 1201 ―Copyright(C) 2020 The Association for Natural Language Processing.
All Rights Reserved.

図 2: Word2Vec による構文情報の分散表現の構築

2.1

pycparser(構文解析器) によるソースコードの構文情報の生成

C 言語のソースコードの構文解析をするために，Python のライブラリである pycparser[6] を用いた．
生成された構文木 (構文情報) を辿ることで，ノードの場合の構文木の内側部分木と外側部分木の例を図 2 に示す．

2.2.2

Word2Vec の学習による分散表現の構築を用いて生成した総和を求めるソースコードの構文木

2.2.1 において述べた処理ノードの内側部分木と外側部分木の構文情報と処理ノードを Word2Vec のCBOW モデルに入力し，学習を行った．ソースコー

を図 2 に示す．図 2 の “While” の左部分木が条件文，ドにおける単語の近さではなく，構文木におけるノー右部分木はブロック内の処理に対応する．

ドの近さ (hops) を考慮することで，プログラムの構内側と外側の構文情報を得ることができる．pycparser

造を捉えた分散表現の構築を行う．

2.2

2.2.1

Word2Vec による構文情報の分散表現の構築

2.3

構文情報の取得

Encoder-Decoder 翻訳モデルによるコメント生成

本研究では，Word2Vec の CBOW モデルを用いて，ソースコードの一行に対応する構文木を辿って得生成された構文木から各ノードの分散表現の構築を行られるノード列とコメントのペアをニューラルネット

う．通常，CBOW モデルは Wikipedia などの自然言ワークの LSTM を用いた Encoder-Decoder 翻訳モデ語のコーパスを用い，コーパス中の各単語を中心としルで学習させた．Encoder-Decoder 翻訳モデルでは，て前後 n 単語から中心の単語を推論するタスクを学習
それに対して，本研究では，ソースコードから生成

Encoder 側が入力された構文木のノード列を分散表現に変換し，Decoder 側ではその分散表現をもとに入力された正解コメントを生成できるように学習を進めてされた構文木を用い，構文木の各ノードを中心としていく．そして，学習した Encoder-Decoder 翻訳モデル

内側部分木と外側部分木から中心のノードを推論するを用いて，新規ソースコードのコメント生成を行う．

タスクに変更している．最大の特徴は，通常の CBOWジ数が hops 以下のノードから成る内側部分木と外側

Encoder 側の LSTM の入力としてはソースコードに対応する構文木を行きがけ順で辿ったノード列である．
ここで，Encoder 側の LSTM へ入力する各ノード部分木に変更していることである．なお，hops = 2 のの分散表現に 2.2 で述べた Word2Vec により構築したする．

モデルにおける前後 n 単語を，中心のノードまでのエッ― 1202 ―Copyright(C) 2020 The Association for Natural Language Processing.
All Rights Reserved.

図 3: 学習済み分散表現を用いた Encoder-Decoder 翻訳モデル分散表現を用いている．構文木におけるノードの近さ(hops) を考慮した学習済み分散表現を利用することに

表 1: 生成コメントの全体評価
プログ

ソースコードの構文情報による構文情報によるより，プログラムの構造を捉えたコメント生成が可能

ラム

トークンモデル

初期分散表現学習済み分散表現かを実験している．また，依存関係を Word2Vec で捉

P1

4.45

4.585.56えることが有効かを検証するために，各ノードの分散

P2

3.30

4.03

3.82

P34.12

4.83

3.79

P44.58

4.17

4.50

分散表現に用いた場合 (構文情報による初期分散表現)

P54.394.77

4.52も評価している．

平均

4.17

4.48

4.44

表現を Word2Vec で学習せずに，乱数による初期値を較すると構文情報を用いたモデル双方とも評価の平均

33.1

構文情報を利用した LSTM によが高くなっている．Encoder 側の LSTM の入力には，る生成コメントの評価ソースコードに対応する構文木を行きがけ順に辿った実験環境た可能性が考えられる．また，学習済み分散表現の使ノード列を用いたため，辿り方が評価に影響を与え学習データとして，大学の情報科学科の講義で使用された C 言語のプログラム 30 個を用いた．評価したモデルは，ベースラインとしてソースコードによる分散表現のモデル，構文情報による分散表現のモデル，構文情報による学習済み分散表現のモデルの 3 種類である．生成コメントの評価は，オープンテストにより，評価している．評価方式については，5 種類のプログラムを対象に，6 人の大学 4 年生による 1 から 6 の 6段階での評価を行った．

用の有無を見ると，使用しない方が微差ではあるが，0.04 高いという結果となっている．構文情報による学習済み分散表現の評価が学習済み分散表現を使用しない場合と比べて，1.04 低いプログラムも存在する．しかし，評価値の差があまり開いていないこと，学習済み分散表現を用いた方が評価が高いプログラムがあることから，構文情報の分散表現の構築方法の工夫により，評価の向上がみられる可能性がある．
表 1 の P1 に対するコメントの生成例と評価を表 2に示す．4 行目では，ソースコードによる分散表現のモデルよりも，構文情報を用いたモデル双方とも評価3.2が高くなっている．また，7 行目では，ソースコード生成コメントの評価

6 人による評価の平均を表 1 に示す．評価結果としては，ソースコードのトークンを利用したモデルと比による分散表現のモデルは，代入しか取れておらず，構文情報による分散表現のモデルは，数値１しか取れ― 1203 ―Copyright(C) 2020 The Association for Natural Language Processing.
All Rights Reserved.

表 2: コメントの生成例と評価 (プログラム例 P1)
行

ソースコードのプログラム

トークンモデル

評価

構文情報による初期分散表現

構文情報による評価

学習済み分散表現

評価

1

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

5.83

main 関数の宣言

5.83

main 関数の宣言

5.83

2

int i, n;整数型変数を宣言

5.83

整数型変数を宣言

5.83

整数型変数を宣言

5.83

3

int fact;

整数型変数を宣言

5.83

整数型変数を宣言

5.83

整数型変数を宣言

5.83

4printf( n= );

=2.00

n=を表示

5.50

n=を表示

5.50

5scanf ( %d , &n);

数値の入力処理

5.83

入力の処理

4.67

数値の入力処理

5.83

6fact = 1;

1 を代入

5.83

1 を代入

5.83

1 を代入

5.83

7

i = 1;

0 を代入

2.33

1 プラスする

3.67

1 を代入

5.83

8while(i <= n){

条件を満たすまで繰り返す

5.83

条件を満たすまで繰り返す

5.83

条件を満たすまで繰り返す

5.83

9

fact = fact * i;

積を代入

5.83

積を代入

5.83

積を代入

5.83

10i ++;

01.00

<eos>

1.00

i プラスする

3.50

11}

整数型変数を宣言

1.50

そうでない場合

1.33

ブロック終了5.8312printf( n!=%d\n , fact);

n を表示

3.00

n!=fact を表示

5.83

n !=fact を代入

4.67

13return(0);返り値 0 を返す

5.83

返り値 0 を返す

5.83

返り値 0 を返す

5.83

14}

ブロック終了5.83

そうでない場合

1.00

ブロック終了5.83

平均4.45ていないが，構文情報による学習済み分散表現のモデ

4.58

5.56

参考文献

ルは，Word2Vec で構文情報を事前学習したことにより，その両方とも含んだコメントをとることができている．

[1] 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

まとめと今後の課題
本研究では，ソースコードとコメントのペアではなく，ソースコードの構文木とコメントのペアを対訳[2] Akiyoshi Takahashi, Hiromitsu Shiina, Nobyuki
Kobayashi, “Automatic Generation of Program
Comments based on Problem Statements forComputational Thinking”, IIAI International
Conference on Advanced Applied Informatics

データとして学習させ，プログラムに必要な処理とその手順を理解するための手順生成を行った．また，

Word2Vec を用いて，構文情報の分散表現を構築し，その分散表現を Encoder 側の LSTM への入力とすることで，プログラムの構造を捉えたコメントの生成を

2019, pp.629-634, 2019.
[3] Xing Hu, Ge Li, Xin Xia, David Lo, Zhi Jin,
“Deep Code Comment Generation”, ICPC, pp.

試みた．ソースコードを直接 Encoder 側の LSTM に200-210, 2018.

入力するよりも構文情報を生成し入力した方が良いことが確認できた．また，学習済み分散表現の使用の有[4] Minh-Thang Luong,

今後は，構文情報の分散表現を用いて，構造上の類似性を測り，似ているプログラムを参照し，コメントト生成や仕様書の生成が課題である．また，構文情報の分散表現の構築方法においても，入力の順序関係をChristo-pher D. Manning, “Eﬀective Approaches toAttention-based Neural Machine Translation”,
EMNLP, pp. 1412-1421, 2015.

無には，大きな差が見られなかった．

生成に応用する．プログラムのブロック単位のコメン

Hieu Pham,[5] Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean, “Eﬃcient estimation of word representations in vector space , arXiv preprint

考慮しない点や内側と外側の違いをあまり考慮できて

arXiv:1301.3781, pp. 1-12, 2013.

いない点など課題がある．

[6] Eli Bendersky, “GitHub – eliben/pycparser:
Complete C99 parser in pure Python”,
https://github.com/eliben/pycparser, 2019-0715 参照.

― 1204 ―Copyright(C) 2020 The Association for Natural Language Processing.
All Rights Reserved.