情報処理学会研究報告
IPSJ SIG Technical Report

ソースコードのグラフ表現を利用した深層学習による
コーディングの専門性の判定手法
松井 智寛1,a)

松下 誠1,b)

井上 克郎1,c)

概要：ソフトウェア開発者のコーディングの専門性を客観的に判定するため，ソースコードを利用した機械学習・深層学習による判定が行われている．しかし，この種の手法は予約語の利用頻度とメトリクス，
もしくは出現する単語とその順序関係のみを学習モデルへ入力しており，ソースコードの特徴的な構造に関する情報や変数などの意味的な情報をほとんど利用していない．そこで本研究では，ソースコードを構造に関する情報や意味的な情報を表現できるグラフへ変換し，グラフを学習することができる深層学習を利用して能力の判定を行う手法を提案する．提案手法を用いて実験を行った結果，既存手法に比べて高い精度で判定を行えることがわかった．
キーワード：コーディング，専門性，深層学習，プログラミングコンテスト

1. まえがきのパラメータ推定を利用したもの [19] がある．しかし，機械学習・深層学習を利用するものは，ソースコードの特徴

ソフトウェア開発において，企業は必要なコーディン的な構造に関する情報や変数などの意味的な情報を利用しグの専門性を持つ開発者を採用し，開発プロジェクトにていない．またパラメータ推定を利用するものは，推定に配置することが必要になっている．たとえば Facebook や

必要なソースコードの量が多いといった欠点がある．

Google，Amazon といった技術系の企業では，採用の場面

そこで本研究ではまず，ソースコードの構造に関する情でコーディングの課題を実施することで応募者の専門性を報や変数の意味的な情報をグラフとして表現する．またグ測っている [11]．しかし，このような場面で人によるソーラフを学習することができる RGCN[20] を利用してソース

スコードの評価を行うと非常に大きなコストがかかってしコードから開発者の専門性を予測する手法を提案する．

まう．そのため，コストがかからない方法で開発者の専門性を判定する必要がある．

手法の評価には，既存研究 [13], [14], [15], [16] で用いられたプログラミングコンテストのデータセットと判定手法

開発経験が長いほど専門性が高い，といった評価が行わを利用する．コンテストの参加者は成績によって順位がつれることがある [21]．しかし，開発者の経験と専門知識にけられ，レーティングが変動する．問題を解いて実装する関する調査 [2] では一貫した結果が得られておらず，開発経能力，すなわちコーディングの専門性が高い開発者が良い

験の長さを利用して専門性を予測すると採用の決定を間違順位を取り，レーティングが高くなると考えられるため，えてしまう可能性があり，仮に採用決定を間違えてしまっ

レーティングが高い開発者から上級者・中級者・初級者とた場合のコストはその従業員の年俸の 10 倍になるとも言分類を行う．この 3 値分類による学習・評価を既存手法とわれている [3]．

提案手法で行い，結果を比較したところ，提案手法は既存開発者の専門性はソースコードの質に現れるとされてい手法に比べて精度が高い予測を行えることが確認できた．

る [2]．そのため，ソースコードから開発者の専門性を予測

以下，2 節では，本研究の背景として，プログラミングできると考えられる．これまでにソースコード自体から開コンテストと機械学習・深層学習を用いた専門性の判定手

発者の専門性を予測する方法として，機械学習や深層学習法，ソースコードのグラフ表現について説明する．3 節でを利用したモデル [9], [13], [14], [15], [16] や，Zipf の法則

は提案手法について説明する．4 節では評価実験の内容と

1
a)
b)
c)

大阪大学大学院情報科学研究科
t-matui@ist.osaka-u.ac.jp
matusita@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

c 1959 Information Processing Society of Japan
⃝

結果について説明し，考察を行う．最後に 5 節ではまとめと今後の課題について述べる．

1

情報処理学会研究報告
IPSJ SIG Technical Report• 参加人数：偏りが大きいが，毎コンテスト 10000〜

2. 背景
評価対象のデータセットとして利用するプログラムコン
テストとその採点に利用されるオンラインジャッジシステ
ム，既存の機械学習・深層学習を用いた判定手法，ソース
コードのグラフ表現について説明する．プログラミングコ
ンテストについてはさまざまなものが存在するが，本研究では問題の要求を満たすプログラムを時間内に作成することを競うコンテストを対象とする．

2.1 プログラミングコンテスト
プログラミングコンテストはプログラミングの能力や技術を競い合うコンテストのことである．オンラインジャッ
ジシステムが採用されており，同じ問題に対して，同じ時間内に複数の参加者がソースコードを記述し，提出する．
コンテストが終了すると，正解問題数や回答時間に応じて参加者の順位が決定し，レーティング [6], [18] が変動する．プログラミングコンテストには Codeforces*1 のように個人でプログラムを作成して回答するもの以外にも，ACM

ICPC*2 のように複数の参加者がチームを組んで回答するものも存在する．本研究では，個人で参加するプログラミ
ングコンテストである Codeforces を対象とする．

2.1.1 ルールと流れプログラミングコンテストの Codeforces の大まかな流れについて説明する．Codeforces における一般的なコンテ
ストでは，コンテストの開始時間が指定されており，開始時間になるとコンテストの問題が公開され，参加者は問題を解き始める．問題を解く順序や，用いるプログラミング
言語は自由であり，得点は解いた問題の難易度や回答にかかった時間，これまでの提出回数によって変わる．また，参加者は制限時間内であれば，同じ問題に対して何度も回答を提出することが可能であり，回答ソースコードの正誤やコンパイル可能性については提出の可否に影響しない．
回答ソースコードは，提出された時点でオンラインジャッ
ジシステムによって事前テストの実行が行われ，通過したか否かが参加者に通知される．事前テストは全テストケースを網羅しておらず，事前テストを通過しても回答が正しくない場合もある．コンテスト時間終了後に提出ソース
コードに対して最終テストが実施されることによって，参加者の最終的な得点が決定する．また，点数の高い順に順位を決定し，その結果レーティングが変動する．

2.1.2 開催規模や参加者
本研究で利用する Codeforces においては，開催規模や参加者は以下の通りになっている．

• 開催頻度：偏りはあるが，大体週に 1 回以上*1*2

http://codeforces.com/
https://icpc.baylor.edu/

c 1959 Information Processing Society of Japan⃝

30000 人程度
• 国籍：全世界から参加（使用言語はロシア語・英語）
Codeforces では，過去 6 か月以内に一度でもコンテストに参加したことのあるユーザーをアクティブユーザーと定義しているが，そのアクティブユーザー数は 2022 年 1 月 6
日現在，108310 人となっている．

2.1.3 レーティングシステム
Codeforces は参加者の熟練度をレーティング [18] を用いて表している．コンテストが行われるたびに参加者のレー
ティングが順位によって変動する．レーティングの計算方
式はチェスなどの対戦型の競技で用いられるイロレーティ
ング [6] と呼ばれる方式に似たものとなっている．本研究では，既存の研究 [13], [14], [15], [16] と同様に，このレーティングが高い参加者を専門性が高い参加者として扱う．

2.2 オンラインジャッジシステム
プログラミングコンテストにおいて，その採点に利用されるオンラインジャッジシステムについて説明する．オン
ラインジャッジシステムにはさまざまな問題が収録されており，その利用者は問題を選択し，回答を提出する．その後，システムは利用者に提出された回答の採点結果を通知する．採点の基準の一例を以下に示す．

• コンパイルできるかどうか• 不正なメモリアクセスがないかどうか• 制限時間内にプログラムが終了するか
このような基準の内，満たさない基準があればそのことを通知し，すべての基準を満たせば正解であることを通知する．
こういったオンラインジャッジシステムの一例として，国内では AIZU ONLINE JUDGE*3 ，国外では Topcoderといったものが存在する．

2.3 機械学習・深層学習を用いた専門性の判定手法
ソースコードそのものを用いて機械学習や深層学習によって専門性を判定する手法には，ソースコード中の予約語の利用頻度やソースコードから計測できるメトリクスを利用した機械学習による手法 [13], [14], [15], [16] やソース
コードを単語毎に分割して自然言語のように扱った深層学
習による手法 [9] が存在する．
槇原 [13], [14] はプログラミングコンテストに提出されたソースコードを対象とした学習を行った．プログラミングコンテストの上級者と初級者の特定の予約語の利用頻度やメトリクスの値の違いは堤 [22] によって確認されている．
そこで槇原はプログラミングコンテストのレーティングをもとに参加者を上級者と初級者に分類し，ソースコードを*3

http://judge.u-aizu.ac.jp/onlinejudge/2

情報処理学会研究報告
IPSJ SIG Technical Report

堤により確認された上級者または初級者で利用頻度が高いになった．このグラフ表現とグラフを対象とした深層学習

if や for 等の予約語の利用頻度とソースコードの行数やクのグラフニューラルネットワークの 1 つである GGNN[12]ラス数等のメトリクスの値から成るベクトルに変換して決を利用して，変数の利用箇所の中から 1 つを空けたソース

定木や SVM で学習を行うことで，開発者の専門性を予測

コードを提示した際にどの変数が使われるべきかを予測すすることができるモデルを作成した．

る VARMISUSE タスクにおいて，従来の手法よりも優れ

この槇原の判定手法に対し，改良を加えた研究をこれまた結果が得られることがわかった．このタスクの精度を高で行ってきた [15], [16]．ここでは槇原の研究では利用されめるにはソースコードの構文に関する情報だけでなく，変ていなかった，上級者・初級者以外の参加者が中級者とし数などの意味的な情報も必要である．このタスクで優れたて判定の対象に加えられ，さらにメトリクスとしてネスト結果が得られたことから，このグラフ表現と深層学習を用の深さごとの論理行数が追加された．また，学習アルゴリ

いるとそれらの情報を上手く学習できることがわかる．

ズムもランダムフォレスト（RF）に変更することでモデルの改良が行われた．

Javeed ら [9] は，GitHub に公開されている Java プロ
ジェクトを対象とした学習を行った．ここではまず 14,785のプロジェクトが収集され，コンパイル可能であった 6,244のプロジェクトが機密性，信頼性，複雑性，行数，保守

また，このソースコードのグラフ表現は変数の予測以外にも，ソースコード中の脆弱性の特定 [24] やバグの検知・
修正 [4] といった分野でも優れた結果が得られている．

3. 提案手法
3.1 目的性，重複といった観点から expert と novice に分類される．

2.3 節で示したように，既存の予約語の利用頻度とメト

次にソースコードを単語毎に分割し，単語の埋め込みをリクスを利用した機械学習による手法 [13], [14], [15], [16]

深層学習のライブラリである Keras*4 に実装されているやソースコードを単語ごとに分割して自然言語のように

Embedding 層を利用して行い，LSTM[7] や CNN[8]，また扱った深層学習による手法 [9] は，ソースコードの構造にはその両方を利用した学習を行うことで，開発者の専門性関する情報や変数の意味的な情報がほとんど利用されていを予測することができるモデルを作成した．

ない．そのため，本研究では 2.4 節で示したようなソース

しかし，これらのモデルによる予測は，その入力としてコードのグラフ表現とグラフを対象とした深層学習を利用

ソースコードを用いているにも関わらず，ソースコードにすることで，開発者の専門性を判定する手法を提案する．

おいて特徴的である構造に関する情報や変数の意味的な情以降の節では，この手法におけるグラフ表現について説明

報を全く利用しておらず，情報が大きく損なわれているとした後，コーディングの専門性の判定の手順について説明

考える．このような情報を利用することができれば，よりする．

精度の高い予測を行うことができると考えた．

3.2 ソースコードのグラフ表現
2.4 ソースコードのグラフ表現

2.4 節で説明した，Allamanis らが [1] 定義したグラフを

Allamanis ら [1] はソースコードをグラフとして表現す

利用する深層学習は，ソースコードの特徴的な構造に関る手法を提案した．ノードにはソースコードを構文木に変する情報や変数の意味的な情報を上手く学習できること換した際の文法とトークンを利用する．エッジとして，構が分かっている．また，本研究でのコーディングの専門性

文木から得られた親子関係を表す Child エッジとトークンの判定対象は，プログラミングコンテストの問題に対すの順序関係を表す NextToken エッジを用いる．また，変数る回答のような比較的単純なものを想定している．しかが最後に利用されうる場所へ LastUse エッジ，最後に書きし Allamanis らが定義したグラフはオープンソースのプロ込まれうる場所へ LastWrite エッジ，最後に出現した場所

ジェクトのような複雑なものを対象としており，エッジのへ LastLexicalUse エッジを用いる．その他，メソッド中の種類が多く複雑なものとなっている．そこで，本研究ではreturn トークンに関する ReturnsTo エッジや仮引数に関

Allamanis らが定義したグラフの内，コーディングの専門する FormalArgName エッジ，if 文に関する GuardedBy，性の判定に十分だと考えられたものを利用する．まず，以GuardedByNegation エッジなどが定義されている．最後下のものをノードとして利用する．

に，それらのエッジの両端を逆にしたものを別のラベルと• ソースコード中のトークン

して加える．

• 構文木から得られる文法を表す節

このグラフ表現により，従来使われることが多かった自ノード間を接続するエッジは以下のものを利用する．

然言語の手法では扱うことができなかったソースコードの• 構文木の親子関係を表す Child エッジ

特徴的な構文的構造や意味的構造を扱うことができるよう• トークンの順序関係を表す NextToken エッジ• 同一変数の利用情報を表す LastLexicalUse エッジ*4https://keras.io/ja/

c 1959 Information Processing Society of Japan⃝

こうして得られたノードの中には，”assignExpression”（代3情報処理学会研究報告
IPSJ SIG Technical Report

図 1: コーディングの専門性の判定の手順

入文を表すノード）のように複数の単語の組合せとなっているものがある．このような単語の特徴をグラフニューラル
ネットワークで効果的に学習するため，”assignExpression”

図 2: 代入文 n=1 を ANTLR で構文木に変換したものに対して”assign”と”Expression”のようにノード名を分割したノードを追加する．分割前のノードから分割後の各ノードには，UsesSubtoken エッジを接続する．このノードの分割および UsesSubtoken エッジの作成には，Microsoftが公開している VARMISUSE タスクの実装 [17] を利用した．

図 3: 代入文 n=1 の構文木から冗長なノードを削除したもの

3.3 開発者のコーディングの専門性の判定の手順

定数であることを確定するまでの処理が，赤い点線で囲ま

開発者のコーディングの専門性の判定の手順を図 1 に示れた部分となっている．左辺も同様に，変数であることをす．この手順は，ソースコードからグラフへ変換する部分

確定するまでの処理が赤い点線で囲まれた部分で行われと深層学習を利用してグラフから専門性を判定する部分にている．この部分はノード数が非常に多くなっているため分けられる．以降の節では，それぞれの部分について説明

図 2 では省略しているが，本来赤い点線内には左辺で 16する．

個，右辺で 18 個のノードが入っており，構文木の深さが3.3.1 ソースコードのグラフへの変換

深くなっている．グラフニューラルネットワークでは，グ

ANTLR*5 と Understand*6 を利用して，以下の手順でソースコードからグラフへの変換を行った．

ラフの各ノードはエッジが隣接するノードから情報を集めて状態を更新していくため，この構文木のまま学習してし

1.

ANTLR でソースコードを構文木に変換する

まうと，例えば右辺の 1 というトークンが代入文の中にあ2.

構文木中の各ノードをグラフのノードとするるという情報を得るまでに非常に長い時間がかかってしま

3.

親ノードから子ノードに接続されるエッジを Childう．そのため，赤い点線で囲っている部分を冗長なノード

エッジとするとして削除することで効率よく学習したい.

4.

前のトークンから後ろのトークン NextToken エッジ

そこで，以下の 2 つの条件を同時に満たすノードを冗長を接続するなノードと定義し，削除する．この際，対象の親ノードか

5.

冗長なノードを削除する

ら接続される Child エッジはその子ノードへ接続する．

6.

Understand を利用して LastLexicalUse エッジを追加
する

7.

• 子ノードが文法を表すノードであるもの• 子ノードが 1 つしかないもの

ノード名を分割して新しいノードと UsesSubtoken エッ

この条件に従い図 2 の冗長なノードを削除したものが図 3

ジを追加するである．構文木の深さは改善されており，学習の際にノー5. で示した冗長なノードの削除について説明する．図 2

ドは効率よく情報を集めることができるようになる．まに，ソースコード中の代入文 n=1 を構文木に変換したもた，4.1 節で説明するデータセットに対して冗長なノードのの一部を示している．代入文を表すノード”assignment-の削除を行った結果，分割したノードの追加を行う前に存

Expression”から左辺，=，右辺を表すノードに分かれてい在するノードの約 73%を削減することができた．

る．この例では代入文の右辺に 1 という定数が入っている

次に，新しいノードの追加と UsesSubtoken エッジにつが，代入文の右辺には定数以外にも変数や関数など様々ないて説明する．キャメルケースまたはスネークケースにものが入る可能性がある．そういったものの中から右辺が従ってノード名を分割して得られた単語のノードを新た*5*6

https://www.antlr.org/
https://www.scitools.com/

c 1959 Information Processing Society of Japan⃝に作成する．また分割する前のノードから分割後の各ノードへ UsesSubtoken エッジを追加する．ただし，分割前の4

情報処理学会研究報告
IPSJ SIG Technical Report

ノードが予約語である場合，これらの処理は行わない．

まず，各ノードの初期状態と最終状態のベクトルを連結

こうしてソースコードをグラフに変換する様子を図 4 にさせる．次に全ノードの重み付き和と重み付き平均を算出示す．図 4a はノードの分割と UsesSubtoken エッジ以外

し，連結させる．この連結したベクトルを出力数 3 の MLPの例を，図 4b はノードの分割と UsesSubtoken エッジのに入力し，得られる出力をされに Softmax 層に入力する

例を示している．

と，3 つの値の合計値が 100%となるように上級者・中級

3.3.2 グラフを対象とした深層学習者・初級者である確率が出力される．ここで例えば上級者

この節では，グラフを対象に深層学習を行って上級者・中級者・初級者の判定を行う部分について説明する．このの割合が最も高くなった場合，このソースコードを書いた
開発者は上級者であると判定する．

部分は大きく 3 つの段階に分けることができる．まず，入

この実装は，Microsoft が公開しているグラフの回帰タス

力されたグラフのノードをベクトルに変換し，初期状態をクの実装*7 を本手法で扱う 3 値分類に拡張したものとなっ得る．次に，ノードの状態とエッジからグラフニューラルている．

ネットワークによりノードの状態を更新していく．最後に，ノードの状態から上級者・中級者・初級者の確率を出

4. 手法の評価実験を行って提案手法を評価する．最初に，実験に利用すことで専門性の判定を行う．

3 つの段階それぞれについて，以下で詳細を述べる．
エンベディング
グラフニューラルネットワークを利用するためには，ましたデータセットと比較対象のベースラインについて説明する．その後提案手法とベースライン手法で開発者のコー
ディングの専門性の判定を行い，結果の比較と考察を行う．

ずノードをベクトルへ変換する必要がある．本手法ではソースコード中のトークンと構文木から得られる文法を

4.1 データセット

表す節，それらを分割したものをノードとして扱っていここでは評価実験に用いたデータセットについて述べる．そこで，ノードを表す文字列に対して Character-level

る．このデータセットは既存のソースコード中の予約語のCNN[23] を適用することでノードの初期状態を取得する．

利用頻度やソースコードから計測できるメトリクスを利用

グラフニューラルネットワーク

した機械学習による手法 [13], [14], [15], [16] で用いられてグラフニューラルネットワークはグラフ構造を学習し各ノードの状態を更新していくことで，ノードの予測やエッいるものであり，堤 [22] によって作成された．このデータ
セットはオンライン上で公開されている*8 ．

ジの予測，グラフレベルの予測などに利用することができ

データセットは，参加者が問題への回答として提出した

る．本手法はソースコードをグラフに変換し，そのグラフ

ソースコードと，言語やタイムスタンプ等の提出履歴情に対してグラフレベルの予測を行う．予測の際，各ノード

報データベースの 2 種類からなる．データセットの統計

はエッジが接続している隣接ノードから情報を集約し，集情報は表 1 で示している．また，本データは 2016/5/19〜

めた情報をもとにノードの状態を更新する．この工程は2016/11/15 の期間に収集されており，ソースコードのファ

繰り返し行われる．この集約・更新の方法の違いにより，イル数は 1,644,636 である．プログラミングコンテストに様々な種類のグラフニューラルネットワークが存在する．

おける提出は 1 つのソースファイルにまとめられるため，本手法では Microsoft が公開している複数のグラフニュー

これは提出数と一致している．提出されたソースコードのラルネットワーク [17] を検証し，今回の用途では最も精度

言語別提出数の割合を表 2 に示す．ソースコードのうち，が高かった RGCN[20] を採用した．RGCN は，画像に対90%は C++によって記述されている．表 1 の参加者数は，する深層学習に使われる畳み込みと呼ばれる技術をグラフ

2016/5/19〜2016/11/15 の期間に 1 度以上 Codeforces のニューラルネットワークに応用した GCN[5], [10] を，さらコンテストに参加したユーザーの総数である．また，各コにラベル付きのエッジを持つグラフに適用できるように拡ンテストには複数の問題が含まれるため，コンテストの数張したものとなっている．

と比較して問題数が多くなっている．

本手法では RGCN によりノードの情報を集約する際，終端のノードが始端のノードの情報を集めるだけでなく，始表 1: データセットの統計情報

端のノードも終端のノードの情報を集めることができるよ

収集期間

ファイル数

参加者数

うにする．これは VARMISUSE タスク [1] でも採用されて2016/5/19〜2016/11/15

1,644,636

14,520おり，情報の伝達をより速くし，モデルの表現力を向上さコンテスト数問題数DB サイズ

739

3,218

357MB

せることがわかっている．
専門性の判定RGCN によって得られたノードの最終状態から専門性の判定を行う．

c 1959 Information Processing Society of Japan
⃝

*7
*8

https://github.com/microsoft/tf2-gnn
https://sites.google.com/site/miningprogcodeforces/

5情報処理学会研究報告
IPSJ SIG Technical Report(a) 代入文と printf 文を変換する例．ただしノードの分割は省略している．

(b) 代入文を表すノードを分割する例

図 4: グラフ中のエッジの例

で公開されている実装*9 を確認したところ，以下の 2 つの表 2: 提出ソースコードの言語分布
言語

C++

Java

C

Pythonその他

割合

90.00%

4.15%

2.08%

1.92%

1.86%

問題点が存在した．

• 単語の分割をスペースとタブ，改行，コンマの有無で判断している• コメントアウトされている部分も単語をベクトルに変換して学習する

4.1.1 ソースコード
ソースコードは，プログラミングコンテストの参加者がまず単語の分割が不適切であることについて説明する．

問題に対する回答として提出したものであり，コンパイル

単語の分割を上で示したように行うと，例えば printf(”a環境が用意されている任意の言語を提出することができb”); のようなソースコードの内の 1 行は「printf(”a」といる．また，回答ソースコードが正答であるか，コンパイル

う部分と「b”);」という部分の 2 つを単語として分けてし可能かどうかは提出の可否に影響しないため，文法的に不まう．しかし，ソースコードの最小単位であるトークンで完全なソースコードが含まれる場合もある．

分割すると printf，(，”a b”，)，; という 5 つのトークンに

4.1.2 提出履歴

分かれるため，この分割方法は適切であるとは言えない．

提出履歴情報には，参加者のレーティング情報や，どの参加者がどの問題にいつ提出したか，提出が正解であった

そのため，実験を行う際にはソースコードをトークンで分割して学習を行うように変更する．
次に，コメントアウトされている部分の学習が不適切でか等の情報が含まれている．

あることについて説明する．まず，この手法では単語をベ

4.2 ベースライン

クトルへ変換した後，全ての単語を深層学習へ入力するの実験には，既存のソースコード中の予約語の利用頻度やではなく，ハイパーパラメータで指定された 251 個目以

ソースコードから計測できるメトリクスを利用した機械学

降の単語は入力しない．また，ソースコードの始めにはコ

習による手法と，ソースコードを単語毎に分割して自然言

ピーライト等がコメントとして記述されることもある．実語のように扱った深層学習による手法 [9] を比較対象とし際に本研究で利用するデータセット内に図 5 に示すようなて利用する．

ソースコードも存在した．このようなソースコードをコメ

ランダムフォレスト (RF)ントを含めて学習してしまうと，ソースコードの処理を行

メトリクスを利用した機械学習を用いる手法として，2.3

う部分に焦点を当てた学習ができなくなる可能性があり，節で説明したものの中から，ここでは槇原の手法 [13], [14]

コメントアウトの部分を含めた学習は適切であるとは言えに改良を加えたもの [15], [16] を利用する．

ない．そのため，実験を行う際にはコメントアウトされてLSTMいる部分を無視するように変更する．

ソースコードを自然言語のように扱った深層学習による手法では，始めにソースコードを単語ごとに分割し，それ4.3 実験内容
提案手法とベースライン手法を用いて，開発者のコー

ぞれの単語をベクトルに変換する．その後ソースコードを
単語列のベクトルとして深層学習モデルに入力して判定をディングの専門性の判定を行う．

行う．既存研究では CCN，LSTM，CCN と LSTM を組み

まず，データセットのソースコードを上級者・中級者・合わせたモデルで実験を行っていたが，本研究のベースラ

初級者のコードに分類する．ここでは既存の手法 [15], [16]インにはその実験で最も精度が高かった LSTM によるモと同様に最も提出数の多かった C++のソースコードを提デルを利用する．また，2 値分類による判定が行われてい出者のレーティングでソートし，上位 25%を上級者，下位

たが，本研究では上級者・中級者・初級者の 3 値分類によ*9る判定を行うため，出力層を変更する．そこで GitHub 上c 1959 Information Processing Society of Japan⃝

https://github.com/Akhtar-Munir/
Developer-level-detect6

情報処理学会研究報告
IPSJ SIG Technical Report

表 5: 提案手法とベースライン手法の結果
モデル

上級者

中級者

初級者

accuracy

提案手法

0.891

0.881

0.835

0.871

RF

0.758

0.793

0.699

0.762

LSTM

0.770

0.768

0.697

0.750

表 6: 提案手法のエッジを制限した学習の結果
図 5: コピーライトとライセンスが記述されている例

25%を初級者，残りを中級者のコードとしている．この時，上級者・中級者・初級者のレーティングの分布は表 3 のようになった．

制限したエッジ

上級者

中級者

初級者

accuracy

NextToken

0.882

0.874

0.827

0.863

LastLexicalUse

0.888

0.876

0.829

0.866

上記 2 種類

0.868

0.860

0.804

0.847

4.4 実験結果
4.3 節で説明した実験の結果を表 5 と表 6 に示す．

表 3: 上級者・中級者・初級者のレーティングの統計情報

レーティング

初級者

中級者

上級者

平均

1180.221459.66

1944.35

分散

13170.37

10153.2746307.75

最小値

-39

1311

1711

中央値

1211

1434

1902

最大値

1310

1710

3367

ている．そのため，ソースコードの構文的情報と変数の意
味的な情報によりコーディングの専門性を効果的に学習で

人数
ファイル数

3899

8409

2212

353,346

701,871352,557

4.5 結果の比較・考察
まず表 5 から，提案手法は上級者の F 値が 0.891，中級者の F 値が 0.881，初級者の F 値が 0.835，accuracy が 0.871となっており，全ての評価値でベースライン手法を上回っきたことがわかる．
また，表 6 の提案手法から NextToken エッジと LastLex-

提案手法とベースライン手法それぞれでこれらのソースコードに対して学習・評価を行う．提案手法及び深層学習を利用した手法 [9] は，学習データを全体の 8 割，評価デー
タを全体の 1 割，テストデータを残りの 1 割して分割した
ときのテストデータの評価値を求める．機械学習による手法 [15], [16] は，学習データを全体の 9 割，テストデータを
残りの 1 割として 10 分割交差検証を行い評価値を求める．
評価値として，accuracy と F 値の 2 つを採用した．提案手法については，ソースコードの構造や変数の意味情報を表すエッジの有効性を評価するために，NextToken エッジの制限や LastLexicalUse エッジの制限，NextToken エッジと LastLexicalUse エッジのどちらも制限したグラフを用
いて学習を行った評価もあわせて行う．
利用するソースコードに対して，提案手法のグラフ変換を行った際に得られた構文的な情報と，変数の意味的な情報を表す Child エッジ，NextToken エッジ，LastLexicalUse
エッジの 1 ファイル当たりの数を表 4 に示す．

icalUse エッジを制限した学習は，表 5 のベースライン手法に比べて各評価値が高く，大きく精度が向上している．
このことから，構文木から得られる構文の情報は非常に有用だと考えられる．
そしてこの 2 つのエッジの両方を制限した学習は，どちらか片方を制限した学習に比べて全ての評価値が低くなっている．NextToken エッジを制限した学習と LastLexicalUse
エッジを制限した学習の評価値は多少の差はあるが，両方を制限した学習に比べ各評価値は同程度向上している．一方で，表 4 に示したように，1 ファイル数当たりのエッジ
数は LastLexicalUse エッジは NextToken エッジの 1/5 以
下となっている．従って，LastLexicalUse エッジは少ない
数で NextToken エッジと同等の精度向上があると考えられ，また変数の意味的情報はコーディングの専門性の判定において非常に有用だと考えられる．

5. まとめ本研究では，ソースコードの構文的情報や変数の意味的情報をグラフとして表現し，グラフを対象とする深層学習

表 4: 各エッジの 1 ファイル当たりのエッジの数の 1 つである RGCN を用いてコーディングの専門性を判

エッジの種類エッジ数定する手法を提案した．プログラミングコンテストのデー

Child エッジ

656

NextToken エッジ

タセットを利用して提案手法の評価を行ったところ，提案

347

LastLexicalUse エッジ

60

手法は従来のソースコード中の予約語の利用頻度やソース
コードから計測できるメトリクスを利用した機械学習による手法や，ソースコードを単語毎に分割して自然言語のよc 1959 Information Processing Society of Japan⃝7

情報処理学会研究報告
IPSJ SIG Technical Report

うに扱った深層学習による手法と比べて良い結果が得られた．また，グラフのエッジを制限した学習の評価も行うこ[12]とで，エッジの有用性も確認した．
今後の課題として，汎化性能を確認することが考えられ[13]

る．本研究ではデータセットにプログラミングコンテストを利用した．そのため，この手法がプログラミングコンテ[14]

スト以外のドメインにおいて有用かどうかは判明していな
い．プログラミングコンテストではラベル付けに客観的な指標であるレーティングを利用することができた．しかし，[15]

他のドメインでレーティングのような客観的なコーディン
グの専門性の指標を得ることは難しいのではないかと考え[16]

られる．データセットを作成することができれば，汎用性の確認だけでなく，汎用性の高い手法の作成も行うことができるようになると考えられる．

[17]

参考文献

[18]

[1]

[19]

[2]

[3]

[4]

[5]

[6]
[7]

[8]

[9]

[10]

[11]

Allamanis, M., Brockschmidt, M. and Khademi, M.:
Learning to Represent Programs with Graphs, International Conference on Learning Representations (2018).
Baltes, S. and Diehl, S.: Towards a Theory of Software
Development Expertise, Proceedings of the 2018 26th
ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations ofSoftware Engineering, Association for Computing Machinery, pp. 187–200 (2018).
Bressler, M. S.: Building the winning organization
through high-impact hiring, Journal of Management
and Marketing Research, Vol. 15 (2014).
Dinella, E., Dai, H., Li, Z., Naik, M., Song, L. and Wang,K.: HOPPITY: LEARNING GRAPH TRANSFORMATIONS TO DETECT AND FIX BUGS IN PROGRAMS, International Conference on Learning Representations (2020).
Duvenaud, D., Maclaurin, D., Aguilera-Iparraguirre, J.,
Gómez-Bombarelli, R., Hirzel, T., Aspuru-Guzik, A. andAdams, R. P.: Convolutional Networks on Graphs for
Learning Molecular Fingerprints, Advances in Neural
Information Processing Systems, Vol. 2, pp. 2224–2232(2015).
Elo, A. E.: The Rating of Chessplayers, Past andPresent, Arco Pub. (1978).
Hochreiter, S. and Schmidhuber, J.: Long Short-Term
Memory, Neural Computation, Vol. 9, No. 8, pp. 1735–
1780 (1997).
Jacovi, A., Sar Shalom, O. and Goldberg, Y.: Understanding Convolutional Neural Networks for Text Classiﬁcation, Proceedings of the 2018 EMNLP Workshop
BlackboxNLP: Analyzing and Interpreting Neural Networks for NLP, Association for Computational Linguistics, pp. 56–65 (2018).
Javeed, F., Siddique, A., Munir, A., Shehzad, B. andLali, M. I.: Discovering software developer’s coding expertise through deep learning, IET Software, Vol. 14,
No. 3, pp. 213–220 (2020).
Kipf, T. N. and Welling, M.: Semi-Supervised Classiﬁcation with Graph Convolutional Networks, International
Conference on Learning Representations (2017).
Laakmann McDowell, G.: Cracking the coding interview: 189 programming questions and solutions, Ca-

c 1959 Information Processing Society of Japan
⃝

[20]

[21]

[22]

[23]

[24]

reerCup (2015).
Li, Y., Tarlow, D., Brockschmidt, M. and Zemeli, R.:
Gated Graph Sequence Neural Networks, International
Conference on Learning Representations (2016).
槇原啓介： ソースコード特徴量を用いた機械学習によるソースコードの良否の判定，大阪大学基礎工学部情報科学科卒業論文 (2019).
槇原啓介， 松下誠，井上克郎： ソースコード特徴量を用いた機械学習によるソースコード品質の評価手法，電子情報通信学会技術研究報告，Vol. 119, No. 113, pp. 105–110(2019).
松井智寛： 判定対象の拡大を目的とした 3 値分類による
ソースコードの良さの判定手法，大阪大学基礎工学部情報科学科卒業論文 (2020).
松井智寛， 松下誠，井上克郎： 判定対象の拡大を目的とした 3 値分類によるソースコード品質の評価手法，情報処理学会研究報告，Vol. 2020-SE-205, No. 7, pp. 1–8(2020).
Microsoft:
tf-gnn-samples, https://github.com/
microsoft/tf-gnn-samples (2019).
Mirzayanov, M.: Codeforces Rating System, http://
codeforces.com/blog/entry/102 (2010).
Moradi Dakhel, A., C. Desmarais, M. and Khomh, F.:
Assessing Developer Expertise from the Statistical Distribution of Programming Syntax Patterns, Proceedingsof the Evaluation and Assessment in Software Engineering, Association for Computing Machinery, p. 90–99(2021).
Schlichtkrull, M., Kipf, T. N., Bloem, P., vanÂ den Berg,
R., Titov, I. and Welling, M.: Modeling Relational Datawith Graph Convolutional Networks, European Semantic Web Conference, Springer International Publishing,pp. 593–607 (2018).
Siegmund, J., Kästner, C., Liebig, J., Apel, S. and Hanenberg, S.: Measuring and Modeling Programming Experience, Empirical Softw. Engg., Vol. 19, No. 5, pp.
1299–1334 (2014).
堤祥吾： プログラミングコンテスト初級者・上級者におけるソースコード特徴量の比較，大阪大学大学院情報科
学研究科修士論文 (2018).
Zhang, X., Zhao, J. and LeCun, Y.: CharacterLevel Convolutional Networks for Text Classiﬁcation,
Advances in Neural Information Processing Systems,
Vol. 1, pp. 649–657 (2015).
Zhou, Y., Liu, S., Siow, J., Du, X. and Liu, Y.: Devign:Eﬀective Vulnerability Identiﬁcation by Learning Comprehensive Program Semantics via Graph Neural Networks, Advances in Neural Information Processing Systems, pp. 10197–10207 (2019).

8