ソフトウェア理解支援を目的とした 辞書の作成法 大阪大学 大学院情報科学研究科 ○早瀬 康裕, 市井 誠, 井上 克郎
背景 ソフトウェア保守のコストは膨大 保守の過程でドキュメントがしばしば更新されない → 保守作業への新規参加者に負担がかかる ソフトウェア理解とテストの占める割合が大きい 保守の過程でドキュメントがしばしば更新されない ソースコードを読んで理解しなければならない → 保守作業への新規参加者に負担がかかる
理解の手がかり: 識別子 保守作業者はどうやってソースコードを理解しているのか? 識別子は非常に重要な手がかりの1つ ドメインの知識とプログラム要素との対応付けに識別子の名前を用いる[3,4] 識別子に適切な名前が付けられていない場合には,ソースコードを理解するためにより長い時間が必要となる[5] 新規参加者に識別子に使われている単語の意味を教えれば,生産性を改善できるのでは? しかし,一般の辞書に載っているような意味を教えても意味がない
開発者向けの辞書 ドメイン固有の単語について書かれた辞書を作成する どんな辞書? ソースコードから自動的に 単語間の関係を記録した辞書 (シソーラス) 上位下位関係 修飾関係 馴染みのない アプリケーションの ソースコード is-a 関係 List Component JList JComponent Collection LinkedList … collection component 共通する j linked 特化する list 名詞の上位下位関係 修飾語の目録
辞書の生成方法 ソースコード集合からis-a関係を取得 複合語を分割し,小文字に統一 is-a関係から,単語間の関係を取得 クラスの継承 (SubClass is a SuperClass) 変数とその型 (varName is a ClassName) (未実装) 複合語を分割し,小文字に統一 is-a関係から,単語間の関係を取得 修飾関係 一方の単語列がもう一方の末尾に現れる場合 例: [foo, bar, baz] is a [bar, baz] → [foo] を, [bar, baz] を修飾する語として抽出 名詞の上位下位関係 先頭に共通する単語列があるが,末尾の単語列は共通する場合 例: [j, list] is a [j, component] → list が component の下位語であるという情報を抽出 共通する単語が無い場合 複合語の上位下位関係をそのまま登録
適用事例 入力: Java で書かれたオープンソースソフトウェア集合 + JDK (85000ファイル) 結果 語数 関係の数 1単語 2単語以上 名詞 2777 66701 101867 修飾語 2062 3845 13699
名詞の関係の例 1単語の名詞間の関係で,出現回数の上位からいくつか抜粋 上位語 下位語 出現回数 listener handler 202 adapter 116 collection list 29 case all 26 set 16 component delegate 11 thread worker 7 WordNet にも 存在
修飾語の関係の例 1単語の修飾語で,出現回数が100以上 修飾語 関係の出現回数 i 1559 abstract 528 default 280 base 192 basic 179 test 153 my 142 string 108 simple 107 multi 105 file 101
まとめ ソースコード中で用いられる単語のシソーラスを生成手法を提案 今後の課題 生成された辞書の評価 どうやって? ドキュメントコメントを利用して,単語の説明を生成 大規模な対象への適用