Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法 井上研究室 宮崎 宏海 井上研究室の宮崎です. (Javaクラスの利用関係に着目し,ソフトウェア部品のカテゴリ階層を自動で 構築する手法を考案しましたので,発表させていただきます.) #メモ タイトルは進行が喋ってくれるので,名前を名乗るだけでいい?
背景 ソフトウェアに対する品質要求の高まり ソフトウェアの大規模化・複雑化 ソフトウェア部品の量は膨大 様々なソフトウェア部品検索システム →ソフトウェア部品の再利用の重要性 高品質なソフトウェアの開発 開発に掛かるコストの削減 ソフトウェア部品の量は膨大 まず,背景ですが, 現在,ソフトウェアに対する品質要求の高まりやソフトウェアの大規模化・複雑化に よって高品質なソフトウェアの開発や開発のコストを削減を目的として ソフトウェア部品の再利用が行われています. しかし,ソフトウェア部品の数は多く,目的の部品を見つけるための検索システムが 必要となります. ソフトウェア部品の再利用を効率的に行うために,様々なソフトウェア 部品検索システムが提案・実現されています. 様々なソフトウェア部品検索システム
ソフトウェア部品検索システム キーワード検索システム カテゴリ検索システム 入力したキーワードに適合する部品を出力する 利点:Web検索で馴染みがあり,自由度の高い検索ができる 既存のソフトウェア部品検索システム 例:SPARS-J,Google Code Search カテゴリ検索システム あらかじめ用意された階層状のカテゴリから目的の部品を探す 利点:適当なキーワードが思いつかない場合でも,漠然とした目的から検索ができる ソースコードの特徴語を用いたJavaソフトウェア部品の分類システム[19] ソフトウェア部品検索システムの検索方式について考えた場合,その検索方式には キーワード検索とカテゴリ検索の2つがあります. キーワード検索は,検索者が入力したキーワードに適合する部品を出力する検索 システムです.キーワード検索システムの利点は,Web検索で馴染みがあり, また入力するキーワードを検索者が決めるため自由度の高い検索が 可能であることです. このキーワード検索は既存のソフトウェア部品検索システムであるSPARS-Jや Google Code Searchに採用されています. また,カテゴリ検索とはシステム側にあらかじめ用意されている階層状のカテゴリから 目的の部品を探すシステムです.カテゴリには名前であるカテゴリ名があり, 内部にそのカテゴリ名に関連する部品を含んでいます. (カテゴリは階層状になっていることが多く,目的の部品を段階的に 絞り込むことが出来ます.)カテゴリ検索の利点は,検索者が目標に適合する キーワードを思いつかない場合でも,漠然とした目的から検索を行うことが できる点です. カテゴリ検索を採用した既存のソフトウェア部品検索システムとしては,仁井谷の ソースコードの特徴語を用いたJavaソフトウェア部品の分類システムがあります. このシステムについては次のスライドで触れます. 本手法ではこちらのカテゴリ検索に注目しています. [19]:仁井谷,松下,井上, “ソースコードの特徴語を用いたJavaソフトウェア部品の 自動分類手法の提案 ” 情報処理学会研究報告, Vol.2005, No.75, 2005-SE-149, pp.49-56, 2005
既存のカテゴリ検索システム構築手法 ソフトウェア部品のカテゴリ検索の問題点 →カテゴリを自動で作成する手法が必要 既存の手法 カテゴリは人手による維持が困難 部品をどのカテゴリに入れるかの判断には部品の知識が必要 部品の量が膨大 →カテゴリを自動で作成する手法が必要 既存の手法 Javaのソースコードから特徴語を抽出,カテゴリ名とする 特徴語:クラス名など 先ほど紹介した既存のカテゴリ検索システムについて説明しますが, この検索システムについて説明する前に,ソフトウェア部品のカテゴリ検索を 実現する際に生じる問題点について説明します.問題点としては,カテゴリに どの部品を入れるかの判断には部品に対する知識が必要となり,また対象とする 部品の量も多いため,人手ではシステムの維持が困難であることが挙げられます. そのため,ソフトウェア部品検索でカテゴリ検索を実現するためには自動化が 不可欠となります. 既存の手法では,Javaのソースコードから特徴語を抽出し,その特徴語を カテゴリ名としています.また,カテゴリの階層構造をカテゴリに属する部品集合の 包含関係をとることで構築しています. これらの手法を用いることで,カテゴリとその階層構造を自動で構築して問題点を 解決しています.
カテゴリ名による段階的な絞り込みが出来ない 既存手法の問題点 カテゴリ間の親子関係でカテゴリ名の意味的な繫がりを考慮していない 対象:ロボコードのロボット Mirror … Mirrorはロボットの Approachの一種 Author Approach カテゴリ名に意味的な繫がりがない 次に,既存手法の問題点を挙げます.既存手法の問題点としては,カテゴリ名の 意味的な繋がりを考慮していないことがあります. こちらの図はロボコードのシステムに対して,既存の手法を適用したものですが, カテゴリ「Mirror」の子カテゴリに「Author」と「Approach」があります. 「Mirror」と「Author」には意味的なつながりはありません.また,「Mirror」と 「Approach」の間にはロボットの動き方の点で繫がりがあると言えますが, 「Approach」の一種としての「Mirror」であるため,意味的には関係が逆です. このように,既存の手法ではカテゴリ名による段階的な絞り込みが行えない,という 問題点があります. … … カテゴリ名による段階的な絞り込みが出来ない
研究の目的 目的 →シソーラスに着目 カテゴリ名による段階的な絞り込みに適したカテゴリ階層の自動構築 単語間の関係を記した辞書 同義(類義)関係 反義関係 上位下位関係 そこで,本研究ではカテゴリ名による段階的な絞り込みに適したカテゴリ階層を自動で 構築します. この階層を自動で構築するためにシソーラスに着目しました.シソーラスとは単語間の 関係を記した辞書です.記述してある関係には同義関係や反義関係,上位下位関係が あります. 本手法では,これらの関係の中でも概念の包含関係を表した上位下位関係に 注目し,上位下位関係をシソーラスを用いることでカテゴリ名の意味的な 関係に基づくカテゴリ階層を構築します. 上位下位関係のシソーラスを用いることでカテゴリ名の 意味的な関係にもとづいたカテゴリ階層を構築する
ソフトウェア部品に適したシソーラスを作成 既存のシソーラス 自然言語に基づく単語間の関係を表している ソフトウェア部品には自然言語とは用途が異なる単語や複合語が多い →既存のシソーラスをソフトウェア部品のカテゴリ階層に用いるのは適当ではない しかし,既存のシソーラスを適用することはできません.その理由は,既存の シソーラスは自然言語の意味に基づいて作成されているためです. 一方,ソフトウェア部品には自然言語とは用途が異なる単語や複合語が 多く含まれています. そのため,既存のシソーラスはソフトウェア部品のカテゴリ階層の構築には 適当とは言えません. そのため,新たにソフトウェア部品に適したシソーラスを作成する必要が あります. #質問へのメモ たとえば,CollectionとSetという2つの単語は自然言語では共に集合の意味があり 類似した単語であるといえますが,プログラミング言語のJavaではCollectionは オブジェクトの集合のためのインターフェースであり,Setは重複を許さない オブジェクトの集合のためのインターフェースであるため,類似ではなく 上位下位の関係が成り立っているといえます. 既存のシソーラスをソフトウェア部品のカテゴリ階層の構築に適用することが 出来ないため新たにシソーラスを作成します. ソフトウェア部品に適したシソーラスを作成
提案手法の概要 Javaクラスの利用関係を用いてシソーラスを作成 Javaクラスの集合からJavaクラスのクラスタと特徴語の集合を作成 ソフトウェア部品のカテゴリ階層を構築 A 1 2 3 4 1.シソーラス 作成 1 2 3.シソーラスと クラスタから カテゴリ階層を構築 シソーラス 目的を達成するために,Javaクラスの利用関係からカテゴリ階層を構築する手法を 提案します. まず,ソフトウェア部品であるJavaクラスの利用関係からシソーラスを作成します. 次に,Javaクラスのクラスタリングと作成したクラスタの特徴語を決定します. 最後に,作成したシソーラスとクラスタを用いてカテゴリ階層を構築します. B C 3 4 特徴語1, 特徴語2,... 1 4 2 3 1 4 2.部品の クラスタ作成 (既存の手法を 利用) 部品 (Javaクラス) 2 3 特徴語3, 特徴語4,... カテゴリ階層 クラスタ
1.Javaクラスの利用関係を用いてシソーラスの作成 上位下位関係が期待できる利用関係を選択 利用関係ごとに設定した閾値以上の出現回数のもののみ取得 以下の関係にある識別子の組を取得 上位 下位 継承関係 親クラス名 子クラス名 親インタフェース名 子インタフェース名 実装関係 インタフェース名 実装するクラス名 フィールド変数の型と変数名 型名(クラス名) 変数名 最初に行う,シソーラスの作成部分の説明を行います. シソーラスの作成はJavaクラスの利用関係とその識別子を用いることで 作成します.この時,用いる利用関係は上位下位の関係が期待できるものを 選びます.そして,利用関係ごとに設定した閾値以上の出現回数のもののみ 取得します. 利用関係には,この表にあるように継承関係・実装関係・フィールド変数の型と 変数名の3つを用います.継承関係では継承されるクラスのクラス名を上位,継承 するクラス名を下位として取得します.たとえば,FileReaderが InputStreamReaderを継承する場合はInputStreamReaderを上位,FileReaderを下位と します. 同様に,実装関係では実装するクラスを下位,実装されるクラスを上位として 取得し,フィールド変数の型と変数名では型を指すクラスを上位,変数名を 下位として取得します. 例: java.util.List が java.util.Collection を継承しているので Collectionを上位,Listを下位とする
1.Javaクラスの利用関係を用いたシソーラスの作成 取得した識別子と上位下位関係の有向グラフ 頂点:識別子 有向辺:上位の識別子から下位の識別子に引いた辺 A B C そして,取得した識別子と上位下位関係からシソーラスを表す有向グラフを 作成します.この有向グラフの頂点は識別子で,上位の識別子から下位の 識別子に有向辺を引いています. たとえば,この例では上位が識別子Aで下位が識別子Cであるため,頂点Aから 頂点Cに有向辺を引いています.このようにして有向グラフを作成します. D E F G
2.Javaクラスのクラスタと特徴語の作成 部品集合から部品のクラスタと特徴語の集合を作成 研究室で開発されたツールを用いた 出現する単語に基づく部品のクラスタを作成 クラスタに定数個の特徴語を付ける 特徴語1,特徴語2 特徴語3 ,.... 1 2 1 2 次に,Javaクラスの集合から部品のクラスタと特徴語を作成する手法について説明します. クラスタと特徴語の作成には研究室で開発されたツールを用いました.このツールでは 出現する単語に基づく部品のクラスタをします.部品の集合の中で類似した部品を排他的に クラスタリングし,作成したクラスタに定数個の特徴語を付けています. #メモ 出現する単語に基づく → 出現する単語の類似度によって? 3 4 3 4 特徴語4,特徴語5 特徴語6,..... 部品(Javaクラス) クラスタ結果
3.カテゴリ階層の構築(1) クラスタリング結果を用いてカテゴリを作成する クラスタの特徴語がシソーラス内にあればカテゴリを作成 作成したカテゴリにクラスタに含まれる部品を割り当てる 下位に2個以上カテゴリ名に対応する頂点を持つ頂点のカテゴリを作成 A B 特徴語 単語 1 2 1 2 A B 部品 A B クラスタ 1 2 3 4 最後に,作成したシソーラスと部品のクラスタおよび特徴語からカテゴリ階層を 構築する手法について説明します. まず,クラスタリング結果を用いてカテゴリを作成します.クラスタの特徴語が シソーラス内にあれば,そのカテゴリを作成します.そして作成したカテゴリに クラスタに含まれる部品を割り当てます. A E C D 3 4 D E F E F 3 4 5 6 5 6 E F G 5 6 クラスタリング結果 シソーラス
3.カテゴリ階層の構築(2) シソーラスからカテゴリの親子関係を作成 カテゴリ名に対応する2つの頂点の間に,他のカテゴリに対応する頂点を経由しない経路がある場合 A B 1 2 1 2 特徴語 A B 単語 部品 クラスタ 3 4 1 2 A B A E 次に,シソーラスから必要な情報を抽出してカテゴリ間の親子関係を構築します. シソーラスにカテゴリ間の上位下位関係があれば,カテゴリ間に親子関係を 構築します.また,下位に2つ以上のカテゴリを持つ頂点があれば部品が 割り当てられていないカテゴリとして,その頂点のカテゴリを作成します. そして,カテゴリを作る頂点間の経路にカテゴリを作る頂点がなければ,2つの カテゴリ間に親子関係を構築します. 以上の処理によりカテゴリ階層を構築します. D C 3 4 E F D E F 5 6 3 4 5 6 E F G クラスタリング結果 5 6 シソーラス
適用実験 実験の目的 実験内容 カテゴリ名による段階的な絞り込みを行うためのカテゴリが作成できているかを調べる 入力:JDK1.4の全クラス(約11000クラス) シソーラスへの登録の閾値 継承関係,実装関係:1回 フィールド変数の型と変数名:10回 出力結果 総カテゴリ数 1109個 カテゴリ間の親子関係 2501組 カテゴリに割り当てられた部品数 6000個 カテゴリに割り当てられた延べ部品数 18583個 カテゴリに含まれる部品(平均) 16.75個 提案した手法を実装し,実際に部品集合に対して適用実験を行いました. この実験は,カテゴリ名による段階的な絞り込みを行うためのカテゴリが作成できて いるかを調べることを目的としています. 入力はJDK1.4の全クラスとしました.シソーラスに上位下位関係として登録するか どうかの閾値は継承関係と実装関係がそれぞれ1回,フィールド変数と変数名は10回としました. 出力結果としては,カテゴリ数が1109個,親子関係が2501組得られました.他に 得られた情報は表の通りになっています.
評価方法 評価項目 カテゴリ間の親子関係が適切か カテゴリに含まれている部品が適切か こちらの実験のみ説明する 評価方法としては,カテゴリ間の親子関係の適合率と カテゴリとカテゴリに含まれる部品との適合率の2つを行いましたが この発表ではカテゴリ間の親子関係についてのみ説明します.
カテゴリ間の親子関係の評価 評価 結果 出力した親子関係2501組からランダムに200組を選出 親子関係の適合率を求める 適合条件:子カテゴリが親カテゴリの一種 結果 64.0%(128組 / 200組) 親カテゴリ 子カテゴリ 適合例 JComponent JLabel 不適合例 ClassFile ClassReader 評価は,出力した親子関係2501組の内,ランダムに200組を選出して行いました. そしてその200組に対して親子関係の適合率を求めましたが,その適合条件は 「子カテゴリ名が表すものが親カテゴリ名の一種である」こととしました. 適合例としては親カテゴリ名が「JComponent」で子カテゴリ名が「JLabel」の ものがあります.子カテゴリである「JLabel」はテキスト文字列や(イメージの) 表示領域のことであり,GUI部品を表す「JComponent」の一種であるといえます. 一方,不適合例としては親カテゴリが「ClassFile」で子カテゴリ名が「ClassReader」の ものがあります.子カテゴリである「ClassReader」はクラスファイルを読み込むもので あり,「ClassFile」の一種であるとは言えません. このように親子関係の適合・不適合を判断した結果,101組の適合が得られました.
考察 意味的な絞り込みを行えるカテゴリ階層が出来た 継承関係として機能を利用するためのものがみられた →より柔軟な閾値の設定方法による親子関係の適合率の向上 結果の考察です. 手法を用いることで意味的な絞り込みを行えるカテゴリを構築することが できました. また,適合率を上げる余地があります.継承関係には機能を利用する ために行われているものがあり,その場合は子クラスが親クラスの一種には なりませんでした.この問題はprivateクラスの継承関係は取得する際の閾値を 大きくすることで解決できるのでは,と考えられます.
まとめと今後の課題 まとめ 今後の課題 Javaの利用関係を用いたシソーラスの作成 シソーラスを用いたカテゴリ階層の構築 実際のソースコードを用いた実験 今後の課題 カテゴリ間の親子関係の精度向上 親子関係以外の関係をカテゴリ階層に追加 カテゴリ検索のユーザーインターフェースの開発 本研究では,Javaの利用関係を用いたシソーラスを作成し,そのシソーラスを 用いたカテゴリ階層の構築を行いました.そして実際のソースコードを 用いた実験を行いました. 今後の課題としましては,カテゴリ間の親子関係の精度向上があります.また,他にも カテゴリ階層に親子関係以外のカテゴリ間の関係を加えることでカテゴリ検索と しての有用性を向上させたり,カテゴリ検索のインターフェースの開発などが 挙げられます.