概要
本プロジェクトでは、大規模な書籍レビューデータを活用して、「この本が好きな人におすすめの本」を提案する推薦システムを実装しました。
推薦の仕組みには特異値分解(SVD)という数学的手法を用いています。これは、たとえば「ファンタジー小説が好き」「歴史的な要素のある本を好む」といった、本の特徴を数値として表現する手法です。具体的には、数十万人のユーザーによる数百万件の評価データから、それぞれの本が持つ300個の特徴値を自動的に抽出します。
このアプローチの利点は、「ファンタジー」「歴史」といった明示的なジャンル分けに頼らず、実際の読者の好みのパターンから本の類似性を見出せることです。たとえば「ファンタジーだけど歴史小説のような雰囲気も持つ」といった、複雑な特徴も自動的に発見できます。
システムの実装では、大量のデータの前処理にPythonを使用し、数値計算が重要なSVD計算と推薦処理には高速な数値計算が得意なFortranを採用しました。SVDのみを用いた単純な手法ながら、33万人以上のユーザーによる250万件以上のレビューデータから、興味深い推薦結果を得ることができました。後述する推薦例からは、SVDが書籍間の潜在的な関連性をある程度捉えられていることがわかります。
本記事では、この推薦システムの仕組みと実装の詳細、そして実際の推薦例をご紹介します。
データライセンスと利用条件
本プロジェクトで使用・公開しているデータは、Goodreadsの書籍レビューデータセットを加工して作成しました。元データはApache License 2.0の下で提供されています。
元データ規模:
- 書籍数:1,561,465冊
- ユーザー数:808,749人
- インタラクション総数:225,394,930件
- 形式:JSONフォーマット
本プロジェクトで公開する前処理後のデータ(TSVフォーマット)は、元データと同じくApache License 2.0の下で提供されます。この加工データには以下の変更が加えられています:
- 英語の書籍のみを抽出
- 評価値が存在するレビューのみを選択
- ユーザーあたりの最大レビュー数を制限
前処理後のデータ規模:
- 書籍数:5,921冊
- ユーザー数:330,661人
- レビュー総数:2,529,572件
本データを使用する際は、Apache License 2.0の条件に従ってください。
システムの実装詳細
1. データ読み込み(data_load_module.f90)
- レビューデータから一意な書籍IDリストの作成
- 書籍タイトルの読み込み
- ユーザーIDの連番への変換
- スパース行列形式でのデータ構造化
2. SVD計算(perform_svd_module.f90)
NAGライブラリのスパース行列SVDルーチン(f02wgf)を使用して、レビュー行列を3つの行列に分解:
- U行列:ユーザーの特徴(330,661 × 300)
- Σ行列:特異値(対角行列、300個の値)
- VT行列:書籍の特徴(300 × 5,921)
計算時間:
- 初回実行:約106秒
- 2回目以降:約24秒
特異値の例(上位5個):
151.73, 151.93, 152.16, 152.30, 152.60
3. 推薦生成(recommendation_module.f90)
入力された書籍IDに対して、以下の手順で類似書籍を推薦: 1. 書籍のインデックス特定 2. 特徴ベクトルの取得 3. 類似度計算 4. 上位10件の選出
推薦結果例
入力書籍1
項目 | 内容 |
---|---|
タイトル | The Fellowship of the Ring |
BookID | 34 |
レビュー数 | 1,636 |
平均評価 | 4.18 |
推薦書籍(上位5件)
順位 | タイトル | レビュー数 | 平均評価 | 類似度 |
---|---|---|---|---|
1 | The Two Towers | 690 | 4.37 | 1.226 |
2 | The Lord of the Rings (Complete) | 980 | 4.56 | 0.285 |
3 | The Golden Compass | 1,814 | 3.91 | 0.248 |
4 | The Stranger | 1,768 | 3.79 | 0.220 |
5 | The Silmarillion | 538 | 3.92 | 0.215 |
入力書籍2
項目 | 内容 |
---|---|
タイトル | Steve Jobs |
BookID | 11084145 |
レビュー数 | 1,748 |
平均評価 | 4.3 |
推薦書籍(上位5件)
順位 | タイトル | レビュー数 | 平均評価 | 類似度 |
---|---|---|---|---|
1 | The Power of Habit | 1,255 | 4.03 | 0.339 |
2 | How to Win Friends and Influence People | 895 | 4.09 | 0.239 |
3 | The Tipping Point | 1,210 | 3.76 | 0.225 |
4 | Freakonomics | 1,392 | 3.74 | 0.197 |
5 | Lean In: Women, Work, and the Will to Lead | 1,561 | 4.02 | 0.175 |
推薦結果の分析
推薦結果を見ると、SVDが書籍間の意味的な関連性を適切に捉えていることがわかります:
- ファンタジー作品(The Fellowship of the Ring)の場合:
- 同シリーズの続編が高い類似度で推薦
- 他の代表的なファンタジー作品も推薦候補として選出
- ビジネス書(Steve Jobs)の場合:
- リーダーシップや自己啓発に関する書籍が上位に
- ビジネス思考や意思決定に関する書籍も関連書籍として推薦
Fortranの活用
本プロジェクトでは、以下の点でFortranの特徴を活かしています:
- 大規模行列計算の効率的な処理
- 330,661 × 5,921の疎行列に対するSVD計算
- NAGライブラリのスパース行列ルーチンの活用
- メモリ効率の良い実装
- スパース行列表現の採用
- 必要最小限のメモリ使用
コードとデータの入手
ソースコード
Fortranによる実装の完全なソースコードはsvd.zipでご覧いただけます。
処理済みデータ
前処理済みの入力データも以下で公開しています:
- - books.tsv:書籍の基本情報(ID、タイトル、レビュー数、平均評価
- - reviews.tsv:ユーザー評価データ(ユーザーID、書籍ID、評価値)