(57)【要約】【課題】ソースコード及びその付随データ（以下、プロジェクトとする）の入力を検索者より受け付け、類似プロジェクトとして当該検索者にとって参考となるようなものを検索し提示することのできる検索装置を提供する。【解決手段】個別類似度算出部3において、クエリプロジェクトと検索対象プロジェクトとの間で、プロジェクト構成データ種別ごとに類似度を算出し、統合類似度算出部4においてデータ種別ごとの類似度を重みづけ和として統合した統合類似度を算出し、統合類似度に基づいて検索結果となるプロジェクトを決定する。【選択図】図１
2016177359.tif 000002
【特許請求の範囲】
【請求項１】
第一のソースコード及びその付随データ（以下、ソースコード及びその付随データをプロジェクトとする。）の入力を検索者より受けて、当該第一のプロジェクトに類似している第二のプロジェクトを当該検索者に提示する検索装置であって、
検索対象となる複数のプロジェクトを保持するプロジェクトデータ保持部と、
前記入力された第一のプロジェクトと、前記保持されている各プロジェクトと、の類似度を、プロジェクトを構成するデータ種別ごとに個別に算出する個別類似度算出部と、
前記データ種別ごとに個別に算出された類似度を統合して、前記入力された第一のプロジェクトと、前記保持されている各プロジェクトと、の統合類似度を算出する統合類似度算出部と、
前記保持されている各プロジェクトのうち、前記統合類似度が大きいと判定されるものを、検索結果の前記第二のプロジェクトとして検索者に提示する参考プロジェクト提示部と、を備えることを特徴とする検索装置。
【請求項２】
前記参考プロジェクト提示部では、前記保持されている各プロジェクトのうち、前記統合類似度が最大のものを、検索結果の前記第二のプロジェクトとして検索者に提示することを特徴とする請求項１に記載の検索装置。
【請求項３】
前記統合類似度算出部では、データ種別ごとに値が定義された重みを用いて、データ種別ごとに個別に算出された類似度の重みづけ和として統合類似度を算出し、
さらに、
前記提示した第二のプロジェクトが検索者にとって有用であったか否かのフィードバックを抽出するフィードバック抽出部と、
前記提示した第二のプロジェクトにおけるデータ種別ごとの個別の類似度と、前記抽出されたフィードバックとを基に、前記個別類似度において統合類似度を算出する際の重みを修正する類似度統合重み算出部と、を備えることを特徴とする請求項２に記載の検索装置。
【請求項４】
前記フィードバック抽出部が、
検索者が過去に入力した第一のプロジェクトを保持しておく過去入力プロジェクト保持部と、
検索者が現在に入力した第一のプロジェクトと、前記保持されている過去入力された第一のプロジェクトと、を比較し、プロジェクトの品質の変化を評価するプロジェクト品質評価部と、
前記プロジェクト品質評価部による品質評価を元に、前記抽出されるフィードバックを決定するフィードバック決定部と、を備えることを特徴とする請求項３に記載の検索装置。
【請求項５】
前記プロジェクト品質評価部における評価項目ごとの一連の結果に対してルールベースで設定された学習係数を記憶し、前記プロジェクト品質評価部における評価結果に応じた学習係数を当該記憶より読み出す学習係数決定部をさらに備え、
前記類似度統合重み算出部ではさらに、当該読み出された学習係数に基づいて前記重みを修正することを特徴とする請求項４に記載の検索装置。
【請求項６】
前記プロジェクト品質評価部における評価結果に応じて学習係数を決定する学習係数決定部をさらに備え、
前記類似度統合重み算出部ではさらに、当該決定された学習係数に基づいて前記重みを修正することを特徴とする請求項４に記載の検索装置。
【請求項７】
前記検索者が現在に入力した第一のプロジェクトが、前記過去に入力した第一のプロジェクトに対して編集が加えられたものとなるよう、前記過去入力プロジェクト保持部では検索者が過去に入力した第一のプロジェクトをそのIDと共に保持しておき、前記プロジェクト品質評価部では当該IDが共通のプロジェクト同士を比較することを特徴とする請求項４ないし６のいずれかに記載の検索装置。
【請求項８】
前記フィードバック抽出部が、検索者からの入力を受け付けることにより、前記フィードバックを抽出することを特徴とする請求項３に記載の検索装置。
【請求項９】
前記プロジェクトにおける付随データの種別に、解説文、プロジェクト作成者レベル、プロジェクトの被閲覧数、プロジェクトの被参照数、の少なくとも１つが含まれることを特徴とする請求項１ないし８のいずれかに記載の検索装置。
【請求項１０】
コンピュータを請求項１ないし９のいずれかに記載の検索装置として機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード及びその付随データ（以下、プロジェクトとする）の入力を検索者より受け付け、類似プロジェクトとして当該検索者にとって参考となるようなものを検索し提示することのできる検索装置及びプログラムに関する。
【背景技術】
【０００２】
複数のソースコード間の類似度を算出することで、ソースコード自体を入力として重複したコードを発見する従来技術として、以下のようなものが提案されている。
【０００３】
非特許文献1では、ソースコードの一部分を入力として、ソフトウェアリポジトリの変更履歴から類似しているソースコード（ソースコード片）を検索している。また、検索されたソースコード片がどのように変更されたかを提示することで、入力したソースコードの修正を支援する方法を提案している。
【０００４】
特許文献1では、プロダクトを構成するソースコード及び設計書をそれぞれ個別にクラスタリングし、ソースコードのクラスタ群と設計書のクラスタ群を統合したクラスタ群を新たに作成することで類似したプロダクトの分類精度の向上を図っている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開2012-252519号公報
【非特許文献】
【０００６】
【非特許文献１】田原靖太, 松下誠, and 井上克郎. "既存ソフトウェアの変更履歴を利用したソースコード修正支援手法の提案." 情報処理学会研究報告 (2002): 57-64.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら上述した従来技術では、検索に際して、検索の結果得られたプログラムに付随する種々のデータが検索者の参考になったかどうかということを考慮することができなかった。つまり、検索者が知りたいと思っている内容は、プログラムのソースコードの記載手法や、あるいは当該コードによって実行される処理内容についての解説など、種々のものがあり、本当に知りたいと思っている内容が検索結果で得られなければ、参考になった結果が得られたとはいえないが、従来技術ではこのような観点での満足な検索結果を得ることはできなかった。
【０００８】
すなわち、非特許文献１はソースコードによる類似コードの検索を行っているのみで、提示されたコードが検索者の参考になるかという観点で適性度が十分でない。また、特許文献１はソースコード及び設計書をそれぞれクラスタリングし、各クラスタを統合したクラスタを作成することで複数のデータを統合しているが、ソースコードクラスタに含まれるプロダクトを全て内包する設計書クラスタが存在している場合に統合を行っているのみである。そのため、検索者にとって有用かどうかという観点で複数のデータを適切に分類することができていない。
【０００９】
ここで、プログラムの検索者の参考になるか否かが特に問題となる状況の具体的な例として、当該検索者がプログラミングの初学者である場合が挙げられる。
【００１０】
すなわち、プログラミングの初学者にとって個々の文法や命令文を学習しただけでプログラムを作成することは難しく、適切なサンプルプログラムを参照しながらプログラムの構造や動作を学んでいく必要がある。適切なサンプルプログラムが初学者の手元にない場合、検索を行うことによって適切なサンプルプログラムが得られることが望まれる。しかし、前述のように知りたい内容に関して種々のものが存在する中、初学者が適切な検索単語を自ら選択し、自分に必要なサンプルプログラムを発見することは困難である。
【００１１】
そこで、初学者が自分自身で作成中のソースコードやこれに付随するデータ自体を検索クエリとして用いて、類似したプログラム等を検索することで、初学者が検索単語を選択する必要なく、適切なサンプルプログラム等の参考となる結果が自動で得られるようにすることが望ましい。しかしながら、上記説明した通り、従来技術において作成中ソースコード等を仮に検索クエリとして用いたとしても、初学者にとって参考となる結果を得ることは困難である。
【００１２】
本発明は、上記従来技術の課題に鑑み、検索者にとって参考となるプロジェクトを検索することのできる検索装置及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記目的を達成するため、本発明は、第一のソースコード及びその付随データ（以下、ソースコード及びその付随データをプロジェクトとする。）の入力を検索者より受けて、当該第一のプロジェクトに類似している第二のプロジェクトを当該検索者に提示する検索装置であって、検索対象となる複数のプロジェクトを保持するプロジェクトデータ保持部と、前記入力された第一のプロジェクトと、前記保持されている各プロジェクトと、の類似度を、プロジェクトを構成するデータ種別ごとに個別に算出する個別類似度算出部と、前記データ種別ごとに個別に算出された類似度を統合して、前記入力された第一のプロジェクトと、前記保持されている各プロジェクトと、の統合類似度を算出する統合類似度算出部と、前記保持されている各プロジェクトのうち、前記統合類似度が大きいと判定されるものを、 検索結果の前記第二のプロジェクトとして検索者に提示する参考プロジェクト提示部と、を備えることを第一の特徴とする。
【００１４】
また、前記検索装置において、前記統合類似度算出部では、データ種別ごとに値が定義された重みを用いて、データ種別ごとに個別に算出された類似度の重みづけ和として統合類似度を算出し、さらに、前記提示した第二のプロジェクトが検索者にとって有用であったか否かのフィードバックを抽出するフィードバック抽出部と、前記提示した第二のプロジェクトにおけるデータ種別ごとの個別の類似度と、前記抽出されたフィードバックとを基に、前記個別類似度において統合類似度を算出する際の重みを修正する類似度統合重み算出部と、を備えることを第二の特徴とする。
【００１５】
さらに、本発明は、コンピュータを前記検索装置として機能させるプログラムであることを第三の特徴とする。
【発明の効果】
【００１６】
前記第一の特徴によれば、プロジェクト間の類似度を、プロジェクトを構成するデータ種別ごとに個別に算出したうえで統合し、当該統合した類似度に基づいて類似プロジェクトを検索するので、検索者にとって参考となるプロジェクトを検索することができる。
【００１７】
前記第二の特徴によれば、フィードバックを取得することで、統合類似度を算出する際の重みを検索者に適した値として設定することができる。
【図面の簡単な説明】
【００１８】
【図１】一実施形態に係る検索装置の機能ブロック図である。
【図２】検索処理のフローチャートである。
【図３】更新処理のフローチャートである。
【図４】検索及び更新を連動して実施するフローチャートである。
【図５】検索装置が提供するユーザインタフェースの例を示す図である。
【図６】個別類似度算出部が算出する個別類似度の例を表形式で示す図である。
【図７】図６の例に対応する例として、統合類似度算出部が算出する統合類似度の例を表形式で示す図である。
【図８】一実施形態に係るフィードバック抽出部の構成を示す図である。
【図９】図１に対する追加構成としての学習係数決定部を示す図である。
【図１０】学習係数決定部におけるフィードバック情報の分類の例を示す図である。
【図１１】サーバクライアントシステムとして本発明を実現する場合の例を示す図である。
【発明を実施するための形態】
【００１９】
図１は、一実施形態に係る検索装置10の機能ブロック図である。検索装置10は、プロジェクト入力部1、プロジェクトデータ保持部2、個別類似度算出部3、統合類似度算出部4、参考プロジェクト提示部5、提示プロジェクト保持部6、フィードバック抽出部7及び類似度統合重み算出部8を備える。当該各部の処理の概要は以下の通りである。
【００２０】
プロジェクト入力部1は、ユーザ（検索者）より検索クエリとしてのプロジェクト（クエリプロジェクトと呼ぶ）を入力として受け取り、当該プロジェクトを個別類似度算出部3に渡す。プロジェクトデータ保持部2は、検索対象としての複数のプロジェクトPi(i=1,2,3,…)を保持し、当該複数のプロジェクトを個別類似度算出部3における参照に供する。
【００２１】
なお、本発明における用語として、プログラムのソースコードと当該ソースコードに付随するデータと、をプロジェクトと呼ぶこととする。ここで、プロジェクトにおけるソースコード付随データは１種類以上のデータで構成することができ、例えば、設計書、解説文（コメント）、当該ソースコード作成者レベル、当該ソースコードの被参照数などの任意の組み合わせによって付随データを構成することができる。
【００２２】
個別類似度算出部3は、プロジェクト入力部1より受け取ったクエリプロジェクトと、プロジェクトデータ保持部2に保持されているプロジェクトの各々と、の間で、プロジェクトを構成する各データの類似度を個別に算出し、その結果を統合類似度算出部4に出力する。すなわち、クエリプロジェクトと、検索対象のプロジェクトの各々と、の間において、構成データであるソースコードの類似度と、構成データである１種類以上の付随データのそれぞれの類似度と、が算出され、その結果が統合類似度算出部4に出力される。
【００２３】
統合類似度算出部4は、個別類似度算出部3が算出した構成データごとの類似度を統合することで、クエリプロジェクト（PQとする）と検索対象のプロジェクトの各々（Pi(i=1,2,3,…)とする）と、の類似度（統合類似度SIM(PQ,Pi)とする）を算出し、その結果を参考プロジェクト提示部5に出力する。
【００２４】
当該統合類似度の算出に際して、後述するように構成データの種類ごとに値が定義された重みを用いることにより、構成データごとの類似度の重みづけ和として算出することができる。
【００２５】
参考プロジェクト提示部5は、統合類似度算出部4より受け取った一連の統合類似度SIM(PQ,Pi)(i=1,2,3,…)のうち値が最大となるものとして、クエリプロジェクトPQに最も類似しているプロジェクトPmaxを決定し、当該最も類似しているプロジェクトPmaxをプロジェクトデータ保持部2から読み込んでユーザ（クエリプロジェクトPQを入力した検索者）に対して検索結果として提示する。
【００２６】
ここで、プロジェクトの構成データの種類ごとに値が定義された重みを用いて算出された統合類似度によって検索が行われるので、クエリプロジェクトを入力する検索者に応じた適切な重みを利用することにより、本発明は次のような効果を奏することができる。
【００２７】
すなわち、検索者がクエリプロジェクトとして自身が作成中のプロジェクト（作成済みで修正中のプロジェクトでもよい）を入力した場合を例とすると、適切な重みに基づいて算出された統合類似度によって検索が行われることで、自身のプログラム作成スキル等に合った適切なプロジェクトが検索結果として得られる確率が高まる。適切な検索結果により、作成中ないし修正中のプロジェクトに対してさらにコーディング等の作業を進める際に参考となる指針等を得ることができる。
【００２８】
なお、検索者に合った適切な重みについては、重みに何らかの初期値を設定しておいたうえで、後述するフィードバック抽出部7や統合類似度重み算出部8による処理で当該初期値を更新していくことにより、設定することが可能である。
【００２９】
提示プロジェクト保持部6は、参考プロジェクト提示部5において検索者に提示したプロジェクトを検索結果履歴として保持しておき、類似度統合重み算出部8での参照に供する。
【００３０】
フィードバック抽出部7は、参考プロジェクト提示部5において提示したプロジェクトが検索者にとって有用であったかどうかのフィードバックを抽出し、当該抽出したフィードバックを類似度統合重み算出部8に出力する。
【００３１】
類似度統合重み算出部8では、提示プロジェクト保持部6に保持されている検索結果として提示したプロジェクトと、フィードバック抽出部7にて抽出された当該検索結果に対するフィードバックの情報と、に基づき、統合類似度算出部4で統合類似度を算出する際に用いる重みを検索者に適した値へと更新する。
【００３２】
以上、図１の各部の処理の概要を説明した。当該処理は、次のように大きく２つに分けることができる。すなわち、第一処理として、各部1〜5にて実施される検索者がクエリプロジェクトを入力して類似プロジェクトの検索結果を得るまでの検索処理と、第二処理として、各部6〜8にて実施される当該検索処理の結果に対するフィードバックに基づく重み更新処理と、に分けることができる。
【００３３】
図２は、検索処理のフローチャートである。また、図３は、重みの更新処理のフローチャートである。このように、検索及び更新は互いに独立の処理として実施することができ、検索処理に際しては検索が行われる時点までの一連の更新処理によって得られている最新の重みを利用すればよい。あるいは、後述する図４のフローのように、検索及び更新を連動させて実施することもできる。以下、図２〜４を順にそれぞれ説明する。
【００３４】
まず、図２のフローの各ステップを説明する。ステップS21では、検索者がクエリプロジェクトをプロジェクト入力部1に入力してから、ステップS22へ進む。ステップS22では、個別類似度算出部3が前記入力されたクエリプロジェクトを取得すると共に、検索対象となるプロジェクトをプロジェクトデータ保持部2から取得して、ステップS23に進む。
【００３５】
ステップS23では、個別類似度算出部3がクエリプロジェクトPQと検索対象のプロジェクトPi(i=1,2,3,…)とについて、構成データごとの個別類似度を算出してからステップS24に進む。ステップS24では、プロジェクトデータ保持部2に保持されている全ての検索対象のプロジェクトPi(i=1,2,3,…)に関して以上のステップS22,S23が実施済みとなっているか否かが判断され、未処理のプロジェクトが残っていればステップS22に戻り、当該未処理プロジェクトについて処理を継続し、全てのプロジェクトについて実施済みであればステップS25に進む。
【００３６】
ステップS25では、統合類似度算出部4が重みwを用いることでクエリプロジェクトPQと検索対象のプロジェクトPi(i=1,2,3,…)との統合類似度SIM(PQ,Pi)(i=1,2,3,…)を算出してから、ステップS26へ進む。ここで、重みwについては後述する図３のフローにおいて独立の処理として実施されている更新処理によって更新された最新の値を利用する。
【００３７】
ステップS26では、ステップS25の処理が検索対象のプロジェクトPi(i=1,2,3,…)の全てについて実施済みか否かが判断され、未処理のものが残っていればこれを処理すべくステップS25に戻って処理を継続し、全て処理済みであればステップS27へ進む。
【００３８】
ステップS27では、一連のステップS25で算出された統合類似度SIM(PQ,Pi)(i=1,2,3,…)のうち、最大類似度となるようなプロジェクトPmaxを検索結果として参考プロジェクト提示部5が検索者に対して提示し、図２のフローは終了する。
【００３９】
次に、図３のフローの各ステップを説明する。図３のフローの開始トリガに関しては、検索者が図２のフローによって検索結果を得た後、フィードバックが得られた時点で開始することができる。
【００４０】
なお、同一検索者より得られるn回目(n=1,2,3,…)フィードバックをF(n)と表記すると、図３のフローは当該得られた順にそれぞれ実施することが好ましい。すなわち、重みとして所定の初期値w(0)を用意しておき、F(1)によって重みをw(0)から更新して1回目の更新値w(1)とし、F(2)によって重みをw(1)から更新して2回目の更新値w(2)とし、以降同様に繰り返すことで、n回目のフィードバックF(n)によってその時点までの最新の値としての重みw(n-1)を、その時点以降の最新の値として重みw(n)へと更新することができる。当該重みのw(n-1)からw(n)への更新には、後述する(式2)や(式3)を用いることができる。
【００４１】
図３にて、ステップS31では、フィードバック抽出部7が、参考プロジェクト提示部5で検索結果を確認した検索者からフィードバックを取得して、ステップS32へ進む。ステップS32では、類似度統合重み算出部8が、ステップS31にて取得したフィードバックの対象となった提示プロジェクト保持部6で提示したプロジェクトにおける、クエリプロジェクトとの間の類似度のデータ（検索処理で最大類似度となったデータ）を取得してから、ステップS33へ進む。ステップS33では、類似度統合重み算出部8が、ステップS31,32で得られたフィードバック及び類似度のデータに基づき、重みを更新することで修正して、図３のフローは終了する。
【００４２】
なお、ステップS31,32,33における処理内容の詳細は、フィードバック抽出部7及び類似度統合重み算出部8の詳細説明において後述する。
【００４３】
さらに、図４のフローの各ステップを説明する。ステップS41は図２のステップS21と同様であり、検索者がクエリプロジェクトをプロジェクト入力部1に入力してから、ステップS50へ進む。ステップS50では、ステップS41でなされた検索入力が初回のものであるか否かが判断され、初回の検索であればステップS55へ進み、初回の検索ではない（2回目以降の検索である）場合はステップS51へ進む。
【００４４】
ステップS55では重みwに初期値を設定してから、ステップS62へ進む。
【００４５】
ステップS51,52,53はそれぞれ図３のステップS31,32,33と共通であるので、重複する説明は省略する。
【００４６】
ただしここで、ステップS51にて取得対象となるフィードバックは、今回の図４のフローがn回目（n≧2）であるとすると、すなわち、ステップS41のクエリ入力がn回目であり今回はn回目の検索結果を得ようとしているとすると、前回のn-1回目の図４のフローにおいてステップS67で得られた検索結果に対するフィードバックF(n-1)となる。また、ステップS53では重みwの値を前回のn-1回目に用いられた値w(n-1)から今回n回目に用いるべき値w(n)へと修正して更新し、ステップS62へ進む。当該重みのw(n-1)からw(n)への更新には、後述する(式2)や(式3)を用いることができる。
【００４７】
ステップS62〜S67はそれぞれ、図３のステップS32〜S37と共通であるので、重複する説明は省略する。ただしここで、ステップS65で用いる重みとして、当該図４のフローがステップS55を経由した場合であれば当該ステップS55にて設定された初期値が利用され、ステップS51〜S53を経由した場合であればステップS54で更新された値が利用される。
【００４８】
以上、図２，３あるいは図４のようなフローに従い、検索装置10を利用するプログラミング学習者としての検索者は、自身で作成したプロジェクトをクエリとして利用することで、コーディング作業を進めながら必要に応じて当該時点におけるプロジェクトをクエリとして検索を実行することで、プログラミングの参考となる情報を参照することができる。
【００４９】
この際、検索装置10では検索者としてのユーザに対するインタフェースとして、例えば図５に示すような画面D1をユーザに提示することができる。なお、当該インタフェースの機能は、図１の機能ブロックのうち、参考プロジェクト提示部5やプロジェクト入力部1等によって担われる。
【００５０】
欄C1には検索者であるユーザ自身が作成中であるプロジェクトが示され、欄C2には当該作成プロジェクトをクエリとして類似するものとして検索された参考プロジェクトが示されている。当該欄C2をユーザが参照する際には、プルダウンメニュー欄C3に示すように、ソースコードや解説文といったデータ種別を選択して、当該データ種別の内容のみを表示させるようにすることもできる。
【００５１】
また、「別のプロジェクトを検索」するためのボタンB1に示すように、再度検索を実行する指示を受け取るようにすることもできる。当該指示を受け取ると、プロジェクト入力部1へ当該時点での欄C1内のプロジェクトが入力され、新たな検索が実行されてその結果が欄C2に示されることとなる。
【００５２】
以下、個別類似度算出部3、統合類似度算出部4、フィードバック抽出部7、類似度統合重み算出部8の詳細についてそれぞれ説明する。
【００５３】
（個別類似度算出部3について）
個別類似度算出部3はプロジェクトを構成するデータ種別のそれぞれについて、クエリプロジェクトPQとプロジェクトデータ保持部2が保持しているプロジェクトPi(i=1,2,3,…)との間の類似度を求める。類似度はデータ種別毎に正規化して求めることができる。
【００５４】
図６に、個別類似度算出部3が算出する個別類似度の例を表形式で示す。図３では、プロジェクトを構成するデータ種別がソースコード、プロジェクト解説文、ユーザレベル、プロジェクト被参照数などである場合に、クエリプロジェクトPQと検索対象の各プロジェクトP1,P2,P3,…との間で当該データ種別ごとの類似度が算出された例が示されている。
【００５５】
ここで、プロジェクトを構成するデータ種別の内、図６に例示したような代表的なデータ種別に関して類似度算出方法の一例を説明する。
【００５６】
ソースコードの類似度を算出する場合、既存技術で算出することができる。例えば、まず、ソースコードに含まれる空白や改行を削除し、トークン単位でソースコード間の一致箇所を検出する。そして、ソースコード間の全トークン中の一致したトークンの割合を類似度として算出することができる。
【００５７】
プロジェクト解説文の類似度を算出する場合、テキスト同士の類似度を算出する既存技術を利用することができる。例えば、各解説文中の単語を全て抽出し、TF-IDFによりそれぞれの単語ベクトルを算出する。すなわち、解説文に含まれる単語tについて、解説文中での出現頻度を表すTF値と、プロジェクト保持部に保存されている全プロジェクトの解説文中の単語を解析し、単語tが含まれる解説文の割合の逆数であるIDF値の積をそれぞれ求め、解説文を単語ベクトルへと変換する。これらの単語ベクトル間の距離の逆数を類似度として算出する。（すなわち、ベクトル間の距離が小さいほど類似度が高くなる。）
【００５８】
プロジェクトを構成するデータ種別としてこれらの他に、プロジェクトの被閲覧数、被参照数、プロジェクトの作成者のレベル（これまでに作成したプロジェクトの個数やプログラム行数から定義）を用いてもよい。これらのデータの類似度はプロジェクト間の数値の差によって算出すればよい。すなわち、差の絶対値が小さいほど類似度が高いものとして算出すればよい。
【００５９】
なお、プロジェクトの被閲覧数及び被参照数については、予め取得しておいてプロジェクトデータ保持部2の各プロジェクトPi(i=1,2,3,…)の値として与えておくことができる。予め取得する手法として例えば、検索者としてのユーザ毎にそれぞれ検索装置10を利用させ、当該一連のユーザにおいて検索対象となるプロジェクトデータ保持部2での保持データを共通のものとしておくことで、実際の検索結果の実績を取得し、被閲覧数及び被参照数を取得することができる。被閲覧数は、参考プロジェクト提示部5に提示された総数として取得することができ、被参照数は、フィードバック抽出部7（後述）において有用である旨のフィードバックが得られた総数として取得することができる。また、当該実績取得を継続して実施することで、プロジェクトデータ保持部2では各プロジェクトPi(i=1,2,3,…)の被閲覧数及び被参照数を最新の値として更新し続けることができ、クエリプロジェクトPQが入力された時点での最新の値を個別類似度算出部3における参照に供することができる。
【００６０】
また、クエリプロジェクトPQにおける被閲覧数及び被参照数も、上記の各プロジェクトPi(i=1,2,3,…)について取得したのと全く同様に取得することができる。この場合、検索装置10を複数の検索者A,B,C,…がそれぞれ利用しているものとする。そして、当該クエリプロジェクトPQは検索者Aによって適宜編集されてきたものとし、その各々の段階でプロジェクトデータ保持部2に保持され、別の検索者B,C,…からの検索対象になっているものとし、当該クエリプロジェクトPQがこれまでに閲覧、参照されてきた総数を、当該クエリプロジェクトPQが入力された時点における被閲覧数、被参照数として算出することができる。（ここで、検索者Aが当該クエリプロジェクトPQを入力する場合、自身のプロジェクトデータ保持部2にクエリプロジェクトPQが保存されていても、同一プロジェクトであるものとして検索対象から除外する。）
【００６１】
なお、プロジェクト作成者のレベルに関しても、上記のように被閲覧数及び被参照数の実績を取得する際に、これまでに作成したプロジェクトの個数やプログラム行数を併せて取得し、当該取得結果に所定の関数式を適用する等で、最新の値として算出することができる。
【００６２】
（統合類似度算出部4について）
統合類似度算出部4は、個別類似度算出部3で算出した類似度を以下の(式１)に従い統合する。
【００６３】
【数１】
2016177359.tif 000003
【００６４】
ここで、w(=[w1,...,wN])は各類似度を統合する際の重みを表す。重みwの初期値としては例えば全ての要素が1の行列（行ベクトル）を用いることができ、類似度統合重み算出部8により更新されている場合は更新された値を用いればよい。また、xi(=[xi1,...,xiN])はクエリプロジェクトPQとプロジェクトPiの各類似度を表す。Nはプロジェクトを構成する全データ種別の個数（種類数）を表す。
【００６５】
図７に、図６の例に対応する例として、当該算出される統合類似度の例を表形式で示す。
【００６６】
（フィードバック抽出部7について）
フィードバック抽出部7は、検索結果として参考プロジェクト提示部5が提示したプロジェクトが検索者にとって有用であったかどうかという有用性をフィードバックとして抽出する。当該抽出する手法として、以下のような各実施形態が可能である。
【００６７】
一実施形態では、検索者が有用であったかどうかを、「有用であった／有用ではなかった」という２値情報として、フィードバック抽出部7に対して直接入力することができる。
【００６８】
一実施形態では、フィードバック抽出部7が図８に示すような各部を備えて構成されることにより、検索者のプロジェクトの品質変化を評価することで、フィードバック情報として有用であったか否かの２値情報を取得してもよい。なお、図８では、フィードバック抽出部7が備える各部の他に、図１の各部のうち当該各部とデータ授受を行う構成も示されている。
【００６９】
すなわち、図８の構成では、フィードバック抽出部7が、（１）検索者が過去にクエリとして入力したプロジェクトPQ[過去]を保持しておく過去入力プロジェクト保持部71と、（２）現時点のクエリとして入力されたプロジェクトPQ[現在]と過去入力されたプロジェクトPQ[過去]を比較しプロジェクトの品質の変化を評価するプロジェクト品質評価部72と、（３）プロジェクト品質評価部72による品質評価を元に、２値情報としてのフィードバックを決定するフィードバック決定部73と、備えている。
【００７０】
なお、当該構成で評価する場合、過去入力のプロジェクトPQ[過去]に対して同検索者が検索結果を利用して修正等を施したものが、現時点のプロジェクトPQ[現在]となるよう、検索者側がプロジェクト入力部1への入力を実施するものとする。例えば、図４のフローを適用する場合であれば、n-1回目のクエリをPQ[過去]とし、n回目のクエリをPQ[現在]とすればよい。あるいは、PQ[過去]及びPQ[現在]の間に修正や編集履歴の関係がある旨を上記のように検索者が明示的に指定することを省略可能なように、次のようにしてもよい。すなわち、プロジェクト入力部1ではクエリプロジェクトの入力をそのIDと共に受け付けるようにし、過去入力プロジェクト保持部71では当該入力されたIDと共にPQ[過去]を保持し、プロジェクト品質評価部72では現時点のプロジェクトPQ[現在]とIDが共通のものとして比較対象のPQ[過去]を自動決定するようにしてもよい。
【００７１】
プロジェクト品質評価部72において評価するプロジェクト品質は、以上のように現在入力されたプロジェクトと過去入力されたプロジェクトを比較し、プロジェクトを構成するデータ種別を個別に評価して決定しても良いし、データ種別を評価した結果を統合して決定しても良い。
【００７２】
例えば、入力プロジェクトと過去入力プロジェクトの変化量を算出し、変化量が閾値を上回った場合に過去提示した参考プロジェクトが有用であったと判断する。変化量はプロジェクト間のプログラムや解説文をトークン単位（あるいは単語や行単位）で比較を行い、変更・追加されたトークン（単語/行）数を入力プログラム・解説文の全トークン（単語/行）数で割ったものとする。
【００７３】
あるいは、ソースコードの品質を評価する場合、ソースコードに含まれるバグ数の変化や一定時間内のコンパイルエラー回数などにより、品質向上/低下を決定することができる。ここで、検索者のプロジェクト作成環境において一定時間ごとに自動でコンパイル処理が実施される前提とし、その結果を取得することによりコンパイルエラー回数を取得可能である。バグ数に関しても既存のソースコード解析技術により取得可能である。あるいは、クラス、メソッドの個数やクラス間の依存関係をもとにプログラムの品質を評価するメトリクス計測ツールを用いて品質向上/低下を決定してもよい。
【００７４】
また、プロジェクトにおける解説文を評価する場合、解説文に含まれる単語レベルの変化や文法ミスの個数、文章量の変化などから品質向上/低下を決定することができる。ここで、単語レベルは単語のレベルを定義した所定の辞書を利用することで判定することができる。また、文法ミスについては既存の文法解析技術で判定することができる。
【００７５】
また、個別類似度算出部3又は統合類似度算出部4におけるのと同様の類似度算出を現時点に入力したPQ[現在]と過去入力のプロジェクトPQ[過去]との間で実施し、類似度が閾値以下である場合、すなわち当該両プロジェクトが類似していないと判定される場合に、有用であったとし、類似度が閾値より大きく類似していると判定される場合には有用ではなかったものとしてもよい。
【００７６】
なお、フィードバック抽出部7では参考プロジェクトが有用であったかどうかという有用性のフィードバック（２値情報）だけでなく、プロジェクトを構成する各データの品質評価や品質評価に用いた各種データ値をフィードバックとして直接抽出してもよい。
【００７７】
（類似度統合重み算出部8について）
類似度統合重み算出部8は、参考プロジェクト提示部5にて提示した参考プロジェクトにおける類似度とフィードバック抽出部７が抽出したフィードバックとを基に、以降の時点で統合類似度算出部4において類似度を統合する際の重みwを修正する。重みを修正する方法の一例として、パーセプトロンのアルゴリズムを用いた例を示す。
【００７８】
すなわち、フィードバック抽出部7が抽出したプロジェクトPiの有用性フィードバックをyiとする。ここで有用であった場合yi=1とし、有用でなかった場合yi=-1とする。また、xiは前述の(式1)と同様にプロジェクトPiの各データ種別の類似度とする。このとき、以下の(式2)により重みw(=[w1,...,wN])をwnewへと更新する。ここで、μは学習係数で予め設定された定数を表す。なお、当該定数は、フィードバックyiの値を上記のように定めた場合であれば、正の値とする。
【００７９】
【数２】
2016177359.tif 000004
【００８０】
あるいは、プロジェクトPiの有用性フィードバックをデータ種別ごとに有用（品質向上に寄与）なら値を1、有用でない（品質向上に寄与していない）なら値を-1としたベクトルをyiとし、(式3)により重みを更新してもよい。yiは例えば、データ種別が2種類で{ソースコード、解説文}である場合、ソースコードの品質が向上し、解説文の品質が低下した場合にはyi=[1,-1]となる。
【００８１】
【数３】
2016177359.tif 000005
【００８２】
なお、(式2),(式3)では積「yixi」及び積「yi[xi]T」が現れているが、(式2)ではyiはスカラーでありスカラー積を取っており、(式3)ではyiは１行N列の行列であり、ベクトルxiを転置した[xi]T(N行1列)と積を取り、1行N列の行列μyi[xi]Tとして同サイズのwと各要素ごとに和を取っていることに注意されたい。すなわち、(式3)においてyi=[yi1,...,yiN], xi=[xi1,...,xiN]と要素表示すると、yi[xi]T=[yi1* xi1, ..., yiN *xiN]である。
【００８３】
あるいは、図１の構成に対する追加として、図９のようにフィードバック抽出部7が抽出したフィードバックを基に学習係数を決定する学習係数決定部75を検索装置10がさらに備えることにより、学習係数決定部75が決定した学習係数μを上記の(式2)又は(式3)の係数として利用することで、類似度統合重み算出部8が重みを更新するようにしてもよい。なお、図９では図１の構成に対する差分の部分のみが示されている。
【００８４】
すなわち、学習係数μについて学習係数決定部75において、フィードバック抽出部7が抽出したプロジェクト品質評価用の各種データ値を基にフィードバックを分類し、分類に応じた学習係数μを決定して類似度統合重み算出部8へと出力し、当該出力された係数μによって重みを更新してもよい。なお、当該分類されるフィードバックは、プロジェクト品質評価用の各種データ値を含むものとして構成しておく。
【００８５】
当該分類は、その例を図１０に表形式で示すように所定の分類条件に基づくルールベースの手法により、係数μを決定することができる。図１０の表によれば、例えば、ソースコードの変化量が閾値以下の場合（分類１）や、ソースコードのバグ数が増加した場合（分類２）など、プロジェクトの品質向上に効果がなかったり悪影響を与えている場合には、検索結果が不適切であったものとして、別の検索結果が得られる傾向を強めるように、学習係数μを大きくし、重みの更新量も大きくするようにする。
【００８６】
一方で、プログラムのバグ数が減少した場合（分類３）や、解説文の単語レベルが上昇している場合（分類４）など、プロジェクトの品質向上に効果的であった場合には、検索結果が適切であったものとし、今後も同様の検索結果が得られるようにすべく、学習係数μを小さくし、重みの更新量を小さくする。このように、プロジェクトの品質がどう変化したかに応じて学習係数を調整し、重みパラメータの更新量を調整することができる。
【００８７】
あるいは、学習係数μについて、フィードバック抽出部7が抽出したプロジェクト品質評価用の各種データ値を基に決定して重みを更新してもよい。例えば、μ＝（プロジェクトの品質変化率の逆数）として重みを更新してもよい。こうすることで、プログラム品質が低下した場合には大きく重みが更新され、品質が向上した場合にはあまり変化しないように調整することができる。
【００８８】
なお、上記各実施形態において学習係数決定部75が学習係数μを決定する際に用いる、プロジェクト品質用の各種データ値は、フィードバック抽出部7を図８の実施形態で構成して、プロジェクト品質評価部72において取得することができる。
【００８９】
また、学習係数決定部75ではプロジェクト品質用の各種データ値を含む情報としてのフィードバックを分類し、分類に応じた学習係数を決定するものとしたが、全く同様に、次のようにしてもよい。まず、フィードバック抽出部7は図８の構成により、２値情報としてのフィードバック（フィードバック決定部73にて出力）と、プロジェクト品質用の各種データ値（プロジェクト品質評価部72にて出力）とを個別に出力する。すなわち、フィードバックには形式上、プロジェクト品質用の各種データ値を含めないものとする。そして、学習係数決定部75では、当該出力されたプロジェクト品質用の各種データ値を、図１０に例示したような分類テーブルに照らし合わせることで、対応する学習係数を読み込み、類似度統合重み算出部8に出力するようにしてもよい。
【００９０】
以上、本発明によれば、検索者が検索処理を行う中で重みwが当該検索者に応じた値に自動で更新されていくことにより、当該検索者にとって適切な、参考となるプロジェクトが得られる傾向が強化されていき、検索者におけるプログラミング学習等に適した検索結果が提示されるようになる。
【００９１】
例えば、解説文や設計書（どんなものを作りたいか）は充実しているがプログラムはあまり書けていないユーザは解説文などの情報の重みが強くなり、逆にプログラムはある程度書けているが、解説がうまくできていないユーザはプログラムの情報の重みが強くなるなど、重みパラメータが調節されていく。これにより、初学者のプロジェクトであっても各データ種別の検索の際の寄与分が適切に統合され、参考になりやすいプロジェクトの検索を可能にする。すなわち、統合の際には各データ種別の類似度を検索者にとって有用かどうかという観点で適切に統合するので、検索者に有用なプロジェクトを高い精度で検索することができるようになる。
【００９２】
以下、本発明における（説明の流れの観点からの）補足的事項を説明する。
【００９３】
（１）統合類似度算出部4で用い類似度統合重み算出部8で更新する重みパラメータwは、ユーザ（検索者）毎に個別に用意しておき、ユーザが検索装置10を利用する際に個別のユーザIDを入力することで、当該ユーザのための値を読み込んで利用するようにすればよい。
【００９４】
あるいは、重みパラメータを特定のグループ毎（同じ地域のユーザ、ある授業を受講するユーザ、など）や、全ユーザで共通に使用しても良い。あるいは、全ユーザのフィードバックを基に算出した重みパラメータを初期値として利用し、以降、ユーザ毎に個別に更新していってもよい。
【００９５】
（２）図１に示す検索装置10の各部を、端末及びサーバに分けた構成により、本発明をサーバクライアントシステムとして構築するようにしてもよい。図１１に、検索システム40として構成した場合の例を示す。当該例においては図１の各部1〜7のうち、クライアント端末20が各部1,7を備え、サーバ30が各部2〜7を備える構成の例が示されている。ここで、フィードバック抽出部7は端末20とサーバ30との両方に描いているが、少なくともいずれか片方にあればよい。端末20でユーザが直接「有用であった／有用でなかった」と入力するような場合は、端末20の側のみにフィードバック抽出部7を備えるような構成としてもよい。サーバ30側で複数ユーザの利用状況を利用してフィードバックの情報を作成するような場合、サーバ30側に備わるフィードバック抽出部7を利用するようにすればよい。
【００９６】
また、図１１の構成ではサーバ30にユーザ情報保持部35が備わり、当該構成において端末20のユーザIDを管理し、端末20のユーザを識別することで、ユーザ毎に値が定義された重みパラメータを利用することができる。
【００９７】
図１１ではまた、端末20,サーバ30間での情報送受の構成として、以下を備える。クライアント側の端末20は、プロジェクト入力部1に入力されたプロジェクトを送信するプロジェクト送信部21を備え、サーバ30のプロジェクト受信部33がこれを受信する。
【００９８】
また、クライアント側の端末20はさらに、自身のフィードバック抽出部7で抽出したフィードバックを送信するフィードバック送信部27を備え、サーバ30は端末20から送信されるフィードバックを受信するフィードバック受信部37を備えてもよい。
【００９９】
こうして、端末20とサーバ30との間で、以下のように動作することが可能である。
【０１００】
ユーザは個別のユーザIDを持ち、端末20からユーザIDと共にプロジェクトデータをサーバ30に送信する。サーバ30は受信したユーザIDを読取り、ユーザ情報保持部35からユーザIDと紐付けられた重みパラメータを読み込む。必要に応じて、ユーザIDに紐付けられた過去提示プロジェクト、過去入力プロジェクトを読み込み重みパラメータの更新を行う。更に、サーバ30は受信したプロジェクトデータと提示プロジェクト保持部6から取得した各プロジェクトとの類似度を計算し、前述のとおり取得した重みパラメータを基に類似度を統合する。その結果最も高い類似度を持つプロジェクトデータを端末20に送信する。端末20はサーバ30からプロジェクトデータを受信し、端末20に備え付けられた提示装置によりユーザに提示する。（図１１では参考プロジェクト提示部5がサーバ30に備わっているが、ここでウェブページ等の形式で提示情報を生成することで、端末20において閲覧等を実施することができる。）
【０１０１】
（３）参考プロジェクト提示部5では統合類似度が最大のものを検索結果として提示するものとして説明したが、上位のもの（閾値判定で統合類似度が大きいと判定されるもの）を複数提示するようにしてもよい。この場合、ユーザが実際に参考にした１つのプロジェクトをフィードバック情報の生成に利用すればよい。
【０１０２】
（４）本発明は、コンピュータを検索装置10の各部1〜7の全て又はその任意の一部分として機能させるプログラムとしても提供可能である。当該コンピュータには、CPU(中央演算装置)、メモリ及び各種I/Fといった周知のハードウェア構成のものを採用することができ、CPUが検索装置10の各部の機能に対応する命令を実行することとなる。
【符号の説明】
【０１０３】
10…検索装置、1…プロジェクト入力部、2…プロジェクトデータ保持部、3…個別類似度算出部、4…統合類似度算出部、5…参考プロジェクト提示部、6…提示プロジェクト保持部、7…フィードバック抽出部、8…類似度統合重み算出部
【図１】
2016177359.tif 000006
【図２】
2016177359.tif 000007
【図３】
2016177359.tif 000008
【図４】
2016177359.tif 000009
【図５】
2016177359.tif 000010
【図６】
2016177359.tif 000011
【図７】
2016177359.tif 000012
【図８】
2016177359.tif 000013
【図９】
2016177359.tif 000014
【図１０】
2016177359.tif 000015
【図１１】
2016177359.tif 000016