本棚演算実験中


本棚演算(Rubyのオリジナル)をだらだらみてて,本棚に限らず任意のISBNのリストを投げて結果が拾えたら便利かなー,と思ってISBNのリストでの入力を試してみる。
また,基本的には本棚名とISBNのどっちからはじめてどっちで終わるかだけで,実はやってることはどちらの処理もあまり変わらないんだな,ってことをちょっと考えた。お奨め本検索も処理する回数が多いというだけであるし。
で,実験的にこんなん作ってみる。


http://myrmecoleon.sytes.net/book/m_enzan.php?list=4044292019&time=4


何をしてるかというと,

  • ID(ISBNまたは本棚.orgのユーザー名)のリストを入力する
  • 入力したIDのリストに対応するもう片方のIDのリストを抽出する
  • 抽出した新しいリストから同様にもう片方のIDのリストを抽出する
  • 指定の回数だけ繰り返す

というだけ。SQLで表現すると,

SELECT {新しいID}, count(*) AS count FROM db WHERE {元のID} IN ({元のリスト}) GROUP BY {新しいID} ORDER BY count DESC

こういう感じのSQLを作成して,IDを交換させながら同様の処理を繰り返させてる。*1


たとえば,涼宮ハルヒシリーズのISBNリストを用意して,適当な回数処理させると,

  1. 1回処理すると,ハルヒシリーズを持ってる人のリスト
  2. 2回処理すると,ハルヒ好きな人へのお奨め。
  3. 3回処理すると,ハルヒと傾向の似た作品は持ってるはずなのに,ハルヒは持ってない人,つまり「ハルヒをお奨めすべき人たち」のリスト。
  4. 4回処理すると……なんでしょうねこれは。作品によってはなんとなく偏りの少ないよいリストができるのですが。ハルヒで始めると戯言シリーズが妙に上位に。ラノベ読みの傾向?
  5. 5回以降はわけわかりません。

みたいなことができる。
本棚からはじめると,

  1. 1回処理すると,持ってる本のリスト。
  2. 2回処理すると,似たような本棚のリスト(類似本棚)。
  3. 3回処理すると,似たような本棚の人が持ってる,自分の持ってない本のリスト。
  4. 4回処理すると……なんだろう。自分の持ってる本を持ってない人も含めた,似てる本棚のリスト?
  5. 5回以降はもちろんわけがわかりません。でも5回まわすとわりと面白げなリストができますね。自分の本棚の本で4回処理させたのと同じ状態。

みたいな感じ。


リクエスト処理は一応GETでも受け付けてるのですが,リストを受け付けると字数が多いのでPOSTメインで。改行で区切り。http://myrmecoleon.sytes.net/book/m_enzan.php に入って,自分の本棚.orgのユーザー名なり適当な本のISBNのリストなりをつっこんで試してみてください。
ちなみにデータベースはまだデータを更新させるスクリプトは書いてないので,この前もらった先週ぐらいのリストの状態のままです。


いまんとこ遊んでるだけなんですが。同じことを繰り返すだけで意味ありげなリストができるのは面白いなあ。

*1:実際には出力時に最初のリストのIDを抜いたり,処理上の問題で個数制限をかけたりしてるのでもうちょい複雑。