ソースコードの特徴語を用いた
Javaソフトウェア部品の
自動分類手法の提案
大阪大学 井上研究室
仁井谷 竜介
背景
 ソフトウェア部品検索システムの必要性


ソフトウェア開発の大規模化・複雑化
ソフトウェアを再利用したり,管理する機会の増加
様々なソフトウェア部品検索システム
2005/07/29
SPARS-J
MUDABlue
gonzui
Koders
Jarhoo
など
Prospector
JcomponentSearch
SIGSE-149-7
2
検索システム
 クエリ検索システム


クエリ(検索語・検索文)を入力として与える
適切なクエリを与えれば意図通りの文書が得られる
 カテゴリ検索システム

あらかじめ用意されたカテゴリから文書を探す



カテゴリはツリー状に構成されていることが多い
クエリを入力しなくてよい
段階的に絞り込むことができる

コンピュータ → ソフトウェア → 表計算
本研究ではこちらに着目
2005/07/29
SIGSE-149-7
3
カテゴリ検索システム構築時の問題
 部品をカテゴリに分類する必要がある


追加・更新する部品をどのカテゴリに入れるか判
断しなければいけない
対象数が多い
 カテゴリを再構成・維持する必要がある
 分類・カテゴリ維持は手作業では困難
 自動化が不可欠
2005/07/29
SIGSE-149-7
4
研究の目的
 ソフトウェア部品を対象としたカテゴリ検索用の
自動分類
 カテゴリのツリー(カテゴリ間の関係)の自動生成


Javaのクラスをソフトウェア部品とみなす
入力としてソースコードを用いる
 低コストで分類ができる
2005/07/29
SIGSE-149-7
5
提案手法
 ソースコードの特徴語に着目した分類


ソースコードを入力として部品をカテゴリに分類
カテゴリ間に関係を生成
特徴語の決定
カテゴリの生成
カテゴリ間の関係の生成
input
input
read
file
read
input
file
write
file
write
部品(=Javaクラス)
のソースコード
2005/07/29
file
read
write
SIGSE-149-7
6
特徴語
 自然言語で書かれた文書を対象とした分類,検
索,データマイニング関連で使われる言葉
 文書を特徴づける重要な語
特徴語
 求める手法は様々
に 的 い ネ 出 せ し 高*


テキストマイニングツール
では独自の手法が多い
*http://www.google.co.jp/intl/ja/why_use.html
2005/07/29
SIGSE-149-7
Web

統計的な特徴を利用
辞書を利用
確立された手法はない
もに てッ し に た度
ト 対
あ順 、
関の ま し な
り位 連 す
次
ま付 あリ 。 的 世
そ確
すけ ン
ク の な は代
る
。る 構
、テ
方 造 秘 検 すク
式 そ 密 索 べノ
を サの は 結 てロ
、 果 のジ
用イ
も
ト イ
い をの ン を 問ー
て に タ 迅 いを
る 自基 ー 速 合利
点 動づ に わ用
Google

Google
Web
順位
PageRank
リンク
7
ソースコードの特徴語
 文書の特徴語
 文書を特徴づける重要な語
 文書中に出現したかどうかは問わない
ソースコードに適用して定義
 ソースコードの特徴語
 ソースコードを特徴づける重要な語
 ソースコード中に出現したかどうかは問わない
出現した語だけに縛られない
2005/07/29
SIGSE-149-7
8
文書にない特徴の利用
 対象言語(Java)の構文を利用


クラス名と変数名で語の重みを変える
出現した場所によって特徴を表す度合いは違う
 利用関係の利用



2005/07/29
継承やインスタンス化といったクラス間の関係をリ
ンクとする
リンク先のクラスに含まれる語も関連ある語だと
みなす
関係のある部品の特徴もその部品の特徴
SIGSE-149-7
9
特徴語の決定
 部品のソースコードをもとに特徴語を決定
特徴語の決定
カテゴリの生成
カテゴリ間の関係を生成
input
input
read
file
read
input
file
write
file
write
部品(=Javaクラス)
のソースコード
2005/07/29
file
read
write
SIGSE-149-7
10
特徴語決定の手順
(2)
(1)
単語の出現情報
解析
(2.1)
出現重み
計算
(2.2)
重み
(2.3)
利用関係
計算
重み
LSA
計算
単語
重み
(3)
単語一覧(特徴語の候補)
特徴語
決定
1. ソースコードを解析
2. 単語重み計算
1. 出現重み計算
2. 利用関係による重み加算
3. LSA(潜在的意味解析法)
3. 単語重みの高い語を特徴語とする
部品と特徴語の組
input
read
file
write
file
2005/07/29
SIGSE-149-7
11
(1)特徴語の候補となる単語の抽出
 全ソースコード中に出現する単語の一覧を取得

SPARS-Jに依存
 語の記法統一を行う
大文字、小文字、’_’の有無などの違いを統一
 例: XMLParser, XML_Parser, xmlParser
→ XmlParser

 複合語分割を行う


2005/07/29
複数で構成される語を一部または全部に分割
例: XmlParser→ Xml, Parser, XmlParser
SIGSE-149-7
12
(2.1)ソースコードの出現場所によ
る重み計算
 各部品中の各語に対し、出現した場所を考慮し
た重み(特徴を表す度合い)を求める
クラス定義
変数名
ドキュメントコメント
コメント
・・・
の和を求める
2005/07/29
100×log(1+出現回数)
10×log(1+出現回数)
15×log(1+出現回数)
2×log(1+出現回数)
SIGSE-149-7
13
(2.2)利用関係による重み加算
 部品間の重み加算
 利用している部品中の語の重みを加算する
 関係ある部品の特徴はその部品の特徴
 利用関係に応じて加算時の割合を変える
継承
メソッド呼び出し
インスタンス化
など
×0.5
×0.01
×0.05
継承関係での例
\語
file
親クラス
5
子クラス
1
2005/07/29
read
3
0
binary
0
2
\語
file
親クラス
5
子クラス 3.5
SIGSE-149-7
read
3
1.5
binary
0
2
14
(2.3)LSA*(潜在的意味解析法)
 全体に対する補正
 重みが類似するものに近い重み与える

統計的に見て特徴を表していそうな語に重み
を与える(表していないものは減らす)
\語 input read file write print
A
10 12
8
0
0
B
8
0
9
0
0
C
0
1
0
8
40
D
0
0
2
30
20
\語 input read file write print
A
11
8
9
0
0
B
6
5
6
0
0
C
0
1
0
8
39
D
0
0
2
29
20
* Landauer, T. K., Foltz, P. W., & Laham, D. (1998). Introduction to Latent Semantic Analysis.
Discourse Processes, 25, 259-284.
2005/07/29
SIGSE-149-7
15
(3)特徴語の決定
 各部品に対し、単語重みの高い上位10語を特徴
語と決める
input
output
read
write
get
set
file
…
2005/07/29
62.1
0
90.7
0
35.6
18.1
113.9
…
input
read
file
…
SIGSE-149-7
特徴語
16
特徴語の決定の例
 1つの部品に注目した特徴語決定の流れ
全ソースコードから得られた単語(特徴語の候補)
単語の出現情報
input
output
read
write
get
なし
なし
メソッド定義3
メソッド呼出2
なし
メソッド定義7
メソッド呼出8
set
メソッド定義2
メソッド呼出10
file ・・・
クラス定義 1
メソッド定義 2
…
対象部品ソースコード中に出現する単語の出現箇所と出現回数
部品と関連が強いと
ソースコードに出現しない語も特徴語になり得る
単語重み
特徴語
2005/07/29
62.1
○
0
90.7
○
SIGSE-149-7
0
35.6
18.1
113.9
○
17
カテゴリの生成
1. 各部品から得られた特徴語をもとにカテゴリを作る
2. 各カテゴリに、それを特徴語とする部品を分類
特徴語の決定
カテゴリの生成
カテゴリ間の関係の生成
input
input
read
file
read
input
file
write
file
write
部品(=Javaクラス)
のソースコード
2005/07/29
file
read
write
SIGSE-149-7
18
カテゴリ間の関係の生成
 カテゴリ間にある関係を分析してグラフとする
特徴語の決定
カテゴリの生成
カテゴリ間の関係の生成
input
input
read
file
read
input
file
write
file
write
部品(=Javaクラス)
のソースコード
2005/07/29
file
read
write
SIGSE-149-7
19
カテゴリ間の関係の生成手順
親子関係
生成
集合類似関係
生成
類似関係
生成
1. カテゴリを入力とする
2. 全てのカテゴリの組に対し3つの関係が成り立っているか調べる
3. 成り立っていればその関係をグラフの辺として出力とする
複数成り立っている場合は優先順位に従って1つだけ決まる
2005/07/29
SIGSE-149-7
20
親子関係
 カテゴリを部品の集合としてみたときの包含関係が
あるものの間に作られる関係
 Aの要素の8割⊂B → Aが子 Bが親
部品の集合
部品の集合
カテゴリ
2005/07/29
SIGSE-149-7
21
集合類似関係
 カテゴリを部品の集合としてみたとき類似するも
のの間に作られる関係
 A∩Bが両方の8割を超えていたら類似
A
2005/07/29
B
A
SIGSE-149-7
B
22
類似関係
 カテゴリに対応する特徴語間の類似度(コサイン
尺度)が一定値以上のカテゴリ間に作られる関
係
\語 input read
A
11
8
B
6
5
C
0
1
D
0
0
input
read
θ
cosθ = 類似度
2005/07/29
SIGSE-149-7
23
カテゴリ間の関係の例
親子関係
集合類似関係
類似関係
Io
Output
Input
Io
File
Write
Read
File
Input
Output
Print
Println
Read
Write
Print
Println
カテゴリを作るまでに
用いた情報
2005/07/29
SIGSE-149-7
24
実装
カテゴリ間の関係
生成部
カテゴリ間の関係
入力
SPARS-J
特徴語
決定部
カテゴリ
カテゴリ
検索結果
検索
検索者
読込
2005/07/29
検索部
DB
登録
SPARS
DB
読込
単語重み
計算部
分類部
SIGSE-149-7
25
評価
 実際に分類を行い,検索結果を評価する
 入力はロボットシステム部品254クラス(35システム)
 評価には適合率を用いた
適合率 =

|検索結果 ∩ 適合|
|検索結果|
適合の判断はソースコードを見て行った
 評価したもの
 カテゴリ適合率
 部品適合率
 特徴語の検証
2005/07/29
SIGSE-149-7
26
カテゴリ適合率の結果の例
 部品riu.parts.EnemyStatusが属するカテゴリ適合率
 適合率 0.7
カテゴリ
2005/07/29
適合
理由
Point
○
座標を扱う
EnemyStatus
○
敵の状態を表す
Get
○
状態取得メソッドが多い
Time
○
時間を扱う
Riu
○
パッケージ名
Set
×
状態設定は行わない
Distance
○
距離を扱う
This
×
Java予約語
Param
×
Javadocタグ(@param)
Move
○
移動に関わる情報を持つ
SIGSE-149-7
27
カテゴリ適合率の結果
 縦軸が各部品に対するカテゴリ適合率
 横軸は部品(適合率でソートしている)
 avg. 0.86
例:適合率 2/3 の部品
部品
適合するカテゴリ
高い適合率が得られた
適合しないカテゴリ
2005/07/29
SIGSE-149-7
28
部品適合率の結果の例
 カテゴリPointに属する部品適合率(実際は108クラス)
 適合率 0.93
部品
理由
teamZero.Point
○
座標を扱う
mirror.Calc
○
座標計算クラス
mirror.posPredict.WaveEstimati
on
○
位置予測
kuro.Point
○
座標を扱う
riu.parts.EnemyStatus
○
座標を扱う
riu.Geometry.Geometry
○
座標計算クラス
mt.GravPoint
○
座標を扱う
heg.Vector2D
○
座標クラス
pbl3.BulletData
○
座標を扱う
riu.NotSerializable
×
空のクラス
...
2005/07/29
適合
SIGSE-149-7
29
部品適合率の結果
 縦軸が各カテゴリに対する部品適合率
 横軸はカテゴリ(適合率でソートしている)
 avg. 0.85
例:適合率 4/7 のカテゴリ
カテゴリ
適合する部品
適合率0のカテゴリも存在した
高い適合率が得られた
適合しない部品
2005/07/29
SIGSE-149-7
30
特徴語の検証
 ソースコード中に出現する特徴語が多い
 不適当な特徴語が存在




2005/07/29
Javadocタグ(@param, @returnなど)
HTMLタグ(br, li)
前置詞,助詞,代名詞(to, in, this)
Javaの予約語(this)
SIGSE-149-7
31
考察
 有効な分類が得られた
 不適当な語の排除が必要
 特徴語が部品につき10個固定では、複雑な部品
では足らず簡単な部品では多すぎる
2005/07/29
SIGSE-149-7
32
まとめと今後の課題
 まとめ


ソースコードの特徴語に着目した分類手法
提案手法による分類の有効性を確認
 今後の課題



2005/07/29
部品ごとの適切な特徴語の数の調査
特徴語として適さない語の排除方法の考案
カテゴリ間の関係の評価
SIGSE-149-7
33
2005/07/29
SIGSE-149-7
質問をどうぞ
終
34
ダウンロード

ソースコードの特徴語を用いた Javaソフトウェア部品の 自動分類システム