情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report

テキストマイニング技術を応用した
メソッドクローン検出手法の提案
山中 裕樹1,a)

吉田 則裕2,b)

崔 恩瀞1,c)

井上 克郎1,d)

概要：ソフトウェア保守における問題の 1 つとしてコードクローン（ソースコード中に存在する同一または類似した部分を持つコード片）が指摘されている．コードクローンを検出し，共通する処理に対して親クラスへの引上げやライブラリ化といった集約を行うことによって，ソフトウェアの保守性や可読性を向上させることが可能となる．これまでの研究において様々なコードクローン検出手法が提案されてきたが，多くの手法がプログラムの構造的な類似性に着目しており，意味的に類似したコードクローンを検出することを目的とした手法は少ない．また，プログラムの意味的な類似性に着目した手法では，検出時間に膨大な時間がかかるという問題点がある．そこで本研究では，テキストマイニング技術を応用したメソッド
クローン（メソッド単位のコードクローン）を検出する手法を提案する．テキストマイニングは文字列を対象としたデータマイニングのことであり，自然言語で書かれた文書の分類などに利用される．本手法ではこの技術を利用し，ソースコード中の識別子や予約語に利用される単語に対して重要度の重み付けを行うことによって，各メソッドの特徴ベクトルを計算する．そして，特徴ベクトル間の類似度を求めること
によってメソッドクローンの検出を行う．本手法によって，類似した処理を行うメソッドを高速に検出することが可能であると考えられる．

キーワード：コードクローン，ソフトウェア保守，テキストマイニング

Method Clone Detection Using Text Mining Techniques
Abstract: Code clone (i.e., code fragment that has identical or similar fragment in source code) is one of
the major problems for software maintenance. Software developers can increase the maintainability andthe readability of source code by merging them (e.g., create library, pull up method). At present, a lot oftechniques have been done on the detection of code clones in source code. However, most of them focus
on structural similarities. Moreover, the detection techniques that focus on semantic similarities lack thescalability for large-scale source code. In this study, we propose a technique to detect method clones using
text mining techniques (i.e., data mining technique intended for natural language text). In our approach,
we generate feature vectors for each method by weighting words in identifier and syntactic keyword basedon the important degree of them. And then, we detect method clones based on the similarity among thefeature vectors. We believe that our technique can perform the scalable detection of similar method clones
from source code.
Keywords: Code Clone, Software Maintenance, Text Mining

1. まえがき
1

2

a)
b)
c)
d)

大阪大学
Osaka University
奈良先端科学技術大学院大学
Nara Institute of Science and Technology
y-yuuki@ist.osaka-u.ac.jp
yoshida@is.naist.jp
ejchoi@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

c 2013 Information Processing Society of Japan

ソフトウェア保守における問題の一つとしてコードク

ローンが指摘されている．コードクローンとは，ソース
コード中に存在する同一または類似した部分を持つコー

ド片のことであり，コピーアンドペーストなどの様々な理由により生成される [1]．一般的に，コードクローンの存

1

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report

在はソフトウェアの保守を困難にするといわれている．例
えば，あるコード片に対して変更を加える場合，もしその部分がコードクローンであれば，対応する全てのコードク

ローンに対しても同様の変更が必要であるか否かの検討を行わなければならない．コードクローンを検出し，共通する処理に対して親クラスへの引上げやライブラリ化といった集約を行うことによって，ソフトウェアの保守性や可読性を向上させることが可能となる [2], [3]．

これまでに様々なコードクローン検出手法が提案されてきたが，その多くの手法がプログラムの構造的な類似性のみに着目している [4]．そのため，同一の処理を実装しているにも関わらず，for 文と while 文の違いなど構文上の実装が異なる場合，コードクローンとして検出することができる手法は少ない．また，プログラムの意味的な類似性に着目した手法もいくつか提案されているが，検出時間に膨大な時間がかかるという問題点がある [5], [6], [7]．

そこで本研究では，テキストマイニング技術を応用する

ことによって，識別子名などの情報から意味的に処理が類似したメソッド単位のコードクローン（以下，メソッドクローン）を検出する手法を提案する．テキストマイニングとは，テキストデータを対象としたデータマイニングのことであり，自然言語で書かれた文書の分類などに利用される [8]．なお，一般的なコードクローン検出手法ではコード

片単位の検出を行うが，本研究ではメソッド単位の検出を行う．コード片単位で検出を行う場合，処理の途中や曖昧なところで終了するコード片など，集約を行う事が困難であるコードクローンが多く検出されることがある．一方，

メソッドでは単一または少数の機能を実装しているため，処理内容がまとまっている．従って，検出の単位をメソッドとすることによって，コード片単位で検出を行う場合に比べて集約を行うことが容易であると考えられる．

本手法では，テキストマイニング技術を用いて，ソースコード中の識別子名や構文に用いられる単語に対して重み付けを行う事によって各メソッドの特徴ベクトルの計算を行う．そして，特徴ベクトル間の類似度を計算することによってメソッドクローンの検出を行う．また，

LSH(Locality-Sensitive Hashing) アルゴリズム [9] を用いて特徴ベクトルをあらかじめクラスタリングしておくこと

によって，類似度の計算コストを削減し，既存手法に比べて高速な検出を可能とした．

以降，2 節では，本研究の関連研究として，既存のコー

ドクローン検出手法とテキストマイニング技術について述べる．3 節では，本研究で提案するメソッドクローン検出

手法について述べる．4 節では，本手法の評価実験として，検出精度と検出時間の評価について述べる．最後に，5 節

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

2. 関連研究
本節では，本研究の関連研究として，既存のコードク

ローン検出手法，および，テキストマイニング技術について述べる．

2.1 コードクローン検出

これまでの研究において様々なコードクローン検出手法が提案されてきたが，そのどれもが異なったコードクローンの定義を持つ．Roy らは，コードクローンを以下の 4 つのタイプに分類している [10]．
タイプ 1:

空白の有無，レイアウト，コメントの有無など

タイプ 2:

タイプ 1 の違い加えて，変数名などのユーザ定

タイプ 3:

タイプ 2 の違いに加えて，文の挿入や削除，変タイプ 4:

同一の処理を実行するが，文の並び替えなど構の違いを除き完全に一致するコードクローン

義名，変数の型などが異なるコードクローン
更などが行われたコードクローン

文上の実装が異なるコードクローン

コードクローン検出には，主に構文の類似性に着目した検出手法 [11], [12], [13], [14] と意味的な類似性に着目した検出手法 [5], [6], [7] が存在する．構文の類似性に着目した手法では主にタイプ 1 からタイプ 3 までのコードクローン

が検出の対象であるが，意味的な類似性に着目した手法では全タイプのコードクローンの検出が可能である．以降，それぞれの手法について説明する．

2.1.1 構文の類似性に着目した検出手法

構文の類似性に着目した手法として，トークンベースの検出手法 [11], [12] や，抽象構文木を用いた検出手法 [13], [14]が存在する．

トークンベースの検出ツールの代表として，Kamiya らが開発した CCFinder[11] が挙げられる．この手法では，字

句解析を行うことによってソースコードをトークン列に変換し，変数名や関数名などのユーザ定義名を同一のトークンに変換する．そして，閾値以上の長さの共通トークン列を探索することによって，コードクローンの検出を行う．
従って，タイプ 2 までのコードクローンの検出を行うことが可能である．

また，抽象構文木を用いた検出ツールの代表として，

Jiang らが開発した DECKARD[13] が挙げられる．抽象構

文木とはソースコードの構文構造を木構造で表したグラフのことを意味する．この手法では，構文解析を行うことによってソースコードを抽象構文木に変換し，類似した部分

木を探索することによってコードクローンの検出を行う．
従って，タイプ 3 までのコードクローンの検出を行うことが可能である．

これらの手法では，比較的高速にコードクローンの検出

c 2013 Information Processing Society of Japan2

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report

䝯䝋䝑䝗䛾
䜽䝷䝇䝍

≉ᚩ䝧䜽䝖䝹

ᢳฟ䛧䛯䝽䞊䝗
DĞƚŚŽĚDĞƚŚŽĚ

ฟ⌧
ᅇᩘ
㼢㼍㼘㼡㼑
㻟
㼕㼠㼑㼙
㻞
㼒㼛㼞
㻟
䞉䞉䞉
䞉䞉䞉

䝽䞊䝗

䝋䞊䝇䝁䞊䝗䠄ධຊ䠅{a1 , a2 , a3 , ࠉ…}DĞƚŚŽĚDĞƚŚŽĚDĞƚŚŽĚ
ฟ⌧
ᅇᩘ
㼢㼍㼘㼡㼑
㻞
㼕㼠㼑㼙
㻠
㼒㼛㼞
㻝
䞉䞉䞉 䞉䞉䞉

DĞƚŚŽĚůƵƐƚĞƌϮ…}{b1 , b2 , b3 , ࠉDĞƚŚŽĚDĞƚŚŽĚDĞƚŚŽĚ䝽䞊䝗DĞƚŚŽĚDĞƚŚŽĚ㢮ఝᗘ 䝯䝋䝑䝗ᑐ 䜽䝻䞊䞁DĞƚŚŽĚϬ͘ϵϱ䘟DĞƚŚŽĚDĞƚŚŽĚϬ͘ϳϬDĞƚŚŽĚDĞƚŚŽĚϬ͘ϳϬDĞƚŚŽĚDĞƚŚŽĚϬ͘ϵϬ䘟DĞƚŚŽĚ
䞉䞉䞉
䞉䞉䞉
䞉䞉䞉

䞉
䞉
䞉

{c1 , c2 , c3 , ࠉ
…}

䞉
䞉
䞉

㻿㼀㻱㻼㻝㻦
䝽䞊䝗䛾ᢳฟ

䝯䝋䝑䝗䜽䝻䞊䞁
䠄ฟຊ䠅ůƵƐƚĞƌϭ䞉䞉䞉㻿㼀㻱㻼㻟㻦
≉ᚩ䝧䜽䝖䝹
䛾䜽䝷䝇䝍䝸䞁䜾

㻿㼀㻱㻼㻞㻦
≉ᚩ䝧䜽䝖䝹
䛾ィ⟬㻿㼀㻱㻼㻠㻦
≉ᚩ䝧䜽䝖䝹㛫䛾
䛾㢮ఝᗘ䛾ィ⟬図 1 検出手法の概要

Fig. 1 Overview of our detection technique

を行うことができる．しかし，プログラムの構造的な類似的解析に膨大な時間がかかる．

いったタイプ 4 のコードクローンの検出を行うことが困難

各メソッドを特徴ベクトルに変換し，それらの類似度を計

2.1.2 意味的な類似性に着目した検出手法を行う．また，あらかじめ特徴ベクトルをクラスタリング

性にのみ着目しているため，for 文や while 文の置き換えとである．

意味的な類似性に着目した手法として，プログラム依存グラフを用いた検出手法 [5], [6] や，メモリベースの検出手
法 [7] などが存在する．

プログラム依存グラフを用いた検出ツールの代表として，肥後らが開発した Scorpio[5] が挙げられる．プログラ

本研究では，識別子名などに基づいてソースコード中の算することによってタイプ 4 までのコードクローンの検出

しておくことによって，既存のタイプ 4 のコードクローン

検出手法に比べて高速な検出を行うことが可能である．

2.2 テキストマイニング

テキストマイニングとは，テキストデータを対象にした

ム依存グラフとは，プログラム内の要素間に存在する依存

データマイニングのことである．テキストマニングでは，は，ソースコードからプログラム依存グラフを構築し，類の手法を用いて単語やフレーズに分割し，それらの出現頻関係を表した有効グラフのことを意味する．この手法で定型化されていないドキュメントの集まりを自然言語解析

似した構造の部分グラフを探索することによってコードク度や相関関係を分析することによって有用な情報を抽出す

また，メモリベースの検出手法の代表として，Kim らがUramoto らは，テキストマイニングを行い，互いに類ローンの検出を行う．

る [8]．

開発した MeCC[7] が挙げられる．この手法では，静的解似した内容が記載されているドキュメントの分類を行っ

抽象的なメモリの状態を予測する．そして，それらの状態

によって，各ドキュメントから単語の抽出を行う．次に，析を行うことによって，各手続きが終了した時点におけるの比較を行い，コードクローンの検出を行う．

ている [15]．この手法では，自然言語処理解析を行うこと

単語の出現頻度や希少さに基づいて，ドキュメント中に存

これらの手法では，タイプ 4 までのコードクローンの検在する各単語に対して重要度の重み付けを行い，それらのフを用いた手法では，グラフの頂点が膨大な数となるため，する．そして，特徴ベクトル間の類似度を計算することに出を行うことが可能である．しかし，プログラム依存グラ
コードクローンの検出に時間がかかる．また，メモリベースの手法においても，メモリの状態の予測を行うための静c 2013 Information Processing Society of Japan

値を特徴量として各ドキュメントを特徴ベクトルに変換

よって，互いに内容が類似したドキュメントのクラスタリ
ングを行っている．

3

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report
表 1

識別子名の分割例

Table 1 Examples of segmentation of identifier
識別子

ワードへの分割

value of item

value, of, item

itemValue

item, value

子名に対してはそれらをまとめて 1 つのワードとして扱う．

この理由は，繰り返し文などによく利用される “i”や “j”といった意味情報が込められない変数を全て同一のものとして扱うためである．このように識別子の情報を利用することによって，各メソッドが実装する機能を表すことができると考えられる．これまでの研究においても，識別子にそUramoto らの手法では分類の対象が新聞であるが，本研の実態を表す名前を付けることがソフトウェアの品質を保ち，各メソッドに存在する識別子名や予約語に利用される

また，構文に利用される単語とは，条件文に用いられる

究ではソースコード中の各メソッドを対象とする．すなわ

つ上で重要であることが指摘されている [16], [17], [18]．

単語に対して重み付けを行い，それらの値を特徴量として“if”や “switch”，繰り返し文に用いられる “for”や “while”

3. メソッドクローン検出手法

て扱う．

利用する．

本節では，本研究で提案するメソッドクローン検出手法の概要について説明する．本手法ではテキストマイニング

といった予約語のことを示しており，それらをワードとし

3.2 STEP2:特徴ベクトルの計算

次に，STEP1 で抽出したワードに重み付けを行うこと

技術を応用することによって，ソースコード中のワードかによって，各メソッドから特徴ベクトルの計算を行う．こすることを目的とする．ここでワードとは，以下の 2 つをし，その値を特徴量として利用する．TF-IDF 法はテキス• 変数や関数などに付けられた識別子名を構成する単語利用されている．TF-DIF 法による値は tf 値（メソッド中ら意味的に処理が類似したメソッドクローンを高速に検出

こでは，TF-IDF 法 [19] を利用して各ワードの重みを計算対象とする．

トマイニングにおいて，文書の類似性の判定や情報抽出に• 条件文や繰り返し文などの構文に利用される予約語をのワードの出現頻度）と idf 値（メソッド集合中のワード

図 1 は本手法の概要を表している．本手法ではソース式を以下に示す．

構成する単語の希少さ）の積で与えられる．ワード w の重み vw の計算

コードを入力とし，クローンペア（互いに処理の内容が類

メソッド中のワード w の出現回数
メソッド中に出現する全ワードの出現回数の合計

似したメソッドの対）の集合をリストとして出力する．本tfw =STEP1: ソースコード中の各メソッドからワードの抽出

idfw = log

STEP2: STEP1 で抽出したワードに重み付けを行うこ

vw = tfw idfw

手法は以下の 4 つのステップから構成される．
を行う．

全メソッド数
ワード w が出現するメソッド数とによって，各メソッドの特徴ベクトルを計算する．

本手法では，全メソッド中の各ワードに対して重要度の重た特徴ベクトルのクラスタリングを行う．

特徴ベクトルを求める．従って，各メソッドの特徴ベクト

STEP3: LSH アルゴリズム [9] を用いて，STEP2 で求めみを計算し，それらを特徴量として用いることによって，

STEP4: STEP3 で求めたクラスタにおいて，特徴ベク

ルの次元はソースコード中に存在する全ワードの数となる．

トル間の類似度の計算を行い，メソッドクローンを検出する．

以降の節で，それぞれのステップの詳細について説明する．

3.1 STEP1:ワードの抽出

まず最初に，ソースコードの各メソッドに含まれる識別3.3 STEP3:特徴ベクトルのクラスタリング

このステップでは，STEP2 で計算した各メソッドの特徴ベクトルに対してクラスタリングを行うことによって，クローンペアと成り得る候補を絞ることを目的とする．

ここでは，近似最近傍探索アルゴリズムの一種である

LSH(Locality-Sensitive Hashing) アルゴリズム [9] を用い

子名や構文に利用される予約語から，ワードの抽出を行う．

て特徴ベクトルのクラスタリングを行う．LSH アルゴリ

でワード単位に分割する．

いることによって確率的に近傍点探索を高速に行う手法で識別子名が複数の単語から構成される場合，以下の方法

ズムは，高次元ベクトル空間において，ハッシュ関数を用• ハイフンやアンダースコアなどの区切り記号（デリミある．なお，本手法では LSH アルゴリズムの実装である• 識別子名中の大文字になっているアルファベットによ

データセットの次元を d，データセットの数を n，確率タ）による分割る分割

識別子名の分割例を表 1 に示す．また，2 文字以下の識別

c 2013 Information Processing Society of Japan

E2LSH*1 [20] を利用している．

に関するパラメータを ρ としたとき，LSH のクラスタリ*1

http://www.mit.edu/~andoni/LSH/

4

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report
表 2

表 3 提案手法の適用対象の OSS

ベンチマークによる検出精度の評価

Table 2 Evaluation of detection accuracy using benchmark set
ベンチマーク
検出結果

Table 3 OSS for application of our detection technique

タイプ 1

タイプ 2

タイプ 3

タイプ 4

OSS

規模

概要

3

4

5

4

Apache Ant

109KLOC

アプリケーションサーバ

3

2

5

4

ArgoUML

192KLOC

ングの時間計算量は O(dnρ log n) と表される．一方，全メ

ソッドに対して特徴ベクトル間の類似度を計算する場合の時間計算量は O(dn2 ) となる．従って，本ステップであらかじめクラスタリングを行い，クローンペアと成り得る候
補を絞ることによって，検出時間にかかる計算コストを削減できると考えられる．

Table 4 Evaluation of detection accuracy using OSS
OSS

検出クローンペア数

適合率

再現率

Apache Ant

474 個

0.92

0.62

0.96

0.55

最後に，STEP3 で求めた各クラスタ中のメソッドの対に対して，コサイン類似度を用いてクローンペアであるか否かの判定を行う．コサイン類似度は多次元ベクトルの類

似度を測定するものであり，次元が d である 2 つの特徴ベ
クトル ~a, ~b 間の類似度は以下の式で表すことができる．

メソッドクローンのタイプ別の検出数
タイプ 1

タイプ 2

タイプ 3

タイプ 4

Apache Ant

56

139

220

22

ArgoUML

222

219

371

33

ローンとして検出される類似度の閾値は，本手法のデフォ

ルト値である 0.9 を利用した．

4.1.1 Roy らのベンチマークを用いた評価

i=1 ai bid
i=1 ai

880 個

ArgoUML
表 5

Pd

OSS を用いた検出精度の評価

Table 5 Statistics of method clones by type

3.4 STEP4:特徴ベクトルの類似度の計算

sim(~a, ~b) = cos(~a, ~b) = qP

表 4

UML モデリングツール

qP
d2

i=1 bi2

TF-IDF 法の計算式から分かるように，特徴量は常に正の値となるため，コサイン類似度は 0 から 1 の範囲となる．

もし，コサイン類似度が閾値以上であれば，それら 2 つの最初に，Roy らのベンチマーク [10] を用いた検出精度の評価実験について説明する．このベンチマークでは，タイプ 1 からタイプ 4 までの合計 16 個のクローンペアが用意されており，文献 [7] の評価実験でも利用されている．

表 2 は，ベンチマークで用意されているクローンペアのメソッドはクローンペアであると判定する．本手法では，タイプ毎の個数と，本手法で検出できたクローンペアのタ

このように，テキストマイニング技術を応用して各メ

14 個のクローンペアを検出することができた．また，タイ

類似度の閾値として 0.9 を利用している．

ソッドに出現するワードから特徴ベクトルの計算を行い，イプ毎の個数を示している．結果として，全体で 16 個中

プ 1，タイプ 3，タイプ 4 において，本手法を用いて全てそれらの類似度を求めることによって，タイプ 4 のメソッのクローンペアを検出することを確認できた．タイプ 4 でペアに対して類似度を計算しているため，類似度によるメ置き換えが存在するクローンペアが用意されているが，本ドクローンの検出が可能となる．本手法では，各クローン
ソッドクローンのランキング付けも可能である．また，あらかじめ特徴ベクトルのクラスタリングを行い，クローン
ペアと成り得る候補を絞ることによって，より高速なメ
ソッドクローンの検出を実現できる．

4. 評価実験
本節では，3 節で述べたメソッドクローン検出手法の評

価実験について述べる．本実験では，ベンチマークを用いた検出精度の評価と，検出時間の評価を行った．4.1 節と4.2 節で，それぞれの詳細な実験手法と結果について述べる．また，4.3 節では，MeCC[7] と比較を行い，本実験のは，文の並び替えや for 文と while 文の繰り返し処理文の手法を用いることによってそれらをコードクローンとして検出することができた．

一方で，タイプ 2 では，2 つのクローンペアの検出を行うことができなかった．これらのクローンペアは，元の変数名が 1 文字のアルファベットに省略されており，意味をもたない変数名に変換されていたため，本手法ではコードクローンとして検出できなかったと考えられる．しかし，実際のソフトウェア開発では，変数名を意味のないものに置換する場合は少ないと考えられる．

4.1.2 OSS への適用

次に，Java 言語で実装された 2 つの OSS（表 3）に対し考察について述べる．

て本手法を適用し，Tempero らのベンチマーク [21] を用い

4.1 検出精度

対して，ベンチマークで正解集合と判定されているクロー

た実験と，OSS への適用実験を行った．なお，メソッドク

ク中のクローンペアに対して，本手法によって検出された

検出精度の評価では，Roy らのベンチマーク [10] を用い

c 2013 Information Processing Society of Japanて適合率と再現率の評価を行った．適合率は全検出結果にンペアの割合を表している．また，再現率は，ベンチマー

5

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report㻝㻦 㼜㼞㼕㼢㼍㼠㼑㻌㼢㼛㼕㼐㻌㼒㼕㼞㼑㼀㼍㼞㼓㼑㼠㻿㼑㼠㻔㼀㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠 㼠㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠㻕㼧㼕㼒㻌㻔㼕㼒㻌㻔㼘㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠 㻩㻩㻌㼚㼡㼘㼘㻕㻌㼧㻞㻦㼘㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻩㼘㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻩㼏㼛㼘㼘㼑㼏㼠㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㼟㻔㼠㼔㼕㼟㼏㼛㼘㼘㼑㼏㼠㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㼟㻔㼠㼔㼕㼟㻕㻧㻔㼠㼔㼕㼟㻕㻧㻟㻦㼩㻠㻦㻻㼎㼖㼑㼏㼠㼇㼉㻌㼘㼕㼟㼠㼑㼚㼑㼞㼟㻩㼘㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻚㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻔㻕㻧㻡㻦㼒㼛㼞㻌㻔㼕㼚㼠 㼕㻩㼘㼕㼟㼠㼑㼚㼑㼞㼟㻚㼘㼑㼚㼓㼠㼔 㻙 㻞㻧㻌㼕㻌㻪㻩㻌㻜㻧㻌㼕㻙㻩㻞㻕㻌㼧㻢㻦㼕㼒㻌㻔㼘㼕㼟㼠㼑㼚㼑㼞㼟㼇㼕㼉㻌㻩㻩㻌㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻚㼏㼘㼍㼟㼟㻕㻌㼧㻣㻦㻔㻔㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻕㼘㼕㼟㼠㼑㼚㼑㼞㼟㼇㼕㻗㻝㼉㻕㻚㼠㼍㼞㼓㼑㼠㻿㼑㼠㻔㼠㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠㻕㻧
㻤㻦
㼩
㻥㻦
㼩
㻝㻜㻦
㻝㻝㻦 㼩
(a) 変数の null チェック有り

㻝㻦
㻞㻦
㻟㻦
㻠㻦
㻡㻦
㻢㻦
㻣㻦
㻤㻦

㼜㼞㼕㼢㼍㼠㼑㻌㼢㼛㼕㼐㻌㼒㼕㼞㼑㼀㼍㼞㼓㼑㼠㻿㼑㼠㻔㼀㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠 㼠㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠㻕㼧㻻㼎㼖㼑㼏㼠㼇㼉㻌㼘㼕㼟㼠㼑㼚㼑㼞㼟㻩㼘㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻚㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻸㼕㼟㼠㻔㻕㻧㼒㼛㼞㻌㻔㼕㼚㼠 㼕㻩㼘㼕㼟㼠㼑㼚㼑㼞㼟㻚㼘㼑㼚㼓㼠㼔 㻙 㻞㻧㻌㼕㻌㻪㻩㻌㻜㻧㻌㼕㻙㻩㻞㻕㻌㼧㼕㼒㻌㻔㼘㼕㼟㼠㼑㼚㼑㼞㼟㼇㼕㼉㻌㻩㻩㻌㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻚㼏㼘㼍㼟㼟㻕㻌㼧㻔㻔㼀㼍㼞㼓㼑㼠㻸㼕㼟㼠㼑㼚㼑㼞㻕㼘㼕㼟㼠㼑㼚㼑㼞㼟㼇㼕㻗㻝㼉㻕㻚㼠㼍㼞㼓㼑㼠㻿㼑㼠㻔㼠㼍㼞㼓㼑㼠㻱㼢㼑㼚㼠㻕㻧
㼩
㼩
㼩

㻝㻦
㻞㻦

㼜㼞㼕㼢㼍㼠㼑㻌㼎㼛㼛㼘㼑㼍㼚 㼕㼟㼂㼍㼘㼕㼐㻱㼢㼑㼚㼠㻾㼑㼙㼛㼢㼑㻔㻼㼞㼛㼜㼑㼞㼠㼥㻯㼔㼍㼚㼓㼑㻱㼢㼑㼚㼠 㼑㻕㼧㼎㼛㼛㼘㼑㼍㼚 㼢㼍㼘㼕㼐㻩㼒㼍㼘㼟㼑㻧

䞉
䞉
䞉

䞉
䞉
䞉
㻯㼛㼘㼘㼑㼏㼠㼕㼛㼚㻌㼏㼛㼘㻩㻔㻯㼛㼘㼘㼑㼏㼠㼕㼛㼚㻕㼓㼑㼠㻯㼔㼍㼚㼓㼑㼐㻱㼘㼑㼙㼑㼚㼠㻔㼑㻕㻧㻵㼠㼑㼞㼍㼠㼛㼞㻌㼕㼠㻩㼏㼛㼘㻚㼕㼠㼑㼞㼍㼠㼛㼞㻵㼠㼑㼞㼍㼠㼛㼞㻌㼕㼠㻩㼏㼛㼘㻚㼕㼠㼑㼞㼍㼠㼛㼞㻔㻕㻧㼏㼛㼘㻚㼕㼠㼑㼞㼍㼠㼛㼞㻔㻕㻧㼕㼒㻌㻔㻍㼏㼛㼘㻚㼕㼟㻱㼙㼜㼠㼥㻔㻕㻕㻌㼧㼢㼍㼘㼕㼐㻩㼠㼞㼡㼑㻧㼣㼔㼕㼘㼑㻌㻔
㼣㼔㼕㼘㼑㻌㻔㼕㼠㻚㼔㼍㼟㻺㼑㼤㼠㻔㻕㻕㻌㼧㼕㼠㻚㼔㼍㼟㻺㼑㼤㼠㻔㻕㻕㻌㼧㻻㼎㼖㼑㼏㼠㻌㼛㻩㻻㼎㼖㼑㼏㼠㻌㼛㻩㼕㼠㻚㼚㼑㼤㼠㼛㻩㼕㼠㻚㼚㼑㼤㼠㻔㻕㻧㼕㼠㻚㼚㼑㼤㼠㻔㻕㻧㼕㼒㻌㻔㻍㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㼕㼒㻌㻔㻍㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㻔㼛㻕㻕㻌㼧㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㻔㼛㻕㻕㻌㼧㼢㼍㼘㼕㼐㻩㼒㼍㼘㼟㼑㻧㼎㼞㼑㼍㼗㻧
㼩㼩㼩㼑㼘㼟㼑㻌㼧

㻥㻦
㻝㻜㻦
㻝㻝㻦
㻝㻞㻦
㻝㻟㻦
㻝㻠㻦
㻝㻡㻦
㻝㻢㻦
㻝㻣㻦
㻝㻤㻦
㻝㻥㻦
㻞㻜㻦
䞉
䞉
䞉

䞉
䞉
䞉
(a) while 文を用いた繰り返し処理(b) 変数の null チェック無し
図 2

タイプ 3 のメソッドクローンの例（ArgoUML）㻝㻦㻞㻦㼜㼞㼕㼢㼍㼠㼑㻌㼎㼛㼛㼘㼑㼍㼚 㼕㼟㼂㼍㼘㼕㼐㻱㼢㼑㼚㼠 㻔㻼㼞㼛㼜㼑㼞㼠㼥㻯㼔㼍㼚㼓㼑㻱㼢㼑㼚㼠 㼑㻕㼧㼎㼛㼛㼘㼑㼍㼚 㼢㼍㼘㼕㼐㻩㼒㼍㼘㼟㼑㻧

Fig. 2 Examples of detected type 3 method clones in ArgoUML䞉䞉䞉㻝㻦 㼜㼡㼎㼘㼕㼏㻌㼢㼛㼕㼐㻌㼘㼛㼓㻔㻿㼠㼞㼕㼚㼓㻌㼙㼑㼟㼟㼍㼓㼑㻘㼕㼚㼠 㼘㼛㼓㼘㼑㼢㼑㼘㻕㼧㼕㼒㻌㻔㼙㼍㼚㼍㼓㼕㼚㼓㻼㼏 㻍㻩㻌㼚㼡㼘㼘㻕㻌㼧㻞㻦㼙㼍㼚㼍㼓㼕㼚㼓㻼㼏㻚㼘㼛㼓㻔㼙㼑㼟㼟㼍㼓㼑㻘㼘㼛㼓㼘㼑㼢㼑㼘㻕㻧㻟㻦㼩㼑㼘㼟㼑㻌㼧
㻠㻦㼕㼒㻌㻔㼕㼒㻌㻔㼘㼛㼓㼘㼑㼢㼑㼘 㻪㻌㻼㼞㼛㼖㼑㼏㼠㻚㻹㻿㻳㼋㼃㻭㻾㻺㻪㻌㻼㼞㼛㼖㼑㼏㼠㻚㻹㻿㻳㼋㼃㻭㻾㻺㻕㻌㼧㻼㼞㼛㼖㼑㼏㼠㻚㻹㻿㻳㼋㼃㻭㻾㻺㻕㻌㼧㻡㻦㻿㼥㼟㼠㼑㼙㻚㼛㼡㼠㻚㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㻿㼥㼟㼠㼑㼙㻚㼛㼡㼠㻚㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧㻢㻦㼩㼑㼘㼟㼑㻌㼧
㼑㼘㼟㼑㻌㼧
㻣㻦㻿㼥㼟㼠㼑㼙㻚㼑㼞㼞㻚㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㻿㼥㼟㼠㼑㼙㻚㼑㼞㼞㻚㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧
㻤㻦
㼩
㻥㻦
㼩
㻝㻜㻦
㻝㻝㻦 㼩
(a) if 文を用いた条件分岐処理

㻝㻦
㻞㻦
㻟㻦
㻠㻦
㻡㻦
㻢㻦
㻣㻦

㼜㼡㼎㼘㼕㼏㻌㼢㼛㼕㼐㻌㼘㼛㼓㻔㻿㼠㼞㼕㼚㼓㻌㼙㼑㼟㼟㼍㼓㼑㻘㼕㼚㼠 㼘㼛㼓㼘㼑㼢㼑㼘㻕㼧㼕㼒㻌㻔㼙㼍㼚㼍㼓㼕㼚㼓㻼㼏 㻍㻩㻌㼚㼡㼘㼘㻕㻌㼧㼙㼍㼚㼍㼓㼕㼚㼓㻼㼏㻚㼘㼛㼓㻔㼙㼑㼟㼟㼍㼓㼑㻘㼘㼛㼓㼘㼑㼢㼑㼘㻕㻧㼩㼑㼘㼟㼑㻌㼧
㻔㼘㼛㼓㼘㼑㼢㼑㼘 㻪㻌㻼㼞㼛㼖㼑㼏㼠㻚㻹㻿㻳㼋㼃㻭㻾㻺㻪㻌㻼㼞㼛㼖㼑㼏㼠㻚㻹㻿㻳㼋㼃㻭㻾㻺 㻫㻌㻿㼥㼟㼠㼑㼙㻚㼛㼡㼠㻫㻌㻿㼥㼟㼠㼑㼙㻚㼛㼡㼠 㻦㻌㻿㼥㼟㼠㼑㼙㻚㼑㼞㼞㻕㻚㻿㼥㼟㼠㼑㼙㻚㼑㼞㼞㻕㻚㼜㼞㼕㼚㼠㼘㼚㻕㻚㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㼜㼞㼕㼚㼠㼘㼚㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧㻔㼙㼑㼟㼟㼍㼓㼑㻕㻧㼩㼩(b) 三項演算子を用いた条件分岐処理
図 3

タイプ 4 のメソッドクローンの例（Apache Ant）

Fig. 3 Examples of detected type 4 method clones in ApacheAnt

クローンペアの割合を表している．

結果を表 4 に示す．実験の対象とした 2 つの OSS に対して再現率は 6 割前後であるが，適合率は 9 割を超えてお䞉䞉䞉㻯㼛㼘㼘㼑㼏㼠㼕㼛㼚㻌㼏㼛㼘㻩㻔㻯㼛㼘㼘㼑㼏㼠㼕㼛㼚㻕㼓㼑㼠㻯㼔㼍㼚㼓㼑㼐㻱㼘㼑㼙㼑㼚㼠䉔㻧㼕㼒㻌㻔㻍㼏㼛㼘㻚㼕㼟㻱㼙㼜㼠㼥㻔㻕㻕㻌㼧㼢㼍㼘㼕㼐㻩㼠㼞㼡㼑㻧㼒㼛㼞㻌㻔㻌㻌㻌㻌㻌㻌㻻㼎㼖㼑㼏㼠㻌㼛㻌㻦㻌㼏㼛㼘㻕㻌㼧㼒㼛㼞㻌㻔㻌㻌㻌㻌㻌㻌㻻㼎㼖㼑㼏㼠㻌㼛㻌㻦㻌㼏㼛㼘㻕㻌㼧㼕㼒㻌㻔㻍㼕㼒㻌㻔㻍㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㻔㻍㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㻔㼛㻕㻕㻌㼧㼕㼟㼂㼍㼘㼕㼐㻱㼘㼑㼙㼑㼚㼠㻔㼛㻕㻕㻌㼧㼢㼍㼘㼕㼐㻩㼒㼍㼘㼟㼑㻧㼢㼍㼘㼕㼐㻩㼒㼍㼘㼟㼑㻧㼎㼞㼑㼍㼗㻧
㼩㼩㼩㼑㼘㼟㼑㼧㻌㻌㻌㻌

㻥㻦
㻝㻜㻦
㻝㻝㻦
㻝㻞㻦
㻝㻟㻦
㻝㻠㻦
㻝㻡㻦
㻝㻢㻦
㻝㻣㻦
㻝㻤㻦

䞉
䞉
䞉

䞉
䞉
䞉

(b) for 文を用いた繰り返し処理
図 4

タイプ 4 のメソッドクローンの例（ArgoUML）

Fig. 4 Examples of detected type 4 method clones in ArgoUML

タイプ 1 からタイプ 4 までの全てのメソッドクローンの検出を行うことができた．

図 2 は，本手法によって検出したタイプ 3 のメソッド

クローンの例である．図 2(a) では変数 listenerList の null

チェックが行われているが，図 2(b) では行われていない．
この例のように，本手法を用いて null チェック漏れなど，不具合に直接関わるメソッドクローンを検出できることを確認できた．

また，検出されたタイプ 4 のメソッドクローンとしては，り，誤検出をほとんど含まずメソッドクローンを検出する

文の並び替え，if 文と三項演算子を用いた条件分岐処理のさらに，検出精度の評価で正解集合と判定したクローン換えなどの違いが存在するメソッドクローンを検出するこことができた．

ペアを手作業で各タイプに分類した．結果を表 5 に示す．

この表から分かるように，本手法を用いることによって，

c 2013 Information Processing Society of Japan

置き換え，for 文と while 文を用いた繰り返し処理の置きとができた．図 3，図 4 に本手法で検出したタイプ 4 のメ
ソッドクローンの例を示す．

6

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report
表 6 検出時間の評価

Table 6 Evaluation of detection time
OSS

規模

検出時間（パラメータ計算有）検出時間（パラメータ計算無）Python435KLOC

294 秒

83 秒

Apache HTTPD

343KLOC

PostgreSQL

937KLOC

447 秒

196 秒

図 3 は，条件分岐処理が置き換わっている例である．図3(a) では if-else 文を用いて標準出力と標準エラー出力の条

213 秒

68 秒

することができた（表 2）．また，OSS への適用実験では適合率が 9 割以上と高い値であることがわかった（表 4）．一

件分岐処理を実装しているが，図 3(b) では三項演算子を方 MeCC では，Roy らのベンチマークを用いた実験で 16

処理が置き換わっている例である．図 4(a) では 13-19 行

つの OSS に対して適用実験を行っているが，適合率は全て用いて条件分岐処理を実装している．図 4 は，繰り返し岐個 15 個のクローンペアの検出に成功している．しかし，3目で while 文を用いて繰り返し処理を実装しているが，図9 割未満と本手法に比べて低い．本手法では集約の対象と処理を実装している．これらの例のように，本手法を用い目的であるため，適合率が高いことは非常に重要である．

4(b) では 12-17 行目で for 文を用いて全く同一の繰り返しなるメソッドクローンを効率よく開発者に提示することがて，同一または類似している処理を実装しているにも関わ従って，本手法の検出精度は高いと言える．

ることを確認できた．

メータを計算する場合で 500 秒以下，パラメータの計算を

4.2 検出時間

クローンを検出できることを確認できた（表 6）．MeCC

らず，構文上の実装が異なるメソッドクローンを検出でき

検出時間の評価として，本実験では，MeCC[7] のスケー

また，検出時間の評価では，LSH アルゴリズムのパラ

行わない場合においては 200 秒と現実的な時間でメソッドにおける評価実験と本手法の実行環境は異なっているが，ラビリティの評価で用いられている C 言語で実装された

MeCC では 3 つの OSS に対して静的解析に 1 時間以上か対して適用を行った．なお，本実験は以下のワークステー

であると言える．

3 つの OSS（Python，Apache HTTPD，PostgreSQL）にションの下で行った．

• OS: Windows 7 64-bit• CPU: Intel Xeon 2.40GHz• RAM: 16.0GB

結果を表 6 に示す．表中のパラメータ計算とは，特徴ベ

クトルのクラスタリングで利用している E2LSH に対するものである．E2LSH は LSH のパラメータを自動的に決定する機能を持つ．この機能はデータセットの中からいくつかのデータをランダムに選択し，その値の傾向を見て適当かるため，本手法は高速にクローン検出を行うことが可能
ただし，本実験では検出精度の評価に，Java 言語で実装

された 2 つの OSS に対してのみ適用を行っている．そのため，他の言語で実装された OSS に対しても適用し，検出精度の評価を行う必要がある．また，検出時間の評価についても，さらに規模が大きい OSS に対して適用を行い，評価を行う必要がある．

5. まとめと今後の課題
本研究では，テキストマイニング技術を応用したメソッなパラメータを自動的に設定する．従って，1 つの適用対ドクローン検出手法の提案を行った．本手法では，ソース

出においてもその値を再利用することが可能であると考え算し，それらを特徴量として各メソッドの特徴ベクトルを結果として，パラメータ計算を行う場合において，500とによって，意味的に処理内容が類似したメソッドクロー

象に対してパラメータの値を一度計算すれば，その後の検られる．

秒以下でメソッドクローンを検出できることを確認できた．また，パラメータ計算を行わない場合においては，全ての OSS に対して 200 秒以下でメソッドクローンを検出できることを確認できた．

4.3 考察本実験の考察として，本手法同様にタイプ 4 のメソッド

クローンの検出を目的とする MeCC[7] と比較を行った，

検出精度の評価において，本手法では，Roy らのベンチ

マークを用いた実験で 16 個中 14 個のクローンペアを検出

c 2013 Information Processing Society of Japan

コード中の各ワードに対して TF-IDF 法を用いて重みを計計算する．そして，特徴ベクトル間の類似度を計算するこンの検出を行う．また，LSH アルゴリズムを用いてあらか

じめ特徴ベクトルのクラスタリングを行うことによって，高速なメソッドクローンの検出を実現した．

評価実験では，検出精度の評価として，Roy らのベンチ

マークと Java 言語で実装された 2 つの OSS に対して適用を行い，高い精度で検出できることを確認した．さらに，繰り返し処理や条件分岐処理の実装が異なっているタイプ

4 のメソッドクローンの検出を行う事を確認できた．また，
C 言語で実装された 3 つの OSS に対して検出時間の評価を行い，既存手法に比べて高速にメソッドクローンを検出

7

情報処理学会研究報告

Vol.2013-SE-182 No.28
2013/10/25

IPSJ SIG Technical Report

できることを確認できた．

今後の課題として，以下が挙げられる．

[9]• 再現率の精度を向上させる必要がある．具体的には，類義語や同位語の関係を用いたワードのクラスタリン

グや，ワードの品詞による重み付けを行うことによっ[10]て，リネームが行われた場合のメソッドクローンの検
出精度を向上させる．

• 現状では Java 言語と C/C++言語にのみ対応してい[11]

るが，手法を拡張させて COBOL など他の言語にも対応する必要がある．

• 他の OSS に対して適用し，既存手法と比較しながら[12]

本手法の有用性を評価する必要がある．

謝辞 本研究は JSPS 科研費 25220003，21240002 の助成を得たものである．

[13]

参考文献
[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

肥後芳樹，楠本真二，井上克郎：コードクローン検出とその関連技術，電子情報通信学会論文誌，Vol. J91-D, No. 6,
pp. 1465–1481 (2008).
Fowler, M.: Refactoring: improving the design of existing code, Addison-Wesley Longman Publishing Co., Inc.,
Boston, MA, USA (1999).
肥後芳樹，神谷年洋，楠本真二，井上克郎：コードクローンを対象としたリファクタリング支援環境，電子情報通信学会論文誌，Vol. 88, No. 2, pp. 186–195 (2005).
Rattan, D., Bhatia, R. and Singh, M.: Software clone detection: a systematic review, Information and Software
Technology, Vol. 55, pp. 1165–1199 (2013).
肥後芳樹，楠本真二：プログラム依存グラフを用いたコー
ドクローン検出法の改善と評価，情報処理学会論文誌，Vol. 51, No. 12, pp. 2149–2168 (2010).
Komondoor, R. and Horwitz, S.: Using slicing to identify duplication in source code, Proceedings of the 8thInternational Symposium on Static Analysis, SAS ’01,
pp. 40–56 (2001).
Kim, H., Jung, Y., Kim, S. and Yi, K.: MeCC: memory comparison-based clone detector, Proceedings of the
33rd International Conference on Software Engineering, ICSE ’11, pp. 301–310 (2011).
Hearst, M. A.: Untangling text data mining, Proceedings of the 37th annual meeting of the Association for
Computational Linguistics on Computational Linguis-c 2013 Information Processing Society of Japan

[14]

[15]

[16]

[17]

[18]
[19]
[20]

[21]

tics, ACL ’99, pp. 3–10 (1999).
Indyk, P. and Motwani, R.: Approximate nearest neighbors: towards removing the curse of dimensionality, Proceedings of the thirtieth annual ACM Symposium on
Theory of Computing, STOC ’98, pp. 604–613 (1998).
Roy, C. K., Cordy, J. R. and Koschke, R.: Comparison and evaluation of code clone detection techniques
and tools: a qualitative approach, Science of Computer
Programming, Vol. 74, No. 7, pp. 470–495 (2009).
Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: amultilinguistic token-based code clone detection system
for large scale source code, IEEE Transactions on Software Engineering, Vol. 28, No. 7, pp. 654–670 (2002).
Li, Z., Lu, S., Myagmar, S. and Zhou, Y.: CP-Miner:
Finding Copy-Paste and Related Bugs in Large-Scale
Software Code, IEEE Transactions on Software Engineering, Vol. 32, No. 3, pp. 176–192 (2006).
Jiang, L., Misherghi, G., Su, Z. and Glondu, S.:
DECKARD: scalable and accurate tree-based detectionof code clones, Proceedings of the 29th International
Conference on Software Engineering, ICSE ’07, pp. 96–
105 (2007).
Baxter, I. D., Yahin, A., Moura, L., Sant’Anna, M. andBier, L.: Clone detection using abstract syntax trees,
Proceedings of the International Conference on Software Maintenance, ICSM ’98, pp. 368–377 (1998).
Uramoto, N. and Takeda, K.: A method for relating
multiple newspaper articles by using graphs, and its application to Webcasting, Proceedings of the 36th Annual
Meeting of the Association for Computational Linguistics, ACL ’98, pp. 1307–1313 (1998).
Kernighan, B. W. and Pike, R.: The practice of programming, Addison-Wesley Longman Publishing Co.,
Inc., Boston, MA, USA (1999).
Hunt, A. and Thomas, D.: The pragmatic programmer:from journeyman to master, Addison-Wesley Longman
Publishing Co., Inc., Boston, MA, USA (1999).
McConnell, S.: Code complete, Second Edition, Microsoft Press, Redmond, WA, USA (2004).
徳永健伸：情報検索と言語処理，東京大学出版会 (1999).
Andoni, A. and Indyk, P.: Near-optimal hashing algorithms for approximate nearest neighbor in high dimensions, Communications of the ACM, Vol. 51, No. 1, pp.
117–122 (2008).
Tempero, E., Anslow, C., Dietrich, J., Han, T., Li, J.,
Lumpe, M., Melton, H. and Noble, J.: The qualitas corpus: a curated collection of Java code for empirical studies, Proceedings of the 2010 Asia Pacific Software Engineering Conference, APSEC ’10, pp. 336–345 (2010).

8