Yukara Wisdom リリース

Yukara プロジェクトサイトをオープンし、SeasarConで id:masataka_k がしゃべった Yukara Wisdom をリリースしました。

マーケット的な何かとかは -Yukara-Wisdomリリース - まさたか日記 などにお任せするとして、少しJavaサンプルコード検索の背景技術についてまとめてみようと思います。

※ちなみにSSLはいまどきオレオレ認証なので、見苦しかったらスルーしてください。

背景

"Connection" という文字列を検索エンジンで検索すると、java.sql.Connection のAPIリファレンスや、「Sun Developer Connection」といった交流に近い意味のページなどが返ってきます。
通常のWeb検索エンジンでは、Web上の様々なページから "Connection" という意味合いを含んだものを探してきてくれるのですが、たとえば「java.sql.Connection に関するサンプルコードが欲しい」といった際には "java.sql.Connection サンプル プログラム" といったように、検索エンジンのご機嫌をうかがいながらキーワードを策定してやる必要があります。
これには、次のような問題があります。

  • キーワードが思いつかないと探せない
  • サンプルコードとしてわざわざページを作ってくれているものしか見つからない
  • マイナーなクラスのサンプルは皆無

最近はCodeReposSVN上のサンプルコードなども引っかかるようになってきましたが、これもやはり公開を前提としたプログラムくらいしか引っかかりません。企業で開発しているプログラムや、SVN上のリソースをロボット検索禁止にしているプログラムなどは探すのが困難だと思います。

特徴

Javaサンプルコード検索エンジンは、上記の問題を解決するために次のような特徴を盛り込みました。

  • 現在書いているソースコードの特徴を元に、それに似たサンプルを自動的に探すので、検索キーワードという概念がない
  • 検索対象のソースを自分で投入できるので、入手可能なあらゆるJavaソースコードを検索対象にできる

このようなナレッジベース的なものはコールドスタートが基本なのですが、世の中には良質なJavaOSSが大量にあるので、現在のプロジェクトと方向性の似たソースコードを大量投入しておけば何かの参考になるかもしれません。

基礎技術

基礎技術をダイジェストで。

  • 動態検知
    • 現在書いているコードを検出する
      • 書きかけのバッファを探すだけではなく、リアルタイムで書いている個所をキャレット位置から推測する
      • 技術的にはオートコンプリートの推論にかなり近い
  • 静的解析
    • 現在書いているコードから「これから書きそうなコード」を推測し、特徴ベクトルを算出する
      • 動態検知で検出したものを全力で解析
      • 現在は「直後に利用しそうなクラス」程度なので、今後はもっと複雑な推論を入れたい
    • 検索対象のサンプルコードから、その特徴ベクトルを算出する
  • 連想計算
    • これから書きそうなコードの特徴を元に、類似の特徴を持つサンプルコードを探す
      • tf*idf + 距離計算 + いくつかのバイアス
動態検知

動態検知では、今書いているJavaソースコードの情報を検出します。

  1. 現在開いてるエディタから ICompilationUnit とキャレット位置を引っこ抜く
  2. ICompilationUnit から CompilationUnit を作る
  3. CompilationUnit とキャレット位置から、現在書いている位置のASTNodeを算出する
静的解析 (クライアント)

クライアントサイドの静的解析では、サーバに渡す編集中ソースコードの特徴ベクトルを算出します。

仕組みとしては簡単です。

  1. 動態検知フェーズで引っこ抜いたASTを分析し、特徴要素の一覧を算出
  2. バイアスを元に特徴要素をベクトル化

現在の方法で作成する特徴ベクトルは下記のような感じです。

[
  {"typeName": "java.util.zip.ZipEntry", "score": 1.0},
  {"typeName": "java.lang.String", "score": 0.224},
  {"typeName": "java.util.regex.Pattern", "score": 0.32},
  {"typeName": "java.util.zip.ZipFile", "score": 0.64},
  {"typeName": "org.ashikunep.yukara.java.index.generator.Tree", "score": 0.64}
]
静的解析 (サンプルコード)

サンプルコードも静的解析を行って特徴ベクトルを算出します。ただし、クライアント側とは多少異なる方法で行っています。

  • コンパイル済みのクラスファイルを解析
  • メソッド単位で特徴を計測
  • 特徴に分類のための属性を多少つけてる
    • 戻り値の型
    • 引数の型
    • メソッド呼び出し、フィールド利用
    • メソッド呼び出しの引数

org.ashikunep.yukara.java.index.generator.MethodIndexAnalyzer あたりでやってます。

連想計算

現在、Yukara チームには検索エンジンの技術者がいなかったもので、tf*idfを元にした簡単な連想計算エンジンを作って検索しています。連想計算については 類似検索 - しげるメモ でちょっと語っています。

詳しくはメンバーの id:rts がすごい勢いで説明してくれると思います。

斜め上のクライアント

RIAという言葉が普通になってきて、次の時代のクライアントは

  • 操作性
  • 表現力

に優れたアプリケーションが主流になるといわれています。

Ashikunepは基本的に実験室なので、Yukara Wisdomではちょっと斜め上の方向性を模索しています。

  1. ユーザはAが欲しいので、Aと入力した (ちょっと昔のブラウザ)
  2. ユーザはAが欲しそうで、Aと入力している (現在の流れ?)
  3. ユーザは(これまでの流れで)なんとなくAが欲しそうだ (Yukara Wisdomが目指しているもの)

Amazonやらいろいろなサービスでは、3の技術をサーバサイドで使っています。「これまでの流れで」という情報は基本的にユーザがサーバに送ったデータをもとにやっているはずです。
Yukara WisdomはあえてクライアントをEclipse Plug-inにすることで、マーケットは狭くなりましたがかなりいろいろな情報をクライアントサイドで収集できるようになりました。今回はその有用性を検証するために、Javaサンプルコード検索ではキーワードの入力をすべて無視しています。検索アルゴリズムがしょぼい上にキーワードを入力させないという残念な状態でも、それなりにサンプルとして使えそうなソースコードは見つけられる模様です。

こんな感じで、現在のクライアントは表現のリッチさばかりが語られている時代ですが、インテリジェンスさという斜め上な方向性のこともたまには思い出してやってください。

以上

こんな感じです。まだまだしょぼいところがありますが、使ってみていただければと。

次は、プライバシーやらセキュリティやらもちゃんと考えなきゃな感じです。