日本ソフトウェア科学会第 38 回大会 (2021 年度) 講演論文集

Java システムにおけるパッケージ誤りのニューラル
ネットワークを用いた検出手法
依田 和樹

中丸 智貴

穐山 空道

山崎 徹郎

千葉 滋

本論文では，Java システムにおいて本来あるべきと異なるパッケージに配置されてしまったメソッドをニューラル
ネットワークを用いて検出する手法を提案する．パッケージの誤りは開発現場においてしばしば見られ，開発者の生産性に悪影響を与えることが知られている．しかし，それらを一般に検出する手法は未だ存在していない．我々は開発プロジェクト内のメソッドをその所属するパッケージに分類するという学習を通して，アーキテクチャデザインの観点からあるべきパッケージを予測するモデルを得た．この際，検出対象のプロジェクトのみでは訓練データが足りないといった問題を解決するため，Few-shot 学習の手法を用いた．実際にモデルを実在のプロジェクトに適用し，誤りの実例を検出した．また，Few-shot 学習を活用し，パッケージの配置を考える上で重要なソースコードの特徴
はプロジェクトを超えて共通であることを示した．なお，本研究における評価実験は予備的なものであり，本論文の内容は途中経過の報告であることを述べておく．

Web システムにおいてデータベースへのアクセスは

1 はじめにModel から行われるべきであるが，仮に Controller

ソフトウェアアーキテクチャの重要性は多くの研究内からデータベースを操作するようなメソッドが存で言及され，開発現場においても広く認識されてい在すれば，それはパッケージを誤っていると言える．

る [22]．Java プロジェクトの開発においては，アー

このような実装はパッケージの境界を曖昧にし，開キテクチャはパッケージ間の関係として表現される．

発者の生産性を下げることにつながる点で問題であつまり，各パッケージは他のパッケージに向けてそれる [10] [1]．対象を MVC アーキテクチャに限定してぞれのサービスを公開するインターフェースを持ち，このような違反を検出する研究は存在するが [11]，互いに疎結合なパッケージが情報のやり取りをする

MVC 以外にも一般にパッケージの誤り検出を行うタことでアーキテクチャを表現する．このように，パッ

スクは本研究で初めて取り組むものである．

ケージの境界が明確である状態を保ちつつ開発を進提案手法ではニューラルネットワークを用い，対象めることが生産性を高めることに寄与するとされてプロジェクトに最適化するように訓練した検出器をいる [1]．

用いて検出を行う．これは，プロジェクトごとのデ本研究では誤ったパッケージに配置されたメソッド

ザインの考え方の違いを検出に反映するためである．

を一般に検出するツールを提案する．例えば，Model-

しかし，検出対象のプロジェクトに含まれるデータ

View-Controller (MVC) アーキテクチャを採用するの量は通常そこまで多くなく，ニューラルネットワー
クの学習を行うには十分でない．そこで，本研究でDetecting Misplaced Methods in Wrong Java Packages Using Neural Models.
This is an unrefereed paper. Copyrights belong to
the Authors.
Kazuki Yoda, Tomoki Nakamaru, Soramichi Akiyama,
Tetsuro Yamazaki, Shigeru Chiba, 東 京 大 学, The
University of Tokyo.

は Few-shot 学習の手法を応用することで，単一プロ
ジェクトのみのデータでも十分に学習ができるようにモデルを構築した．Few-shot 学習の手法をソース
コードを処理するタスクに応用するのも本研究が初めての試みである．

// in the controller package@GetMapping ( " /{ userId } " )public User getUserById (@PathVariable ( " userId " )final Long userId ) {return userRe posito ry . findById ( userId ). orElseThrow (() ->new I l l e g a l A r g u m e n t E x c e p t i o n (" The requested userId [ "+ userId + " ] does not exist . " ));}// in the service package
public Author findAuthor ( Long id ) {return this . a u t h o r M a p p e r M y b a t i s. findAuthor ( id );}リスト 2

本来 service.impl にあるべき実装クラスがservice に存在しているており，このメソッドは controller パッケージのリスト 1

controller から service を経由せずに直接UserController クラスに実装されている．実装としrepository にアクセスしているては問題なく動作するものの，この実装は controller
パッケージ内から repository パッケージのオブジェ

本研究の評価実験は依然予備段階ではあるものの，
以下の 2 点を貢献として考える．

1. 誤ったパッケージに配置されたメソッドを検出するツールを開発したクトである userRepository にアクセスしている点で問題である．このプロジェクトの他の実装を参照する限り controller パッケージからは Model を実装
する service パッケージのオブジェクトへのアクセ

2. Few-shot 学習を用い，パッケージの配置を考えスしか許されておらず，service の内部構造である

る上で重要なソースコードの特徴はプロジェクト

repository への直接的なアクセスはデザインルール

を超えて共通であることを示したに違反している．従って，このメソッドは service の実装となるように移動されるべきであり，controller

2 研究の動機は単純に service に処理を委譲して結果を返却する

ソフトウェア開発において，コードを分割して整のみとされるべきである．この例は Brain Controller

理された状態を保つことの重要性は多くの研究で指と呼ばれるコードスメル の一種としても認識されて摘され，一般の開発者にも浸透している．Java で記

おり [5]，コードの理解容易性，テスト容易性，拡張

述されたソフトウェアにおいては，パッケージがモ性，再利用性を下げる原因とされている [10]．

ジュールの役割を果たし，それぞれのパッケージが特定の責務や関心を実装するクラス群を内包する [1] [7]．

パッケージを誤ったメソッドをさらに一例挙げる(リスト 2)．†3 これはリスト 1 とは別のプロジェクト

パッケージの境界は情報の隠蔽 [18] や高凝集・低結であるが，同様に Spring Framework を用いた MVC

合 [21] などの様々な原則に従って規定され，このこアーキテクチャに基づくものである．このメソッドとが開発者の生産性に寄与するとされている．
反対に，パッケージの設計原則に反した実装は開は引数の id を用いてデータベースを検索するものであり，コード中の MyBatis†4 という単語はデータ

発者の生産性を低下させる原因となる．本研究でベースアクセスを行うライブラリを指す．このプロは誤ったパッケージに配置されたメソッドに着目す

ジェクトの構造を概観すると，Model の実装はインる．リスト 1 はその一例であり，GitHub 上にソー

ターフェースとその実装でパッケージが分けられておスコードが公開された実在のプロジェクトの実装である．†1 このプロジェクトは Spring Framework†2

り，インターフェースは service パッケージに，実を用いた MVC アーキテクチャに基づいて実装されいることがわかる．この点において，リスト 2 の実装†1 https://github.com/Apress/learn-microservicesw-spring-boot†2 https://spring.io

装クラスは service.impl パッケージに配置されては Model の実装クラスであるにも関わらず service†3 https://github.com/zhuzhengping911/MySpringBoot†4 https://mybatis.org

パッケージに配置されていることが問題であると言も，service にはインターフェース宣言ばかりだが，える．このような実装もリスト 1 と同様に，プロジェ

service.impl には Mybatis という単語を用いる実クトの構造理解を妨げ，リファクタリングや自動テス装が多いため service.impl に移動させるべきといトの対象から見落とされてバグの原因となる可能性

う結論を導ける．

をはらんでいる．

以上の観察を基に，本研究ではメソッド本文の関連配置を誤ったメソッドの検出に類する代表的な研度による比較を行い，プロジェクトのデザインルール

究として Feature Envy の検出 [23] [8] [16] がある．

に照らして他のパッケージに移動されるべきメソッド

Feature Envy なメソッドとは，現在配置されているを検出する手法を提案する．

クラス内でのメソッド・フィールド呼び出しよりも他のクラスのメソッド・フィールドへの呼び出しが多3 提案手法く，他のクラス側により強い関心を持っているメソッ

本研究で扱うタスクは，誤ったパッケージに配置さドである [9]．このようなメソッドはより強い関心をれたメソッドを検出し，本来あるべきパッケージを持つクラスの下に移動されるべきであると考えられ指摘するものである．入力情報として与えられるのる．つまり Feature Envy の検出は，クラスを誤ってはプロジェクト全体のソースコードのみであり，検出配置されたメソッドを検出・移動するタスクであり，結果としてパッケージを誤ったメソッドとその本来あ本研究で扱うタスクと関連する研究である．

るべきパッケージを挙げる．例えば，プロジェクト全

しかし，リスト 1, 2 の例は Feature Envy には該体からリスト 1 のような例を挙げ，controller から当せず，従来手法を用いて検出することはできない．

service に移動させるべきと指摘するタスクとなる．

まず，リスト 2 の例は明らかにメソッド呼び出しに検出モデルの入力にはメソッドのテキスト情報を与関わる誤りではない．リスト 1 の例についても，メえ，ニューラルネットワークを用いてベクトルへの変

ソッド呼び出しの関係からわかることは controller換を行う．セクション 2 では，このタスクにおいてメから repository への呼び出しがあるというだけでソッド本文の情報を活用する必要性を述べた．従来のあり，ここから service に移動させるべきという結研究におけるテキスト情報の利用は識別子のラベル論は得られない．このように，本研究が対象とする問のみを一定のルールに基づき数値変換するに留まって

題は Feature Envy とは異なるものである．

いたが [14]，近年のニューラルネットワークを用い

これらの例を誤りとして検出し，正しいパッケージた研究では AST (抽象構文木) 上の文構造なども併せを提示するために考慮すべきことは 2 つあると考えてエンコードする手法が頻繁に用いられ，様々なタスる．それは，1) プロジェクトごとのデザインの違いをクで従来手法を上回る成果を挙げている [3] [4] [2]．本考慮すること，2) メソッド本文のテキスト情報を用い研究においてもメソッドのエンコードに同様の手法をることである．ここで，プロジェクトのデザインとは，用いることで性能の向上が期待できると考えられる．

どのパッケージにどのような実装が内包されているか

プロジェクトごとに異なるデザインの違いを検出という全体的な傾向を指す．メソッド本文のテキストに反映するため，モデル全体の構成には prototypical

情報と併せてリスト 1 の例を考えると，controller

networks [20] (以下，PN) を用いる．PN はそれぞパッケージのメソッドには service という単語が多れのプロジェクトごとに最適化した検出モデルを行う

く出現するが repository という単語は出現しない

ことのできるモデルである．これを用いて Few-shot

といった傾向がわかる．また，service パッケージ

学習を行うことで，単一プロジェクトの少ないデータには他のどのパッケージよりも多く repository とからでも十分な学習が可能となる．セクション 2 でいう単語が出現することから，リスト 1 のメソッ指摘した通り，リスト 1, 2 のような例を誤りと指摘

ドは controller から service に移動されるべきでするためには，プロジェクトごとのデザイン指針，つあるという結論が導ける．同様に，リスト 2 の例

まり，各パッケージにどのようなメソッドが集まって

いるかという情報を抽出する必要がある．PN を用いることでこれらの情報を抽出し，対象プロジェクトに最適化した検出結果が期待できる．

3. 2 モデルの構成と訓練方法
検出に用いるモデルは大きく 1) メソッドのテキス
ト情報をベクトルに変換するエンコーダーと 2) エン
コーダーの出力結果をいずれかのパッケージに分類す

3. 1 システムの全体像

る分類器から構成される (図 1)．以下ではそれぞれのパッケージを誤ったメソッドの検出は，入力したメ

詳細な構成と訓練方法について述べる．

ソッドをいずれかのパッケージに分類するような分類

エンコーダー エンコーダーはメソッドのテキスト情器を訓練することによって行う．検出の全体像を図 1

報をベクトルに変換するニューラルネットワークでに示す．分類器の出力はプロジェクト内のパッケージある．本研究では Code2vec [4] のエンコーダーを改ごとに所属確率を推論したものであり，最も高い確率

変し，型の情報を活用できるようにしたモデルを用が出力されたパッケージが本来あるべきパッケージでいる．

あると結論する．その後，推論されたパッケージと入Code2vec はメソッドから得られる AST をベクト力したメソッドの現在存在しているパッケージが異なルに埋め込むモデルである．ただし，メソッド名のり，かつ確率が一定の閾値を超えている場合にそのメ

情報は AST から除かれている．入力形式は木構造

ソッドの配置が誤りであるとして検出する．

そのものではなく，2 つの葉ノードとそれらを結ぶ検出モデルの学習は二段階あり，1) 対象プロジェ

パス (AST context) を構文木上からランダムに n 個クトに適用する前に大量の別プロジェクトによって行

サンプルしたものである．個別の AST context はう事前学習と，2) 対象プロジェクトのデータを用い(ws , wt , r1 , . . . , rl ) というタプルとして表現するものてそのプロジェクトでの分類に最適化した分類器を得とする．ws , wt は始点と終点の葉ノードであり，メるための学習に分かれている．具体的な手法はセク

ソッド中のいずれかのトークンに相当する．r1 , . . . , rl

ション 3. 2 で詳述する．

は 2 つの葉を結ぶ l 個のノードであり，式や文などの本システムを用いて実際に検出を行う際は，対象

AST の構成要素に相当する．エンコーダーの役割はプロジェクト内のすべてのメソッドを訓練データとテ

これら n 個の AST context からそれぞれのベクトル

ストデータに分割する必要がある．例えば，プロジェ

表現 z1 , . . . , zn を求めて，それらを用いて最終的なクト全体のメソッドのうち 8 割を訓練データ，2 割をメソッドの分散表現 v ∈ Rd を得ることである．

テストデータとなるように分割する．事前学習済みのパスのエンコードには Code2seq [3] で採用されたモデルを用いて訓練データで分類器を訓練すること

Bi-directional LSTM を用いた構成を採用する．こにより，対象とするプロジェクトに最適化した分類がれは Code2vec の構成への改善として Code2seq で導行えるようになる．この方法でテストデータを対象と入されたものと同様である．

した検出が行えるようになるものの，これではプロ
ジェクト全体の 2 割のデータしか対象にすることがh1 , . . . , hl = LST M (Ernodes, . . . , Ernodes
)
1
l
−
→ ←
−
encode path(r1 , . . . , rl ) = [ hl ; h1 ]できていない．そのため，実際のユースケースでは訓

ここで，E nodes は AST ノード中に現れる単語に対練データとテストデータを入れ替えながら，すべてのする埋め込み行列である．

データが一回ずつテストデータとなるようにして検葉ノードのエンコードも概ね Code2seq の構成に出を行う．また，開発中のプロジェクトにおいて新規倣うが，型情報を入力に含めるように拡張を行った．

のコード差分に対してのみ検出を行うことも可能で

まず，入力値の w は split(·) 関数を用いてキャメルある．この場合は，既に存在するコードベースをすべ

ケースの大文字部分を基準としたサブトークンに分て訓練データに用い，コード差分に含まれるメソッド

割する．例えば getCurrentTime というメソッド名

のみを対象として検出を行う．

は get，current，time の 3 つに分割される．次に

project
package 1

package 2

package probability

package 3

methodmethodclassifier

training
methodmethodmethodmethodmethodmethodencoder

methodtest

package 1

0.04

package 2

0.16

package 3

0.80

the test method is classified into package 3
although it is in package 2

methoddetect as smell

図1

エンコーダーと分類器を用いた検出の全体像

types(·) 関数を用いて w の型を表す集合を得る．つることはない．

まり，w がクラス名・インターフェース名または変数

プロジェクト P における分類器は以下のように作る．

名・引数名を表すトークンである場合，types(·) はそ

分類器の訓練データは D = {(x1 , y1 ), ..., (xN , yN )}の型の名前及び直接的に継承するスーパークラスととして与えられる．i = 1, 2, . . . , N として，xi はメ

実装するインターフェースの名前からなる集合を返

ソッド mi のソースコードであり，yi ∈ {1, . . . , K} はす．該当しない場合は types(w) = ∅ である．また，

mi を内包するパッケージを表すラベルである．パッ

この時すべての型名は上記と同様なサブトークン化がケージ k に属するすべてのサンプルを Dk として，各行われる．例えば，w が ConcreteModel 型のインスパッケージの代表点 ck を以下のように求める．
∑
1ck =fϕ (xj )(1)|Dk |タンスで， ConcreteModel が AbstractModel を継承し Serializable を実装する場合には types(w) ={concrete, abstract, model, serializable} となる．これとサブトークンに現れる単語の埋め込み行列である E subtokens を用いて葉ノードのエンコードを以下のように定義する．

S = split(w) ∪ types(w)∑ subtokens
encode token(w) =Ess∈S

単一の AST context の分散表現 z を求めるための手順は Code2seq と同様である．
z = tanh(Win [encode token(ws );encode path(r1 , . . . , rl );(xj ,yj )∈Dk

ここで fϕ (·) は先に述べたエンコーダーである．つまり，vi = fϕ (xi ) である．また，ϕ はニューラルネッ
トワークの学習可能パラメーターである．
推論時の出力は K 個のパッケージそれぞれに対す
る所属確率である．推論対象のメソッドのソースコー
ドを q として，パッケージ k ∈ K への所属確率は以下の通り求める．

pϕ (y = k | q) = ∑exp (−dist(fϕ (q), ck ))k′ ∈K exp (−dist(fϕ (q), ck ))′(2)

ここで，dist(·) は 2 点間のユークリッド距離を求める関数である．

encode token(wt )])こうして得られた n 個の分散表現 z1 , . . . , zn から

meta-learning meta-learning は単一プロジェクト

メソッド全体の分散表現 v を求める方法はオリジナルの少ないデータからでも性能のよい分類器を作るたの Code2vec と同様である．つまり，soft attention

めの事前学習の方法である．これは PN の一般的なを用いて計算される z1 , . . . , zn の加重和が v である．

事前学習手法である．meta-learning においては，大分類器 分類器は各パッケージの代表点を内部に保持し，入力値がどのパッケージに属するかの判断を行う．これは PN で通常用いられる分類器と同様である．また，分類器はニューラルネットワークではない
ため事前学習において何らかのパラメータを学習す

量に用意した事前学習用のプロジェクトからプロジェ
クトの小さなサブセットを作成し，その少ないデータ
から分類器を作って分類するという訓練を 1 タスク
として繰り返す．つまり，meta-learning とは，少数のデータから性能のよい分類器をつくるためのパラproject
package 1

package 2

package 3

package 4

methodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodmethodtest datac4

encoderc2

c1
training data

図24-shot 3-way の設定による meta-learning

メーター ϕ をエンコーダーに学習させるためのもの

研究にも同様の問題が見られるが，実際に学習データである．

上の誤りの影響は存在しないまたは軽微であり，十分

meta-learning における 1 回のミニバッチ学習のな性能を挙げている [16] [4]．

様子を図 2 に示した．ミニバッチごとに 1 つのプロ
ジェクトを訓練データの中から選ぶ．この際，プロ4 評価

ジェクトはそのパッケージ数に応じて確率的に選択提案手法の評価にあたっては以下の二点を明らかにされる．そして，対象のプロジェクトから，内包するメソッド数に応じて確率的に K パッケージを選び，

K パッケージのそれぞれから無作為に N 個ずつのするために二種類の実験を行った．

• RQ1. 実際にパッケージを誤ったメソッドを検出できるかメソッドを選ぶ．こうして得られた N K 個のメソッ• RQ2. 機械学習モデルの設計は適切であったか

ドは分類器の訓練データとして用いられ，式 (1) に一つは実際の OSS (オープンソースソフトウェア) をよって代表点の計算が行われる．次に，K 個のパッ

用いてパッケージを誤ったメソッドの事例を検出する

ケージから先の訓練データと重複しないようにメソッ

ものであり，もう一つは機械学習モデルの一部を改変

ド q を選択する．式 (2) による推論結果について，した結果と比較することで提案手法の設計について

J(ϕ) = − log pϕ (y = k | q) を最小化するように勾配議論するものである．なお，この実験結果は予備段階

降下が行われる．このようなミニバッチ学習を繰り返の結果であり，実験の内容・考察ともに今後より精緻すことで目的とするエンコーダーが得られる．以上の化していく必要がある点についてここで述べておく．

学習設定を N -shot K-way の meta-learning と呼ぶ．

データセット データセットには Code2vec [4] の評

訓練データに関する議論 事前学習に用いるプロジェ

価に用いられたものと同じデータセット (java-large)

クトに含まれるメソッドとパッケージの対応はすべてを用いる．これは GitHub でスターの多い Java プロ

正しいものであることが期待されるが，実際には少ジェクトを 9000 以上集めたものである．

数の誤りが含まれてしまっている．このことは検出結検証にあたって，使用するデータセットには適切な果に悪影響を与えることが予想される．しかし，セク前処理を行った．まず，今回の検出に不要と思われる

ション 4 で述べる通り，事前学習に用いたデータは自動テストの実装をすべてデータセットから除いた．

GitHub 上でスターの多いプロジェクトであるため，同じく，Java の実装に多く見られるボイラープレー

これらはよく整理されて比較的誤りの少ない状態に保トについても除いた．ここで，ボイラープレートとは，たれていることが期待できる．また，ニューラルネッ

getter，setter，Object#equals，Object#hashcode，

トワークは過学習を起こさない限り，こうした少数のObject#toString などの実装コードを指す．また，

誤りに過敏に反応して性能を落とすことはない．関連

ソースコード中のコメントもエンコードには用いないため前処理の中で除外した．

れる事例を挙げたのみであり，一定量のサンプルをす

モデルの訓練 前処理の段階でモデルの訓練に用いる

べて人の目で判断して precision を計測するような作

単語の辞書を作成した．単語の辞書にはメソッドのテ業はできていない．実際の検出事例には false positive

キスト情報の単語を集めたものと AST 上のノード名と見られるものも多くあり，今後これらに対する考を集めたものの 2 つあり，それぞれセクション 3. 2 で察・改善が必要である．また，検出に用いた閾値も暫導入した E subtokens ，E nodes に対応する．メソッド

定的であるため，プロジェクトごとにどのような閾値のテキスト情報の単語は 1) メソッドに含まれるトーを設定する必要があるのかは今後の研究で明らかにクンのテキスト情報をサブワードに分割したもの 2)する必要がある．

メソッドに含まれる識別子やクラス名の型情報をサブ
ワードに分割したものから構成される．これらの単語

4. 2 モデル設計の評価の出現頻度を数え，頻度の低いものは <UNK> というRQ2 に対する回答として，モデル設計の是非を評

特殊な単語に置き換えた．これは自然言語処理のタス

価する．セクション 3. 2 では単語の分割や型情報をクで用いられる手法で，モデルの過学習を防ぐ効果が活用する機構を通常の Code2vec モデルに追加したある．また，モデルの学習率は 0.001 に設定し，PNが，これが性能にどのような結果を与えるのかを考としての学習設定は 10-shot 20-way とした．

察する．また，メソッドをエンコードする手法として

AST ベースの Code2vec を用いたが，その他の手法，
4. 1 ケーススタディによる評価

つまりグラフベースの GGNN [2] およびトークンベー

RQ1 に対する回答として，実際の OSS プロジェク

スの Bi-directional LSTM + attention [12] との比トにモデルを適用し，パッケージを誤ったメソッドの較を行う．なお，Allamanis らの手法 [2] で用いられ実例を検出できるかをケーススタディによって確かめた GGNN モデルではグラフノードの分散表現を得る

る．実験用のプロジェクトとして，1) GitHub 上でまでしかできないため，ここでは読み出し機構 [15]

スターが多く，2) パッケージ数 15 以上 50 未満であを追加してグラフ全体，つまりメソッド全体の分散表

り，3) java-large に含まれない 1000 個のプロジェク

現を得られるようにしている．

トを収集した．実験には java-large の training デー

評価手法 評価の方法として，複数のモデルに対してタセットで訓練したモデルを用いた．誤りとして検出

5-fold の交差検証を行い，その性能を比較する．まする条件は，推論されたパッケージと現在のパッケー

ず，test データセット内の各プロジェクトのデータをジが異なり，かつ推論先の確率が 0.9 を超える場合とパッケージごとに 8 割の訓練データと 2 割のテストなるように設定した．

データに分割する．この訓練データとテストデータを

リスト 1, 2 の事例はこのケーススタディによって検出したものである．いずれもセクション 2 で述べ入れ替えながら 5 回の性能測定を行い，その平均を検証対象のモデルのスコアとする．

た通り，パッケージを誤っており開発者の生産性に影性能のメトリクスには top-1 accuracy と set-base

響を与えかねないものである．これ以外にも，codeの hierarchical F1 [13] を用いる．評価はテストデー

clone や scattered functionality [10] と思われるいタのメソッドをモデルに入力し，あるべきパッケージ

くつかの事例を検出した．このことは，メソッドの本を推論させることで行う．この時，出力結果の確率が文中にはパッケージの配置を考える上で重要な特徴最大であるパッケージが元のパッケージと完全一致が含まれており，Few-shot 学習によってそれらの知していた割合が top-1 accuracy である．仮に結果が識をプロジェクトを超えて転移できたことを示して誤っていた場合でも，hierarchical F1 を用いることいる．

で，パッケージの木構造の上で遠い誤りと近い誤りを現状の結果は，検出事例から true positive と思わ区別して評価することができる．

表1

異なるエンコーダーによる分類の性能比較出に用いられた事例も存在する [16] [19]．しかし，本

top-1 accuracy

F1-score

研究のように検出アルゴリズムを特定のプロジェク

Code2vec

0.577

0.762

トに特化するように訓練したものはない．本研究で

GGNN

0.558

0.749

用いた Few-shot 学習の手法は，最初は画像処理に始Bi-LSTM

0.580

0.744

まり，近年では自然言語処理での応用も多い [6] [24]

Ours

0.645

0.775

が，ソースコードを処理するタスクに用いた事例は本Model

研究が初めての試みである．
評価結果 評価実験を行った結果を表 1 に示す．セクション 3. 2 で導入した我々のモデルは Code2vec

6 まとめと今後の課題をベースに改善を加えたものであったが，この実験

本研究ではパッケージを誤ったメソッドを一般に検の結果において我々のモデルは Code2vec の結果を出する手法を提案し，手法の有用性を示すいくつか

accuracy と F1 のいずれにおいても上回った．つまの事例を挙げた．しかし，評価の方法・結果は依然予り，サブワード化や型情報の活用がこのタスクにおい備的なものであり，今後改善すべき点も多い．まず，ては性能に寄与することがわかった．また，AST ベー

ケーススタディとして，機械学習モデルの検出結果を

ス以外のエンコーダーとして GGNN と Bi-LSTM の人の目で再判断し，定量的に precision を計測する必モデルとの比較を行ったが，結果として我々の選択し要がある．また，モデル選択の評価についても現状でたモデルがこのタスクにおいては最も高い性能を得は適切なベースラインが設定できていないため，これられることがわかった．

を与える必要がある．

5 関連研究参 考 文 献

コードスメルの検出やリファクタリングの研究に[ 1 ] Abdeen, H., Ducasse, S., and Sahraoui, H.:
Modularization Metrics: Assessing Package Organization in Legacy Large Object-Oriented Software,2011 18th Working Conference on Reverse Engineering, 2011, pp. 394–398.
[ 2 ] Allamanis, M., Brockschmidt, M., and Khademi,
M.: Learning to Represent Programs with Graphs,
International Conference on Learning Representations, 2018.
[ 3 ] Alon, U., Brody, S., Levy, O., and Yahav, E.:
code2seq: Generating Sequences from Structured
Representations of Code, International Conference
on Learning Representations, 2019.
[ 4 ] Alon, U., Zilberstein, M., Levy, O., and Yahav,
E.: Code2vec: Learning Distributed Representations of Code, Proc. ACM Program. Lang., Vol. 3,
No. POPL(2019).
[ 5 ] Aniche, M., Bavota, G., Treude, C., Gerosa,
M. A., and Deursen, A.: Code smells for ModelView-Controller architectures, Empirical Software
Engineering, Vol. 23(2018).
[ 6 ] Bao, Y., Wu, M., Chang, S., and Barzilay,
R.: Few-shot Text Classiﬁcation with Distributional
Signatures, International Conference on Learning
Representations, 2020.
[ 7 ] Beck, F. and Diehl, S.: On the Congruenceof Modularity and Code Coupling, Proceedingsof the 19th ACM SIGSOFT Symposium and the13th European Conference on Foundations of Soft-は本研究と関連する内容が多い．しかし，パッケージを誤ったメソッドの検出というタスクに取り組んだ研究はなく，用いている手法も本研究とは大きく異なる．セクション 2 で述べたように，Feature Envy の検出 [23] [8] [16] は本研究に関連したタスクであるが，メソッド呼び出しやメソッド名を特徴量として検出を行っており，本研究のアプローチとは全く異なる．

Hayashi らの研究 [11] では，MVC アーキテクチャを採用するプロジェクトを対象にモジュールを誤って配置された実装を検出するタスクを扱っていたが，その検出手法は MVC アーキテクチャのみに閉じており，一般的なパッケージの誤りに拡張することは難し
いものであった．また，パッケージをリファクタリン
グするツールとして ARIES [17] が挙げられるが，これは凝集性の低いパッケージを解体して他のパッケー
ジに整理するものであり，誤りを一般に検出する本研究の動機とは異なるものである．
また，近年ではニューラルネットワークのソフト
ウェア工学への応用は盛んであり，コードスメルの検ware Engineering, ESEC/FSE ’11, New York, NY,
USA, Association for Computing Machinery, 2011,
pp. 354–364.
[ 8 ] Fokaefs, M., Tsantalis, N., Stroulia, E., andChatzigeorgiou, A.: JDeodorant: identiﬁcation andapplication of extract class refactorings, 2011 33rd
International Conference on Software Engineering(ICSE), 2011, pp. 1037–1039.
[ 9 ] Fowler, M.: Refactoring: Improving the Designof Existing Code, Addison-Wesley Longman Publishing Co., Inc., USA, 1999.
[10] Garcia, J., Popescu, D., Edwards, G., and Medvidovic, N.: Identifying Architectural Bad Smells,
2009 13th European Conference on Software Maintenance and Reengineering, 2009, pp. 255–258.
[11] Hayashi., S., Minami., F., and Saeki., M.:
Inference-based Detection of Architectural Violations in MVC2, Proceedings of the 12th International Conference on Software Technologies - Volume 1: ICSOFT,, INSTICC, SciTePress, 2017,
pp. 394–401.
[12] Iyer, S., Konstas, I., Cheung, A., and Zettlemoyer, L.: Summarizing Source Code using a Neural Attention Model, Proceedings of the 54th Annual
Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), Berlin, Germany,
Association for Computational Linguistics, August
2016, pp. 2073–2083.
[13] Kosmopoulos, A., Partalas, I., Gaussier, E.,
Paliouras, G., and Androutsopoulos, I.: Evaluation
Measures for Hierarchical Classiﬁcation: A Uniﬁed
View and Novel Approaches, Data Min. Knowl.
Discov., Vol. 29, No. 3(2015), pp. 820–865.
[14] Kuhn, A., Ducasse, S., and GÃ®rba, T.: Semantic clustering: Identifying topics in source code,
Information and Software Technology, Vol. 49,
No. 3(2007), pp. 230–243. 12th Working Conference
on Reverse Engineering.
[15] Li, Y., Tarlow, D., Brockschmidt, M., andZemel, R. S.: Gated Graph Sequence Neural Networks, 4th International Conference on Learning
Representations, ICLR 2016, San Juan, Puerto
Rico, May 2-4, 2016, Conference Track Proceedings, Bengio, Y. and LeCun, Y.(eds.), 2016.
[16] Liu, H., Xu, Z., and Zou, Y.: Deep Learn-ing Based Feature Envy Detection, 2018 33rd
IEEE/ACM International Conference on Automated Software Engineering (ASE), 2018, pp. 385–
396.
[17] Palomba, F., Tufano, M., Bavota, G., Oliveto,R., Marcus, A., Poshyvanyk, D., and De Lucia,
A.: Extract Package Refactoring in ARIES, 2015
IEEE/ACM 37th IEEE International Conference
on Software Engineering, Vol. 2, 2015, pp. 669–
672.
[18] Parnas, D. L.: On the Criteria to Be Used in Decomposing Systems into Modules, Commun. ACM,
Vol. 15, No. 12(1972), pp. 1053–1058.
[19] Pigazzini, I.: Automatic Detection of Architectural Bad Smells through Semantic Representationof Code, Proceedings of the 13th European Conference on Software Architecture - Volume 2, ECSA
’19, New York, NY, USA, Association for Computing Machinery, 2019, pp. 59–62.
[20] Snell, J., Swersky, K., and Zemel, R.: Prototypical Networks for Few-shot Learning, Advances in
Neural Information Processing Systems, Guyon, I.,
Luxburg, U. V., Bengio, S., Wallach, H., Fergus, R.,
Vishwanathan, S., and Garnett, R.(eds.), Vol. 30,
Curran Associates, Inc., 2017, pp. 4077–4087.
[21] Stevens, W. P., Myers, G. J., and Constantine,
L. L.: Structured Design, IBM Syst. J., Vol. 13,
No. 2(1974), pp. 115–139.
[22] Taylor, R. N., Medvidovic, N., and Dashofy,
E. M.: Software Architecture: Foundations, Theory, and Practice, Wiley Publishing, 2009.
[23] Terra, R., Valente, M. T., Miranda, S., andSales, V.: JMove: A novel heuristic and tool
to detect move method refactoring opportunities,
Journal of Systems and Software, Vol. 138(2018),
pp. 19–36.
[24] Yu, M., Guo, X., Yi, J., Chang, S., Potdar,
S., Cheng, Y., Tesauro, G., Wang, H., and Zhou,
B.: Diverse Few-Shot Text Classiﬁcation with Multiple Metrics, Proceedings of the 2018 Conferenceof the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers), New
Orleans, Louisiana, Association for Computational
Linguistics, June 2018, pp. 1206–1215.