チケットレコメンデーション

Python温泉にて「チケットがたくさん山になっているとヤル気がそがれたりどれからやったらいいか悩むのに時間を使ったりしてしまうので、オススメのチケットを選んでくれるシステムがあったらいいんじゃないの?」って話題になったのでコンセプトプルーフを実装した。

とりあえずRubyRedmineからチケットを適当に取ってきて実験。recommend()ってやるとオススメのチケットを1つ教えてくれる。

In [2]: recommend()
Windows環境で日本語を含むパスに対して、File.expand_path が存在しないパスを返すパターンが存在する。

これはちょっとなー、自分向きじゃないなぁ(OS依存だし)、別のがいいなぁ、と思ったのでno()と答える。すると別のチケットを提案してくれる。

In [3]: no()
Please backport r33556 (Bug #5243)

うん、じゃあこれをやろう、と思って着手して、完了したところをこのプロトタイプではまとめてok()で表現している。ok()すると次のチケットを提案してくれる。(ここは「提案して欲しければ別途recommend()」って設計でもいいかもね)

In [5]: ok()
Ruby 1.9.3 fails to compile in directories with accent in their names

ちなみに今のタイミングでの各チケットのスコアはこんな感じになっている。

In [6]: debug()
0.94 Ruby 1.9.3 fails to compile in directories with accent in their names
0.94 Ruby can't pass test-all (x86_64-darwin11.2.0 built by Xcode 4.2 's clang)
0.80 Please backport thread-safe autoloading patch
0.60 ruby does not compile on Lion with Xcode 4.2
0.54 ruby-1.9.3-p0 mswin IO#write still slower than 1.9.2
0.28 RSpec 2.7.1 and Ruby 1.9.3
-0.15 Windows上でFile.utimeにtime_tの負の値を与えるとSEGV
-0.43 Windows上で \.\ から始まるデバイスをopenするとクラッシュ
-0.79 Windows環境で日本語を含むパスに対して、File.expand_path が存在しないパスを返すパターンが存在する。

こうやってチケットが1個ずつで提案されることで、ユーザが「やだな」と思ったかどうかをデータとして取ることができる。これによって多くの人が避けたり、一人でやっていて何度も避けられるチケットは、粒度が大きすぎたり、記述が曖昧だったり、やる必要性が微妙だったりするのではないか?と機械的に判断できる。「チケットの良し悪し判定」ができるわけだ。悪いチケットは、例えばチケットを書いた人に「分割するか、明確化するか、捨てるか、を検討せよ」というチケットを作ってフィードバックすることもできる。「やる気が出るチケットの書き方」を考える機会を作るわけだ。

このデータで例えば、あるチケットをだれにアサインしようかなと考えたときに「一番そのチケットにモチベーションを持ちそうなのは誰か」というレコメンデーションもできる。こちらにもニーズがあるようだ。

ソースコード: https://gist.github.com/1376945
現状はコンセプトプルーフなのでTracRedmineから直接データを取ったりはしていない。タイトルの文字列だけでやってる。実際にはとれる諸々のデータを全部特徴ベクトルに突っ込んだほうがいい結果が出そう。チケットの重要度やマイルストーンまでの残り時間なんかでスコアに下駄を履かせてもいいかもね。