5.2 実験結果と考察
5.2.3 RQ3. 検索にかかる時間はどれくらいか
タスク中において検索クエリを送信してから検索結果を表示するまでに要した時間を表2 にまとめる.これらの時間は,マッチング対象となるソースコードをsearchcode.com から ダウンロードしてくる時間も含まれたものである.この時間は多くの場合で1 ∼ 2 秒であ ることを確認している.タスクの中の検索結果として,合計で2448個のコード例を検索結 果として表示した.ただし,この表は検索結果を少なくとも1つ表示した場合の検索時間の みをまとめたものである.これは,検索クエリの仕様を理解していないことにより,検索結 果が1つも表示されないような検索が見られたからである.たとえば,先に述べたように
“foo bar”のような検索クエリを記述した場合,2つの識別子名が連続して出現するような
コード例のみを検索結果として表示する.しかしながら,このようなコード例は一般的に存 在しないと考えられるため,検索に時間を要する一方で検索結果は表示されない.検索クエ リを正しく理解した上での検索に要する時間を評価することに意味があると考え,このよう な検索の影響は除外した.また,提案手法のウェブアプリケーションの中には検索クエリの 例が記載されており,タスク中にそれらの検索クエリが送信されている場合があるため,送 信されたすべての検索クエリがタスクの内容に直接関係があるとは限らない.
結果として,中央値で4.3秒,平均値で5.0秒の検索時間を要することが分かった.また,
1つのコード例を提示するのに平均値で約0.4 秒の時間を要するという結果となった.この 数値はシンプルなコード検索ツールを除く既存のAPI 理解支援の技術に比べると桁違いに 高速である.検索結果を1秒以内で表示するようなコード検索エンジンに比べると劣るが,
一般的な開発において十分実用的な範囲であると考えている.また,コード例検索において インタラクティブな検索は一般的であることが知られている[5] が,この要望にも答えるこ とができると考えている.一方で,10個のコード例を提示するのに検索時間が25 秒を超え る場合が存在することが分かった.このような検索では,検索クエリ中の$変数や “??” に マッチするものの自由度が非常に高い形で用いられることで,出力候補となるコード例が多 数存在している状態であると考えられる.提案手法のアルゴリズムではコード例の包含関係 による選定をNFA へのマッチング後に行っている.この処理をNFA へのマッチング中に 行うことで,アクティブ状態な状態数が極端に増加することを抑えることができ,より高速 にマッチングを終えることが可能であると考えている.ただし,提案手法は検索対象となる ソースコードを既存のコード検索エンジンから取得しており,そのダウンロードに要する時
間は1 ∼ 2 秒程度であることが分かっている.このような方式をとっている以上,既存の コード検索エンジンのパフォーマンスが提案手法のパフォーマンスの上限となっている.
RQ3の調査結果は以下のようにまとめられる.
• 検索に要する時間は平均的に4 ∼5秒であり,実用的な範囲内に収まっていると考え られる.
• 一方で検索に数十秒を要する場合が存在することが明らかとなったが,マッチングア ルゴリズムの改善によりある程度の短縮が可能であると考えている.
6 まとめと今後の展望
本研究ではAPI 理解を支援するための技術として,変数のデータフローを指定すること によるコード例検索手法を提案した.検索対象となるソースコードは既存のコード検索エン ジンから取得することで,幅広いAPI の検索に対応している.また,有限オートマトンを ベースとした低コストなマッチングアルゴリズムにより高速な検索が可能となり,ウェブア プリケーションとしての実装を実現している.評価実験を行った結果,提案手法がAPI の 理解のために有効な場合があることを確認した.また,独自の検索クエリの記述は比較的容 易であり,検索にかかる時間は実用的な範囲であることを確認した.
今後の課題としては,より高速な検索のためマッチングアルゴリズムを改良することや,
検索クエリの記述方法を分かりやすく伝える方法を検討することが挙げられる.また,実装 したウェブアプリケーションを外部に公開し,実際の開発者からのフィードバックを受け取 ることや,より質の良い実験データを収集することが今後の目標である.
謝辞
大阪大学大学院情報科学研究科コンピュータサイエンス専攻井上克郎教授には,本研究の みならず研究室に配属されてからの3年間,さまざまな場面でお世話になりました.自由な 雰囲気の中で伸び伸びと研究ができたおかげで,楽しく有意義な研究生活を送ることができ ました.井上研究室での経験を生かして,今後も尽力していきたいと思います.今まで本当 にありがとうございました.
大阪大学大学院情報科学研究科コンピュータサイエンス専攻松下誠准教授には,研究室で の発表の機会において多くのご意見をいただき,研究をより洗練することができました.本 研究のみならず,先生の鋭いご指摘はいつも大変勉強になりました.今までありがとうござ いました.心より感謝申し上げます.
大阪大学大学院情報科学研究科コンピュータサイエンス専攻石尾隆助教には,技術的なこ とから論文の書き方まで,本当に細かく熱心な指導していただきました.3年間の指導を通 して,以前には想像もしていなかったほどさまざまな力を付けることができたと思います.
今まで本当にお世話になりました.深く感謝申し上げます.
最後に,その他様々な御指導,御助言等を頂いた大阪大学大学院情報科学研究科コンピュー タサイエンス専攻井上研究室の皆様に心より感謝いたします.
付録
付録として,次のページから評価実験に使用した2つの実験タスクの詳細とその解答コー ド例を示す.実際のタスクには,使用するデータ一覧の中に自明なもの(プログラム中で作 成するファイルやディレクトリなど)が含まれていたため,その表示を省略している.
実験タスク1
このタスクで作成するプログラムには,以下のデータを使用します.
• PDF ドキュメントのURL.今回は,
“http://sel.ist.osaka-u.ac.jp/lab-db/betuzuri/archive/1068/1068.pdf”
を利用してください.
以下の3つの処理を行うJava プログラムを作成してください.ただし,例外の処理につい ては特に指定しません.
1. PDFファイルを指定されたURLからダウンロードし,outputディレクトリ内に保
存してください.保存ファイル名は問いません.
2. PDFファイルからメタデータ1を抽出し,コンソールにPDF が作成された日付 を
表示してください.表示のフォーマットは問いません.
3. PDF ファイルからテキスト内容を抽出し,コンソールに表示してください.表示の
フォーマットは問いません.
使用ライブラリの制約
上記のタスクを行うときは,以下の使用ライブラリの制約を守ってください.
1. PDFファイルをダウンロードするときはApache HttpClientライブラリを使用して ください.また,HttpClient インターフェースは, HTTP リクエスト実現するイン ターフェースです.
2. PDFからメタデータとテキスト内容を抽出するときはApache Tikaライブラリを使
用してください.また,PDFParser クラスはPDFデータをパースするためのクラス です.
使用する API のドキュメントへのリンク集
• Apache HttpClient 4.5.2 API
• Apache Tika 1.14 API
• Java(tm) Platform, Standard Edition 8 API 仕様
1PDFのメタデータにはPDFの作者や保存されているデータ,作成にあたって使用されたツールなどの情 報が含まれています.
実験タスク1 解答コード例 (main部のみ)
1 p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) t h r o w s E x c e p t i o n {
2 S t r i n g o u t p u t F i l e = " o u t p u t / s a v e d . pdf " ;
3 S t r i n g url = " h t t p :// sel . ist . osaka - u . ac . jp / lab - db / "
4 + " b e t u z u r i / a r c h i v e / 1 0 6 8 / 1 0 6 8 . pdf " ;
5
6 H t t p C l i e n t c l i e n t = H t t p C l i e n t s . c r e a t e D e f a u l t ();
7 H t t p U r i R e q u e s t h t t p G e t = new H t t p G e t ( url );
8 H t t p R e s p o n s e r e s p o n s e = c l i e n t . e x e c u t e ( h t t p G e t );
9 H t t p E n t i t y e n t i t y = r e s p o n s e . g e t E n t i t y ();
10 try ( O u t p u t S t r e a m out = new F i l e O u t p u t S t r e a m ( o u t p u t F i l e )) {
11 e n t i t y . w r i t e T o ( out );
12 } c a t c h ( I O E x c e p t i o n e ) { }
13
14 P D F P a r s e r p a r s e r = new P D F P a r s e r ();
15 I n p u t S t r e a m s t r e a m = new F i l e I n p u t S t r e a m ( new F i l e ( o u t p u t F i l e ));
16 B o d y C o n t e n t H a n d l e r h a n d l e r = new B o d y C o n t e n t H a n d l e r ();
17 M e t a d a t a m e t a d a t a = new M e t a d a t a ();
18 P a r s e C o n t e x t c o n t e x t = new P a r s e C o n t e x t ();
19 p a r s e r . p a r s e ( stream , handler , m e t a d a t a , c o n t e x t );
20 S y s t e m . out . p r i n t l n ( m e t a d a t a . get ( T i k a C o r e P r o p e r t i e s . C R E A T E D ));
21 S y s t e m . out . p r i n t l n ( h a n d l e r . t o S t r i n g ( ) ) ;
22 }
実験タスク2
このタスクで作成するプログラムには,以下のデータを使用します.
• Task2_TargetDirectory ディレクトリ(Java プロジェクト中に含まれています).こ のディレクトリには,OpenFright の空港データベースの csv データを含む,さまざ まな拡張子のファイルとサブディレクトリが入っています.
以下の5つの処理を行うJava プログラムを作成してください.ただし,例外の処理につい ては特に指定しません.
1. 出力ディレクトリoutputDirectoryと出力ファイルoutput-file.csvを(プログラ ムにより)作成してください.作成するパスは問いません.
2. Task2_TargetDirectory ディレクトリ以下に含まれるすべてのcsv データを,デー タ構造(たとえばFileオブジェクトのリストなど)として読み込んでください.
3. 読み込んだ csv データのすべての行がちょうど11 個の項目を持つことを確かめてく ださい.以下では,このようなファイルを「正しい」ファイルと呼ぶことにします.た だし,csv データにおいては項目と項目は’,’によって区切られますが,” ”で挟まれ た ’,’は文字列の一部であることに注意してください.
4. すべての「正しい」ファイルを outputDirectory にコピーしてください.
5. すべての「正しい」ファイルの先頭 100行のみを,出力ファイルoutput-file.csv に書き込んでください.
使用するライブラリの制約
上記のタスクを行うときは,以下の使用するライブラリの制約を守ってください.
1. 処理2, 4, 5を実装するときは,Apache Commons IOライブラリを使用してください.
また,FileUtilsクラスはファイル操作のためのユーティリティクラスです.
2. 処理3を実装するときは,Apache Commons Lang ライブラリを使用してください.
また,StrTokenizerクラスは区切り文字に基づいて文字列を分割するためのクラス です.
使用する API のドキュメントのリンク集
• Apache Commons IO 2.5 API
• Apache Commons Lang 3.5 API
• Java(tm) Platform, Standard Edition 8 API 仕様