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

順伝播型ニューラルネットワークを用いた類似コードブロック検索の試み
藤原 裕士1,a)崔 恩瀞2

吉田 則裕3

井上 克郎1

概要：Ichi Tracker は，入力として与えられたコード片と類似し，再利用可能なコード片をオープンソー
スソフトウェアから高い精度で検索するシステムである．しかし，このシステムは入力コード片に類似しているコード片でも，構文上の差異が存在する場合，検索結果から削除されてしまう可能性がある．本研
究では, この問題を解決するために順伝播型ニューラルネットワークを用いて，入力コード片と類似した
コードブロックの検索を試みる．本検索手法は，事前にソースコードに対してミューテーションを行い，様々な種類の類似ソースコードを作成した後，元ソースコード及び類似ソースコードのコードブロックを抽出する．また，抽出した各コードブロックを特徴ベクトルに変換し，類似ソースコードのグループ毎にユニークなラベルを付与し，教師あり学習で順伝播型ニューラルネットワークのモデルを作成する．入力
コード片の類似コードブロックを検索する際は，作成したモデルへ，入力コード片から作成した特徴ベク
トルを与え，モデルが出力したラベルに該当するグループのコードブロックを出力する．評価実験では，3つのオープンソースソフトウェアに対して本検索手法を適用し，構文的に差異がある類似コードブロック
を高い精度で検索することが確認できた．
キーワード：コード検索，機械学習，順伝播型ニューラルネットワーク，BoW，doc2vec

1. まえがき

力コード片に含まれる識別子単語の数を測定し，インター
ネット上のコード検索エンジンにクエリとして渡す．そし既存ソフトウェアは，ソフトウェア開発における重要なて，コード検索エンジンから返された結果に対して，トー資源である．既存ソフトウェアのコード片を再利用するこ

クン解析ベースコードクローン検出ツール CCFinder[2] をとで，ソフトウェア開発の生産性および信頼性の向上が期適用してフィルタリングを行うことによって，構文的に待できる．そのため，新規ソフトウェアを開発する段階に一致したコード片を検索する．しかし，Ichi Tracker は，

おいて，再利用可能なコード片を特定することは重要で

CCFinder を用いて検索結果のフィルタリングを行うため，ある．また，再利用可能なコード片を OSS や Q&A サイト

入力コード片に類似しているコード片でも，文が追加され（例：Stack Overflow*1 ）等から特定したときに，コード片ていたり削除されていたりするなど，構文上の差異が存在をクエリとした類似コード片検索を行うと，オリジナルのする場合，検索結果から削除されてしまう可能性がある．

コード片のライセンス記述を調べることや，より優れた脆開発者は，構文的に差異があるコード片も再利用する可能

弱性対策がされているコード片を探し出すことができ，再性があるが，Ichi Tracker は，これらのコード片を検索で利用の安全性が高まる．

きない可能性がある．

Ichi Tracker[1] は，入力として与えられたコード片と類

本研究では，この問題点を解決するために順伝播型ニュー似しているコード片をオープンソースソフトウェア（以下ラルネットワーク（以下 FFNN）を用いた機械学習モデル

OSS）から検索するシステムである．このシステムでは，入の利用を試みる．本検索手法は，構文的に一致するコード

1

2

3

a)
*1

大阪大学
Osaka University
奈良先端科学技術大学院大学
Nara Institute of Science and Technology
名古屋大学
Nagoya University
y-fujiwr@ist.osaka-u.ac.jp
https://stackoverflow.com/

c 1959 Information Processing Society of Japan⃝

片だけでなく，構文的に類似したコード片も検索結果に含めることができる．本検索手法はある 2 つの要素の対応付
けが得意な機械学習を使用することで，入力コード片と構文的に類似したコード片を容易に対応させることができる．
本検索手法は，学習を行う STEP A と検索を行う STEP

B の 2 段階で構成されている．STEP A では，まずソー

1

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

スコードに対してミューテーションを行い，様々な種類の師あり学習を実行することで FFNN のモデルを作成する．

ϭƉƵďůŝĐƐƚĂƚŝĐǀŽŝĚƵďďůĞ^Žƌƚ;ͿϮ΂ϯŝŶƚ ƚĞŵƉ͖ϰĨŽƌ;ŝŶƚ ũсϬ͖ũфŶƵŵ͘ůĞŶŐƚŚ Ͳ ϭ͖ũннͿ΂ϱŝĨ;ŶƵŵ΀ũ΁хŶƵŵ΀ũнϭ΁Ϳ΂ϲƚĞŵƉсŶƵŵ΀ũ΁͖ϳŶƵŵ΀ũ΁сŶƵŵ΀ũнϭ΁͖ϴŶƵŵ΀ũнϭ΁сƚĞŵƉ͖ϵ΃ϭϬ΃ϭϭ ΃ϭƉƵďůŝĐƐƚĂƚŝĐǀŽŝĚƵďďůĞ^Žƌƚ;ͿϮ΂ϯŝŶƚ ƚĞŵƉ͖ϰĨŽƌ;ŝŶƚ ũсϬ͖ũфŶƵŵ͘ůĞŶŐƚŚ Ͳ ϭ͖ũннͿ΂ϱŝĨ;ŶƵŵ΀ũ΁хŶƵŵ΀ũнϭ΁Ϳ΂ϲ͖
ϳŶƵŵ΀ũ΁сŶƵŵ΀ũнϭ΁͖ϴŶƵŵ΀ũнϭ΁сƚĞŵƉ͖ϵ΃ϭϬ΃ϭϭ΃

STEP B では，作成したモデルへ，入力コード片から作D

E

類似ソースコードを作成した後，元ソースコード及び類似
ソースコードのコードブロックを抽出する．その後，抽出した各コードブロックを特徴ベクトルに変換し，類似コードブロックのグループ毎にユニークなラベルを付与し，教成した特徴ベクトルを与える．その結果，入力コード片に
図 1

類似している学習済コードブロックが存在する場合は，類

ミューテーションの例 (mSDL)

似している学習済コードブロックに付与されたラベルを出することができる．
評価実験では，3 つのオープンソースソフトウェアに対

݊଴଴

݊ଵ଴

݊଴ଵ

݊ଵଵ

݊଴ଶ

݊ଵଶ

݊ଶ଴
݊ଶଵ

して本検索手法を適用した．その結果，本検索手法は構文

図 2的に差異がある類似コードブロックを高い精度で検索する
ことが確認できた
以降，2 章では本研究の背景について述べる．3 章では，

ड़ྙϗέφϩ

入力コード片に類似している学習済コードブロックを検索೘ྙϗέφϩ

力する．そのため，出力されたラベルを確認することで，FFNN の例

mROS： いくつかの宣言文以外の文を並べ替える．
mCR： 制御構造を別のものに置き換える．

本研究で提案する手法について述べる．4 章では，本研究の図 1 はミューテーションオペレータ mSDL をソースコー

評価実験について述べる．5 章では，関連研究について述

ドに適用した例をに示す．図 1（a）の 6 行目の文の一部

べる．最後に，6 章でまとめと今後の課題について述べる．

を削除することで，元のソースコードと構文的に類似した

2. 背景
本章では，本研究の背景として，Roy らのミューテー

ソースコード（図 1（b）
）が作成された．

2.2 FFNNション [3]，FFNN，既存の類似コード検索システム Ichi

FFNN とは，歴史上初めて登場したニューラルネット

Tracker の説明し，その後，Ichi Tracker の問題点についてワークであり，ニューロンと呼ばれる，並列に動作する単純述べる．

な要素を接続することで構成されている [4]．図 2 は n00 〜

n21 で構成される，3 層の FFNN の例である．FFNN の入
2.1 Roy らのミューテーション

力と出力はともにベクトルであり，そのベクトルの次元は

Roy らのミューテーション [3] とは，機械的にソースコー

ネットワーク構造に依存する．図 2 の例では入力が 3 次

ドを変更することによって，構文的に一致または類似し元，出力が 2 次元のベクトルである．また，ネットワーク

たソースコードを作成することである．Roy らは，ソースの機能は，各ニューロン間の接続に設定されている重みにコードの変更方法をミューテーションオペレータと呼び，よって決まる．入力ベクトルと出力ベクトルの組を FFNN

13 種類のミューテーションオペレータを定義している．

に与え，その入力ベクトルを FFNN に与えた際にその出

mCW： 空白の数を変更する．

力ベクトルが出力されるように重みの値を調整することに

mCC： コメントを変更する．

よって，入力ベクトルと出力ベクトルを対応づける FFNN

mCF： 改行などのコーディングスタイルを変更する．

への訓練ができる．このように訓練した FFNN に，学習さ

mSRI： 変数名などのユーザー定義名，変数の型などをせた入力ベクトルに類似したベクトルを入力として与えた規則的に変更する．

mARI： 変数名などのユーザー定義名，変数の型などを不規則的に変更する．

場合，学習させた出力ベクトルに類似したベクトルが出力される．従って，出力ベクトルを分析することによって，入力ベクトルを特徴ごとに分類することができる．

mRPE： 変数単体の式を別の式に置き換える．
mSIL： ある文にわずかな挿入を行う．

2.3 Ichi Tracker

mSDL： ある文の一部を削除する．

我々の研究グループが開発した Ichi Tracker[1] は，入力

mILs： いくつかの文を挿入する．

として与えられたコード片を，インターネット上の OSS リ

mDLs： いくつかの文を削除する．

ポジトリから検索するためのシステムである．

mMLs： いくつかの文を修正する．

2.3.1 Ichi Tracker の類似コード検索方法

mRDS： いくつかの宣言文を並べ替える．

c 1959 Information Processing Society of Japan⃝

この節では，Ichi Tracker の類似コード検索方法の概要

2

情報処理学会研究報告
IPSJ SIG Technical Report೘ྙαʖχฤ‫ݍ‬௖ड़ྙ
&&)LQGHU

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000000000000000

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00,FKL 7UDFNHUϓΡϩνϨϱή ߑชదͶ‫ࡩݗ‬έΦϨ 64‫݃ࡩݗ‬Վ 65Ҳ஗͢ͱ͏Ζαʖχฤ

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ることが可能である．また，機械学習を用いることで構文上類似しているが検索できなかったコード片を新たに学習させることで次からは正しく判定でき，検索漏れや誤検索を減らすことができる．
本検索手法は，FFNN による機械学習を行う STEP Aと，コードブロックの検索を行う STEP B の 2 段階で構成αʖχ‫ࡩݗ‬Φϱζϱ

されている．

΢ϱνʖϋρφ266ϨϛζφϨ

3.1 用語の定義
コードブロック： 本検索手法では，以下の 2 つの条件の

図 3

Ichi Tracker の概要

いずれかを満たすコード片をコードブロックと定義する．

について説明する．図 3 は Ichi Tracker の概要を表して

条件 1

関数の“{ }”で囲まれた範囲

いる．

条件 2

if，else，for，while，do-while，switch 文の“{Ichi Tracker は入力として与えられたコード片 qc で使用されている識別子を解析することで検索クエリ SQ を作}”で囲まれた範囲
類似度：

本検索手法では，2 つのソースコードを正規化成し，SPARS/R[5]，Koders[6] などの，インターネット上

した後に抽出した行の集合を t1,t2 とし，t1, t2 内で重のコード検索エンジンに渡すことで，インターネット上複している行を t1 ∩ t2 としたとき，類似度 Similarityの OSS リポジトリを対象とした検索を実行する．そして，を以下のように定義する．

コード検索エンジンから検索結果 SR を渡されると，OSS

Similarity =リポジトリから SR に含まれるコード片 sr1 , sr2 , . . . をダ
ウンロードし，qc と sr1 , sr2 , . . . が構文的に一致している
かを CCFinder[2] を用いて確認し，一致しているコード片2 ∗ |t1 ∩ t2||t1| + |t2|

類似コードブロック・類似コードブロックセット：

本検を出力する．

索手法では，構文的に一致，または差異はあるが一致

2.3.2 Ichi Tracker の問題点部分も存在する（類似度が 0 より大きい）コードブ

開発者は，文の追加や削除が行われている構文的に差異

ロックを類似コードブロックと定義する．また，類似があるコード片も再利用する可能性がある．しかし，Ichi

コードブロックの同値類を類似コードブロックセット

Tracker は，コード検索エンジンから渡された検索結果 SRと定義する．

を CCFinder を利用してフィルタリングをするため，SR

ネガティブデータ：

類似コード検索を行う際，類似コー

が入力コード片と構文的に異なる場合，その検索結果をドブロックを出力するという事象の他に，検索結果な出力しない可能性がある．この問題の解決方法として，検しという事象が存在するが，本検索手法では，FFNN

索結果のフィルタリングの際に CCFinder 以外のコードクを使用し，コード検索を分類問題へと置換しているたローン検出ツールを使用する方法も考えられるが，コードめ，学習の際に，分類における 検索結果なし クラ

クローン検出ツールは自らの類似度の定義に基づいてコースを作成するためのベクトルが必要となる．本検索手

ドクローンを検出するため，特定のコード片を検索できな

法では，以下の条件 3 に当てはまるコードブロックかい可能性が存在する．この問題を解決するために，本研究ら作成した特徴ベクトルをネガティブデータとして定では，FFNN を用いた機械学習モデルにより，構文的に一義し， 検索結果なし

致するコード片だけでなく，構文的に類似したコード片もトルとして学習に使用する．

検索できる手法を提案した．また，機械学習を用いると，

条件 3

検索に失敗したコード片を新たに学習させることで次からティブデータすべてと構文的に類似していないため，は正しく検索することができる．

特徴ベクトルに 検索結果なし を意味するラベル 0

3. 提案手法
本研究では，FFNN を使用することで，コードブロック

クラスを作成するためのベク

検索対象のリポジトリ内には存在せず，ポジが付与されるコードブロック
ポジティブデータ：

本検索手法では，以下の条件 4 に当てはまるコードブロックから生成された特徴ベクトル単位の類似コード片検索を試みる．本検索手法は機械学習

をポジティブデータとして定義する．

を使用することで，ある 2 つの要素の対応付けを学習デー

条件 4

タから経験的に取得することができ，入力として与えられトルに 0 以外のラベルが付与されるコードブロック

たコード片と構文的に類似したコード片を容易に対応させと，その類似コードブロック

c 1959 Information Processing Society of Japan⃝

検索対象のリポジトリ内に存在し，特徴ベク

3情報処理学会研究報告
IPSJ SIG Technical Reportྡ⛠266ϨϛζφϨ
{^dWͲϭαʖχϔϫρέଵ     ⋯ྪࣇαʖχϔϫρέιρφ⋮ூ  
boolean flag = true;
if ( x > y ) flag = false;
return flag;
}
䝯䝍䝽䞊䝗

 ⋯

ಶᩘ

boolean

1

flag

3

true

1

if

1

Word_2

2

false

1

return1( 1, 3, 1, 1, 2, 1, 1 )^dWͲϮ

図 5 BoW をコード片に適用した例

ଵ     ⋯ ܾ݉ ሺ௞భ ሻଵϝϣʖτʖεϥϱͲࡠ੔ͪ͢αʖχϔϫρέ⋮ூ  
  ⋯ ܾ݉ூሺ௞మ ሻ

STEP A-3^dWͲϯϨϛζφϨ֐͹αʖχϔϫρέ

コードブロック bi (j) ，mbi (k) を特徴ベクトルに変換ଵ   , ⋯ ,  భ ,   , ⋯ ,  భ










,⋯ ,



する．

ூ   , ⋯ ,  ಺ ,  , ⋯ ,  ಺

STEP A-4^dWͲϰ

する．その際に用いた手法については 3.2.1 節で説明

αʖχϔϫρέ͹
ಝ௅ϗέφϩ

⋮଴

ロックセット Si に属する．

,0 ,⋯ ,  , 1 , ⋯ ,  భ , 1 , 

類似コードブロックセット Si に属するコードブロッαʖχϔϫρέ͹ಝ௅ϗέφϩͳ෉༫͠Ηͪϧϗϩ͹ૌ

,0



, 1 , ⋯ , భ 

クから生成された特徴ベクトルに対して，ラベル i を,1付与する．また，コードブロック集合 b0 (l) には，OSS⋮ ,  , ⋯ ,  ಺ ,  , ,  , ⋯ , ಺ 

リポジトリ内に類似コードブロックはないという意味,で，特徴ベクトルにラベル 0 を付与する．

^dWͲϱ

STEP A-5
特徴ベクトルと，付与したラベルを用いて，教師ありָसࡃΊωϣʖϧϩϋρφϭʖέ

図 4

STEP A の概要図学習を行い，FFNN のモデルを作成する．

3.2.1 特徴ベクトルの計算本研究における評価実験では，機械学習に用いられる
代表的なベクトル化方式の中で最も単純な BoW（Bag of

3.2 FFNN による機械学習
この節では，FFNN による機械学習を行う STEP A に

Words）と，自然文書を対象とした機械学習において有効ついて説明する．STEP A では，OSS リポジトリから取得性が実証されているベクトル化方式である doc2vec[8] の 2

したソースコードを基に学習データを作成し，そのデータ種類の手法を使用してそれぞれモデルを作成した．

を用いて FFNN のモデルを作成する．STEP A は 5 つのBoW: 学習データ用コードブロックに現れる各予約語・手順から構成されている．STEP A の概要を図 4 に示す．

識別子の数を特徴量として，各コードブロックを特徴

STEP A-1

ベクトルに変換する．その際，2 字以下の識別子はメOSS リポジトリ内のソースコードに対して構文解析をタワードとして，まとめて数える．

行い，コードブロックを抽出した後，我々のグループ

また，検索するコード片を特徴ベクトルに変換する際で開発している類似コード片検出ツール CCFinder[2]は，学習データ用コードブロックに現れていた各予約

および，横井らのブロッククローン検出ツール [7] を語・識別子がそのコード片に現れている数を特徴量と使用し，類似コードブロックセット Si (1 ≤ i ≤ I) をしてベクトルに変換する．

作成する．類似コードブロックセット Si には構文的

BoW を用いたベクトル変換の例を図 5 に示す．図 5(1 ≤ j ≤ J) が属する．

中の Word_2 はメタワードであり，変数 x および y がに類似したコードブロック bi(j)

これに該当する．

また，ネガティブデータ (3.1 節) 生成用のソースコー
ドを用意し，コードブロック b0(l)(1 ≤ l ≤ L) を抽出

doc2vec doc2vec は，ニューラルネットワークによる教する．

師なし機械学習に基づくベクトル化方式であり，自然

STEP A-2

文書を対象とした機械学習において有効性が実証され類似コードブロックセット Si 内のコードブロック bi (j)ている [8]．本検索手法では，doc2vec を用いてコードを構文的な差異が含まれるように変更したコードブ

ブロックをベクトル化するにあたって，ライブラリは(1 ≤ k ≤ K) を，2.1 節で説明した 13 種

gensim*2 を利用している．doc2vec を用いたベクトル

ロック mbi(k)変換の例を図 6 に示す．

類のミューテーションオペレータを適用して作成する．このとき，mbi(k)(1 ≤ k ≤ K) は，類似コードブ

c 1959 Information Processing Society of Japan⃝*2https://radimrehurek.com/gensim/

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

検索精度を，適合率，再現率，F 値の観点から評価した．本^/LVW2EMHFW!OLVW QHZ$UUD\/LVW2EMHFW! 
ERROHDQSUHVHQWBWDEOH1DPH WUXH
OLVWDGG SUHVHQWBWDEOH1DPH 
LI SUHVHQWBWDEOH1DPH
OLVWDGG WDEOH1DPH  LV6HW7DEOH1DPH

実験で対象とした OSS は HBase 2.0*4 ，OpenSSL 0.9.1〜



1.1.0*5 ，FreeBSD 11.1.0*6 である．OpenSSL はアップデー
ト等により生じるバージョン間の類似コードブロックを評
価に使用するため，複数のバージョンを使用している．

UHWXUQOLVWKDVK&RGH `⋱ߑชմੵ͢ɾφʖέϱΝ‫ۯ‬പͲ෾͖ͬॽ͘
^ /LVW

 2EMHFW! OLVW

QHZ$UUD\/LVW  2EMHFW!



4.1 トレーニングパラメータ
本実験では，深層学習フレームワーク Chainer3.4.0*7 をʞ⋱Ϡυϩࡠ੔ɾϗέφϩड़ྙ ʞ

出力層の 3 層で，入力層の次元数は，入力する特徴ベクト⋱

図 6

使用し，FFNN を実装した．層の数は，入力層，隠れ層，

doc2vec をコード片に適用した例

ルの次元数に合わせており，出力層の次元数は類似コード
ブロックセットの種類に合わせて実験を行った．隠れ層の次元数は経験的に定めており，徐々に増やしていったとこ

まず，学習データ用コードブロックを ANTLR*3 を用

ろ，100 から 200 次元ほどで，学習がうまく進むようになっいてトークン単位に分割する．次に，コードブロック

た．出力層にはソフトマックス関数と閾値 0.95 のステッのトークンを 1 行にスペースで分かち書きをする．そプ関数を使用し，その結果出力が 0 ベクトルになった場合のような処理を行った文字列を学習データとして与は，特徴ベクトルにラベル 0 を割り当てる．

えると，機械学習によってトークンの分散表現ベクト
ル情報を持ったモデルを作成する．そのモデルにコー

4.2 実験手順

ドブロックのトークン列を入力として与えると，そのコードブロックの分散表現ベクトルを得ることがで検索精度の評価は以下の 3 つの手順で行った．

STEP 1きる．

各 OSS に対して学習用データセットと評価用データセットを作成する．

3.3 類似コードブロックの検索

STEP 2

この節では，類似コードブロックの検索を行う STEP B

学習用データセットを用いて FFNN の機械学習モデについて説明する．STEP B では，STEP A で作成したモデルを使用し，検索を実行する．STEP B は 3 つの手順かルを作成する．

STEP 3ら構成されている．STEP B の概要を図 7 に示す．

作成したモデルに評価用データセットを入力として与STEP B-1

え，適合率，再現率，F 値を算出する．

検索したいコード片を構文解析し，STEP A-3 と同様，

3.2.1 節で説明した手法で特徴ベクトルに変換する．

4.3 データセットの作成方法

STEP B-2

本実験で使用した学習用データセットと評価用データ

STEP A-5 で作成したモデルへ，STEP B-1 で作成しセットは以下通り作成した．

た特徴ベクトルを入力として与えると，その特徴ベク

STEP aトルがどの類似コードブロックセットに属するかの確モデルの学習・評価に使用するためには多くの類似率を示すベクトルが出力されるので，それを基にラベ

コードブロックが必要なので，各 OSS 内の類似コー

ル x(0 ≤ x ≤ I) を算出する．

ドブロックセットを抽出し，その中からコードブロッ

STEP B-3
算出したラベル x に対応する類似コードブロックセッ

クが 100 個以上存在するセットを選択する．

STEP bト Sx に属するコードブロック bx (j) (1 ≤ j ≤ J) を類

学習に必要なデータを確保しつつ，機械学習モデルに似コードブロックとして出力する．ただし，x = 0 のとって未知のデータをできるだけ多くするため，選択場合は，該当コードブロック無しとする．

したセット内の類似コードブロックの内 2 割に対してミューテーションを行い，類似コードブロックを新た

4. 評価実験に作成し，それらの特徴ベクトルを学習用データセッ

本章では，本研究で提案した類似コードブロック検索手
法の評価実験について述べる．評価実験では，3 つの OSS*4から作成したベンチマークを使用し，類似コードブロックの

*5

*3

*7

http://www.antlr.org/

c 1959 Information Processing Society of Japan⃝*6

https://hbase.apache.org/
https://www.openssl.org/
https://www.freebsd.org/
https://chainer.org/

5情報処理学会研究報告
IPSJ SIG Technical Report^dW ͲϮ^dW Ͳϭ^dW Ͳϯ
ܵ௫
‫ݒ‬Ԧ
ड़ྙ

೘ྙ

ร‫׷‬

‫͏ͪ͢ࡩݗ‬αʖχฤ௫ ሺଵሻ ௫ ሺଶሻ ⋯‫ݔ‬ಝ௅ϗέφϩ

ָसࡃΊωϣʖϧϩϋρφϭʖέ 0ྪࣇαʖχϔϫρέ
ιρφ

ϧϗϩ
 0

図 7

STEP B の概要図

トのポジティブデータとする．また，各セット毎にユ
ニークなラベルを付与する．

STEP cSTEP b で作成したポジティブデータと構文的に類似していないコードブロックの特徴ベクトルを，学習
データセットのネガティブデータとして 30000 個追加

ϔϫρέ ड़ྙ͠ΗΖ Ϡυϩ͗ड़ྙ໌ ΄͘ϧϗϩ ͪ͢ϧϗϩ
ϔϫρέ$


ϔϫρέ%


ϔϫρέ&


ϔϫρέ'


ϔϫρέ(


ϔϫρέ)



しては BigCloneBench[9] から，OpenSSL に関してはFreeBSD から，FreeBSD に関しては OpenSSL から取得した．

STEP d
実験対象の OSS から抽出したコードブロックの特徴
ベクトルを評価用データセットとする．評価用データ
セットに存在する，STEP a で抽出した類似コードブ
ロックセットに属するコードブロックの特徴ベクトルには，STEP b で付与した各セット毎に対応するラベルを付与する．
各 OSS から作成したデータセットにおけるポジティブ
データとネガティブデータの内訳を表 1 に示す．表 1 の評
価用データセットにはかなりの偏りがあるが，これは，評価用データセットは実験対象の OSS に含まれているすべてのコードブロックであり，OpenSSL は複数バージョン
を使用しているからである．
また，学習させるコードブロックと検索したいコード片の間に存在する構文的な差異の程度と検索精度の関係を調べるため，学習用データセットにおけるポジティブデータ
と評価用データセットにおけるポジティブデータの類似度を，OSS 毎に変更した．その内訳を表 2 に示す．Hbase
からは構文的にほとんど一致しているコードブロックを，OpenSSL からは構文的に大部分が一致しているコードブ
ロックを，FreeBSD からは構文的に一致している割合は低


3
4

3
5

0.6
0.75

図 8 検索精度指標の計算例

する．その際に使用したソースコードは，HBase に関

表 1

1$

いが似たような動作を行うコードブロックを，ポジティブ
データとして使用した．

4.4 検索精度の指標の定義
本実験では，適合率，再現率，F 値を用いて検索精度の評価を行った．これらの評価指標の説明を以下に示す．
適合率：

検索結果に対して本当に正しかった割合を指し，正確性に関する指標として用いられる．本実験では，評価用データセットに含まれているデータのうち，類似コードブロックを学習済みだとモデルが判定したデータ全体に対する，ポジティブデータの割合によって適合率を求める．
再現率：

正解に対して実際に検出された割合を指し，網羅性に関する指標として用いられる．本実験では，評
価用データセットに含まれるポジティブデータ全体のうち，モデルへ入力すると正しい検索結果を返すデー
タの割合によって再現率を求める．

F 値： 適合率と再現率の総合的な評価として用いられ，適合率と再現率の調和平均によって求められる．
図 8 は検索精度指標の計算例を示す．この例では，ブロック B〜F の 5 つに対して，モデルは類似コードブロッ
クを検索結果として出力しているが，そのうち類似コード
ブロックを正しく検索できているのはブロック C〜E の 3
つであるので，適合率は 53 となる．また，入力として与データセット

学習用データセット

評価用データセット

表 2

ポジティブデータ間の類似度

OSS 名

ポジティブ

ネガティブ

ポジティブ

ネガティブ

OSS 名

類似度

Hbase

28,82230,000740

12,688Hbase

0.9〜1.0

OpenSSL36,77230,000281

99,719OpenSSL

0.7〜0.8

FreeBSD

27,85230,000747

8,177

FreeBSD

0.1〜0.2

c 1959 Information Processing Society of Japan⃝6

情報処理学会研究報告
IPSJ SIG Technical Report^
LQW QXPL
FKDU S஦ྲྀ
IRU /LVW2EMHFW!OLVW QHZ$UUD\/LVW2EMHFW! 
ERROHDQSUHVHQWBPHVVDJH WUXH
OLVWDGG SUHVHQWBPHVVDJH 
LI SUHVHQWBPHVVDJH
OLVWDGG PHVVDJH  LV6HW0HVVDJHUHWXUQOLVWKDVK&RGH 

D ೘ྙαʖχฤ/LVW2EMHFW!OLVW QHZ$UUD\/LVW2EMHFW! 
ERROHDQSUHVHQWBWDEOH1DPH WUXH
OLVWDGG SUHVHQWBWDEOH1DPH 
LI SUHVHQWBWDEOH1DPH
OLVWDGG WDEOH1DPH  LV6HW7DEOH1DPHUHWXUQOLVWKDVK&RGH 

E ‫݃ࡩݗ‬Վ
図 9

構文一致コードブロックの検索成功例（HBase）

えたブロックのうち，実際に類似コードブロックをモデル^
஦ྲྀLI QXP ! DUJ!FRXQW^FKDU WPSBSLQW WOHQ DUJ!FRXQW
WPSBS  FKDU 23(166/BUHDOORF DUJ!GDWD
VL]HRI FKDU WOHQ 
LI WPSBS18//
UHWXUQ
DUJ!GDWD WPSBSDUJ!FRXQW WOHQ
IRU L QXPL DUJ!FRXQWL
DUJ!GDWD>L@ 18//
`
DUJ!GDWD>QXP@ S஦ྲྀ`
DUJF QXPDUJY DUJ!GDWDUHWXUQ  `が学習済みであるのは，ブロック C〜F の 4 つであるが，D ೘ྙαʖχฤ

そのうちモデルが正しい検索結果を返したのは，ブロック^
LQW QXPOHQL
FKDU S஦ྲྀ
IRU 
^஦ྲྀLI QXP ! DUJ!FRXQW^
DUJ!FRXQW 
DUJ!GDWD FKDU 23(166/BUHDOORF DUJ!GDWD
VL]HRI FKDU DUJ!FRXQW 
LI DUJF
 UHWXUQ  `
DUJ!GDWD>QXP@ S஦ྲྀ`
DUJF QXPDUJY DUJ!GDWDUHWXUQ  `

C〜E の 3 つであるので，再現率は 43 となる．F 値は，適合率と再現率の調和平均なので， 23 となる．
4.5 実験結果
表 3 は評価実験から算出された適合率，再現率，F 値をに示す．この表でわかるように Hbase と OpenSSL から作成したデータセットの再現率は 1.000 であった．この結果から，コードブロックを事前に学習させると，構文的に大部分が一致しているコードブロックは，極めて高い確率で検索できることが分かった．
検索に成功したコードブロックの例を図 9，10 に示す．

E ‫݃ࡩݗ‬Վ

これらの図の上のコードブロックは学習データであり，4.2
節の STEP 2 で作成したモデルは，下のコードブロックか

図 10

構文類似コードブロックの検索成功例（OpenSSL）

ら生成された特徴ベクトルを入力として与えられたときに，それが上のコードブロックと類似していると判定して$UUD\/LVW/RQJ!WLPHVWDPSV QHZ$UUD\/LVW! ILOWHU$UJXPHQWVVL]Hいる．赤文字で示した部分は，コード片における互いに異IRU LQW L LILOWHU$UJXPHQWVVL]H L ^
ORQJWLPHVWDPS3DUVH)LOWHUFRQYHUW%\WH$UUD\7R/RQJ ILOWHU$UJXPHQWVJHW L 
WLPHVWDPSVDGG WLPHVWDPS `UHWXUQQHZ7LPHVWDPSV)LOWHU WLPHVWDPSV 

なる部分である．
検索に失敗した例を図 11 に示す．これらは構文的に類似していないが，上下のコードブロックが類似しているとD ೘ྙαʖχฤ

モデルは判定している．青文字で示した部分は，モデルが
これら 2 つのコード片が類似していると判定した原因だと/LVW2EMHFW!OLVW QHZ$UUD\/LVW2EMHFW! 

考えられる文である．詳しくは 4.6 章で述べる．

ERROHDQSUHVHQWBWDEOH1DPH WUXH
OLVWDGG SUHVHQWBWDEOH1DPH 
LI SUHVHQWBWDEOH1DPH
OLVWDGG WDEOH1DPH 

4.6 考察まず，提案手法の検索精度について考察を行う．

 LV6HW7DEOH1DPHUHWXUQOLVWKDVK&RGH 

E ‫݃ࡩݗ‬Վ
表 3 検索精度の評価
BoW

図 11

Doc2Vec

検索に失敗した例（HBase）

OSS 名

適合率

再現率

F値

適合率

再現率

F値

Hbase

0.924

1.000

0.960

0.830

1.000

0.907

HBase，OpenSSL から作成したデータセットに対しては，OpenSSL

0.733

1.000

0.846

0.652

1.000

0.789

再現率が 1.000 という結果になった．これは，構文の類似度

FreeBSD

0.497

0.822

0.620

0.519

0.529

0.524

が高い場合は，ほぼ確実に正しい検索結果を返すというこ

c 1959 Information Processing Society of Japan⃝7

情報処理学会研究報告
IPSJ SIG Technical Reportとを示している．その反面，FreeBSD は適合率が少し低いのバージョン 1.0.0 以前のソースコードを学習させたという結果になった．適合率が低い原因として，学習デー

doc2vec のモデルを用いて特徴ベクトルに変換し，ラタと入力コード片の間に共通の文が存在する場合に，その 2ベルとして 1 を付与する．

つのコードブロックが似ているとモデルが判定する確率がSTEP2 STEP1 で作成した特徴ベクトルの中から a 個

少し高くなる可能性が考えられる．例えば，List<Object>

だけポジティブデータとして学習用データセットに加list = new Arraylist<Object>(); という文が含まれるコー

え，FreeBSD から抽出したコードブロックからランダ

ドブロックが OSS リポジトリに存在し，そのコードブロッ

ムに 30000 個を STEP1 と同じ基準で特徴ベクトルにクを学習データにしてモデルを作成した場合，そのモデル

変換し，ネガティブデータとして学習データセットにに，List<Object> list = new Arraylist<Object>(); などの加えた後，機械学習モデル Ma を作成する．a の値は，List 型のオブジェクトを作成する文を含むコードブロック

a = 1, 100, 1000, 2000, 3000, 4000, 5000, 7000, 10000 とを与えると，これら 2 つのコードブロックは，全体的には変化させ，合計 9 種類のモデルを作成する．

構文的に類似していなくても，類似しているとモデルが誤STEP3 STEP1 で 選 択 し た 関 数 の 過 去 バ ー ジ ョ ン に判定しやすくなる．本実験でも，図 11 の青文字で示した文が原因で，図 11 の 2 つのコード片は類似しているとモ

存 在 す る 類 似 コ ー ド ブ ロ ッ ク fn (n = 1, 2, · · · , N )を ，STEP1 と 同 じ 基 準 で 特 徴 ベ ク ト ル f⃗n (n =デルが判定した．FreeBSD から作成したデータセットは，

1, 2, · · · , N ) に 変 換 し ，作 成 し た 9 種 類 の モ デ ル

HBase・OpenSSL から作成したデータセットに比べるとM1 , M100 , · · · , M10000 それぞれに入力として与える．

検索精度が悪かった．このデータセットのコードブロック

STEP4 モデルが出力したベクトルから，STEP2 で学は，構文的に類似している割合が他のデータセットに比べ習させたポジティブデータ群と STEP3 で入力した特て少なかったので，データセット間の類似コードブロック

徴ベクトルが類似コードブロックセットに属していを検出するための本検索手法とは相性が悪かったと考えらる (ラベルが 1 である) とモデル Mn が判定する確率
PM (f⃗n , 1) を求め，データ数 a と確率 PM (f⃗n , 1) のれる．
次に，Ichi Tracker と本検索手法の検索結果の違いについて述べる．図 9 のコードブロックは，構文的に一致しているので，Ichi Tracker でも検索することができる．しかし，図 10 のコードブロックは構文的に類似しているので，

aa関係を調べる．

4.7.2 実験結果
4.7.1 節に基づいた実験の結果を表 4 に示す．また，表 4を折れ線グラフで表現したものを図 12 に示す．

CCFinder の連続一致トークン数の閾値によっては，Ichi

表 4 中の averagea と mina は以下の式で与えられ，モTracker では検索することができない可能性がある．従っデル Ma が特徴ベクトル f⃗n (n = 1, 2, · · · , N ) に対して算出て，本検索手法は，Ichi Tracker で検索できない可能性のする確率の平均値と最小値を表している．

あるコードブロックも，学習させることによって検索できることが確認できた．

4.7 ミューテーションの評価
本節では，ミューテーションを行うことによる検索結果

1 ∑
PMa (f⃗n )N n=1
Naveragea =mina =

min

n=1,2,···,N(1){PMa (f⃗n )}(2)

学習データ数 a が大きいほど averagea と mina は増加への影響の評価実験について述べる．モデルは出力層で，した．

どのラベルを割り当てることが適当かを表す確率を出力す

4.7.3 考察る．この評価実験では，モデルが特徴ベクトルを入力され元ソースコードに対してミューテーションを行って学習たときに，正しいラベルを割り当てる確率について分析し，データを増やす手法は，ディープラーニングにおける入門

学習用データセットに使用するポジティブデータの数と，作成したモデルが類似コードブロックを入力として与えら

表 4 ポジティブデータ数と判定確率

れたときに正しいラベルを割り当てる確率の関係を調べる

学習データ数 aaveragea

mina

1

0.000

0.000

100

0.000

0.000

1000

0.000

0.000

2000

0.973

0.173

STEP1 OpenSSL の 過 去 200 種 類 以 上 の バ ー ジ ョ ン

3000

0.992

0.675

に 含 ま れ ，バ ー ジ ョ ン 間 で 類 似 コ ー ド ブ ロ ッ ク

4000

0.989

0.731

fn (n = 1, 2, · · · , N ) が存在する関数 f を選択し，ミュー

5000

0.998

0.871

テーションを用いて類似コードブロックを大量に生成

7000

0.999

0.955

し，そこからコードブロックを抽出した後，OpenSSL

10000

0.999

0.978

ことで，ミューテーションの効果を評価している．

4.7.1 実験手順
ミューテーションの評価は以下の 4 ステップで行った．

c 1959 Information Processing Society of Japan⃝8

情報処理学会研究報告
IPSJ SIG Technical Report
ϭ
Ϭ͘ϵ
Ϭ͘ϴ
Ϭ͘ϳ
Ϭ͘ϲ
Ϭ͘ϱ
Ϭ͘ϰ
Ϭ͘ϯ
Ϭ͘Ϯ
Ϭ͘ϭ
Ϭ

トやファイルよりも細粒度であるコード片レベルの検索を行っている．

White ら [13] は，RNN（再帰型ニューラルネットワー

ི֮ク）とオートエンコーダを使用して抽象構文木のベクトル化を行い，各構文木ベクトルの l2 ノルムを計測することによって，コードクローン検出を行う手法を提案している．

Gu ら [14] は，機械翻訳にも使用されているディープラー
ϭ

ϭϬϬ

ϭϬϬϬ

ϮϬϬϬ

ϰϬϬϬ

ָसυʖν਼

 

図 12

ϯϬϬϬ

ϱϬϬϬ

ϳϬϬϬ

ϭϬϬϬϬ



ポジティブデータ数と確率の関係

ニングのモデルである，RNN Encoder-Decoder モデルを使用し，自然言語をクエリとして与えることで API の使用
順序例を生成する， API Learningを提案している．本

研究は，これら研究と異なり類似コードブロックの検索を目的としている．また，本研究は RNN に比べて単純な構

である，MNIST などの画像分類の問題から着想を得ている．画像分類の問題では，学習データを増やすために，元画像に対して拡大，縮小，移動などの操作を行い，元画像

造のネットワークである FFNN を使用している．

6. まとめと今後の課題と少し異なる似た画像を新たに作成して学習データに加え本研究では，FFNN を用いることによる，類似コードブていることがある．この発想をソースコードに適用し，元ロックの検索を試みた．本検索手法では，ミューテーショのソースコードから少し変更するために，ミューテーショ

ンで元ソースコードと構文的に類似したソースコードを作ンを行った．

成した後，コードブロックを抽出する．そして，抽出した

本節の実験においては，ポジティブデータの数を 2000

コードブロックを特徴ベクトルに変換し，各類似コードブに設定すると，学習に使用したポジティブデータと，過去

ロックセットに対応するラベルを付与し，教師あり学習をバージョンに存在する類似コードブロックのほとんどを，実行することで FFNN モデルを作成する．このモデルに，99%以上の確率で類似していると判定するモデルを作成

検索したいコード片の特徴ベクトルを入力することで，そすることができ，ポジティブデータの数が 7000 程になるのコード片と類似しているコードブロックのラベルがモデと，過去バージョンに存在する全ての類似コードブロック

ルから出力され，類似コードブロックを検索することがでに対して，90%以上の確率で類似していると判定するようきる．

になった．この実験から，ミューテーションを用いて学習データを増やすことは有効であると示すことができた．

5. 関連研究

評価実験では，3 つの OSS に対してコード検索を行い，構文的に差異があるコードブロックを非常に高い精度で検索できることが確認できた．
今後の課題として以下の点を挙げることができる．

コード検索とコードクローン検出は非常に近いテーマ• CCFinder を利用した Ichi Tracker と本手法を比較し，である．コード片を入力として与えるコード検索は，入力

Ichi Tracker では検索できない類似コードブロックがコード片のコードクローンが検索対象リポジトリ内に存在

本手法ではどの程度検索できるようになったのかを評するかどうかを調べているといえるので，Ichi Tracker[1]価する必要がある．

のように，コード検索の際にコードクローン検出ツールを• 適合率を高める必要がある．そのために，様々な構造使用することも多い．神谷らが開発した CCFinder[2] は，の FFNN について実験し，ある特定の文の存在に検索

トークン解析を行い，ユーザー定義名を特殊文字に変換し結果が影響されすぎないような FFNN の構造を見つた後，ソースコードをトークン列に変換し，閾値以上の長ける必要がある．

さで一致したトークン列をコードクローンとして検出している．
我々の研究グループでは，コンポーネントやファイル単位での再利用を特定する研究を行っている [10], [11], [12]．

• 本研究では，実装が容易であり，学習にかかる時間が比較的短いことから，FFNN を使用している．そのため，RNN 等の他のネットワークを使用して同様に実験を行いたいと考えている．

これら研究は，コンポーネントに含まれるクラスのシグネ• 検索速度の評価を行う必要がある．本検索手法は事前

チャ（クラス名，メソッドのシグネチャ，フィールド名な準備に多大な時間を要するため，検索の速度が，学習ど）やコンポーネントに含まれるファイル間の Jaccard 係にかかるコストに見合うものかどうかを評価する必要数，ファイル間の最長共通部分列を利用してコンポーネがある．

ントやファイル単位の再利用を特定している．本研究は，• 学習させる類似コードブロックセットの数をさらに増FFNN に基づく機械学習を用いることで，コンポーネン

やし，より大規模なリポジトリを管理することができ

c 1959 Information Processing Society of Japan⃝9

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

るかどうかを実験し，本検索手法の有用性を評価する必要がある．

• 検索精度の評価において，コードブロックの類似度だ
けでなく，各 OSS のコード片の特徴が検索精度に影響している可能性がある．そのため，同じ OSS 内に存在する様々な類似度をもつ類似コードブロックを学習させ，類似度と検索精度の関係をさらに正確に評価する必要がある．
謝 辞

本 研 究 は ，JSPS 科 研 費

JP25220003，

JP18H04094，JP16K16034 の助成を受けた．
参考文献
[1]

[2]

[3]

[4]
[5]

[6]
[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

Inoue, K., Sasaki, Y., Xia, P. and Manabe, Y.: Where
does this code come from and where does it go?integrated code history tracker for open source systems,
Proc. of ICSE 2012, pp. 331–341 (2012).
Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: amultilinguistic token-based code clone detection system
for large scale source code, IEEE Trans. Softw. Eng.,
Vol. 28, No. 7, pp. 654–670 (2002).
Roy, C. K. and Cordy, J. R.: A mutation/injection-based
automatic framework for evaluating code clone detection
tools, Proc. of ICSTW 2009, pp. 157–166 (2009).
Demuth, H., Beale, M. and Hagan, M.: Neural network
toolbox 6 User’s Guide, Mathworks (1994).
Inoue, K., Yokomori, R., Yamamoto, T., Matsushita,
M. and Kusumoto, S.: Ranking Significance of Software
Components Based on Use Relations, IEEE Trans. Software Eng., Vol. 31, No. 3, pp. 213–225 (2005).
Rush, D. and Bulsara, A.: Source Code Search Engine(2007). US Patent App. 11/663,417.
横井一輝，崔 恩瀞，吉田則裕，井上克郎：情報検索技術に基づくブロッククローン検出，電子情報通信学会技術研究報告，Vol. 117, No. 136, pp. 109–116 (2017).
Lau, J. H. and Baldwin, T.: An empirical evaluationof doc2vec with practical insights into document embedding generation, arXiv preprint arXiv:1607.05368(2016).
Svajlenko, J., Islam, J. F., Keivanloo, I., Roy, C. K. andMia, M. M.: Towards a big data curated benchmarkof inter-project code clones, Proc. of ICSME 2014, pp.
476–480 (2014).
Ishio, T., Kula, R. G., Kanda, T., Germán, D. M. andInoue, K.: Software ingredients: detection of third-party
component reuse in Java software release, Proc. of MSR
2016, pp. 339–350 (2016).
Ishio, T., Sakaguchi, Y., Ito, K. and Inoue, K.: Source
file set search for clone-and-own reuse analysis, Proc. ofMSR 2017, pp. 257–268 (2017).
Kawamitsu, N., Ishio, T., Kanda, T., Kula, R. G.,
Roover, C. D. and Inoue, K.: Identifying Source Code
Reuse across Repositories Using LCS-Based Source Code
Similarity, Proc. of SCAM 2014, pp. 305–314 (2014).
White, M., Tufano, M., Vendome, C. and Poshyvanyk,
D.: Deep learning code fragments for code clone detection, Proc. of ASE 2016, pp. 87–98 (2016).
Gu, X., Zhang, H., Zhang, D. and Kim, S.: Deep API
learning, Proc. of FSE 2016, pp. 631–642 (2016).

c 1959 Information Processing Society of Japan⃝

10