はじめに
大学時代、私は図書館で367冊の本を借りました。
当時は「週に4冊読む」を目標にしていたので、それなりの冊数です。
すると、たまに聞かれます。
どんな本を読むんですか?
しかし、367冊を順番に紹介し始めたら相手が帰ってしまいます。
そこで考えました。
「今まで読んできた本を、一冊で表せないだろうか?」
この記事では、本のタイトルの埋め込み(Embedding)を使って、読書履歴全体を代表する一冊を探してみます。
アイデアはこれです。
- 本のタイトルを埋め込みに変換する
- 読んだ本の埋め込みの平均を求める
- その平均に最も近い本を探す
- それを「自分を表す一冊」とする
埋め込みモデルにはembeddinggemma-300mを使用しました。
自分を表す一冊とは何か
ここでいう「自分を表す一冊」とは、
読んだ本全体に一番近い本
です。
例えば、
- AIの本を50冊
- 法律の本を50冊
読んでいたとします。
すると、その人を表す一冊は
AIと著作権
のような本になりそうです。
つまり、
「読んだ本を全部混ぜたらできそうな本」
とも言えそうですね。
それをどうやって求める?
そこで使うのが埋め込み(Embedding)です。
今回使用するのはテキスト埋め込み(Text Embedding)です。テキストを数値ベクトルに変換し、意味的な近さを計算できるようにします。
例えば、
Python実践入門
↓
[0.12, -0.54, 0.87, ...]
のようなイメージです。
重要なのは、
似たテキストほど近いベクトルになる
という性質です。
本のタイトルを埋め込みに変換すれば、本同士の距離や類似度を計算できるようになります。
さらに、
読んだ本の埋め込みを平均すると、読書履歴全体の特徴を表すベクトルが得られます。
そして、
その平均ベクトルに最も近い本を探せば、「自分を表す一冊」が見つかる
というわけです。
埋め込みを可視化して確かめる
本当に埋め込みに意味があるのでしょうか。
実際に可視化して確認してみます。
私は5367冊の本のタイトルを埋め込みに変換しました。
さらにクラスタリングし、各クラスタのラベルはLLMに推定してもらいました。
すると、次のような「書名地図」ができました。
ここからインタラクティブに見れます。
→ https://danielokada.github.io/book-title-map/
例えば、点にホバーしたら、本のタイトルが見れます。
似た本同士が近くに集まり、
- データサイエンスと機械学習
- 家庭料理と健康レシピ
- 語学学習と文化
といったまとまりが自然に現れています。
これから、似た書名ほど近い埋め込みになるということが分かりますね。
書名地図の作り方
今回の可視化に使用した技術は以下の通りです。
データ
- OpenBDからランダムに取得した5000冊
- 自分の読書履歴367冊
合計5367冊
-
埋め込み
embeddinggemma-300m- 本のタイトルをベクトル化
-
次元削減
UMAP- 高次元の埋め込みを2次元に圧縮
-
クラスタリング
HDBSCAN- 似た本同士を自動的にグループ化
-
クラスタのラベル付け
- LLMを利用
- クラスタ内のタイトル一覧を渡して、内容を表すラベルを推定
クラスタのラベル付け
各クラスタに含まれるタイトルをLLMへ渡し、
このクラスタの本に共通するテーマは何?
と聞いてラベルを付けました。
私の読書履歴を書名地図で見る
次に、自分が読んだ本を地図上で見てみます。
デカひし形の点が私が読んだ本です。
- データサイエンスと機械学習
- プログラミングとコンピュータ技術
のエリアに大量に集中しています。
コンピュータ関係の本ばかり読んでいるオタクということが地図で可視化されました。
しかし、
- ビジネスと社会の変革
のエリアにも結構あります。ここには経営・経済系の本が集めっています。
実はこれが後で効いてきます。
読書履歴の中心に最も近い本を探す
やることは単純です。
まず、367冊の埋め込みベクトルの平均を求めます。
center = embeddings.mean(axis=0)
このベクトルを、
読書人格ベクトル
と呼ぶことにします。
次に、この読書人格ベクトルと5367冊すべての本とのコサイン類似度を計算します。
そして最も近かった本を取り出します。
その本こそが、
読んだ本全体を最もよく表す一冊
です。
結果
自分を本で表すと
結果はこちら。
『入門ゲーム理論と情報の経済学』
でした。
かなり納得感があります。
私は大学時代、
情報・経営システム工学
という変な学科に所属していました。
そのため、情報系だけでなく、「経営・経済」系の本もたくさん読んでいます。
書名地図で見えていた
コンピュータ + 経済
という特徴が、結果に現れたような気がします。
今後自己紹介するときは、
私を本で例えると『入門ゲーム理論と情報の経済学』です
と言おうと思います。
真逆の本も探してみる
せっかくなので逆もやってみました。
つまり、
読書人格ベクトルから最も遠い本
を探します。
結果はこちら。
『この部室は帰宅しない部が占拠しました。』
でした。
さらにランキングを見ると、
『女子寮の管理人をすることになった俺、住んでる女子のレベルがとにかく高すぎる件。』
なども上位にいました。
タイトルのクセが強い。
ただし、こちらはあまり意味がないかもしれません。
というのも、
タイトルの特徴が極端な本は、埋め込み空間でも特殊な位置に配置されやすいからです。
つまり、
『女子寮の管理人をすることになった俺〜』
は私だけでなく、多くの人の読書履歴から遠くなりやすいです。
「真逆の本」はネタとしては面白いですが、「自分を表す本」ほどの意味はなさそうです。
この方法の限界
今回使ったのはタイトルだけです。
当然ながら問題もあります。
例えば、
『レンブラントの身震い』
というタイトルの本があります。実は、これはAIに関する本です。
人間なら内容を読めば分かりますが、タイトルだけを見る埋め込みモデルはそうはいきません。
本来ならAI関連の本の近くに配置されるべきなのに、
タイトルだけの情報では全く違う場所に配置されてしまいます。
つまり、
タイトル ≠ 内容
な本には弱いということです。
より正確にやるなら、
- タイトル
- 要約
- 目次
- 紹介文
なども埋め込みに使うべきでしょう。
まとめ
367冊の読書履歴から、
「自分を表す一冊」
を探してみました。
方法は、
- 本のタイトルを埋め込みに変換する
- 読んだ本の埋め込みを平均する
- 平均に最も近い本を探す
というシンプルなものです。
結果、
私を本で例えると
『入門ゲーム理論と情報の経済学』
らしいことが分かりました。
思いつきで始めた割には、かなり納得感のある結果になりました。
もし読書履歴のデータを持っているなら、ぜひ皆さんも「自分を表す一冊」を探してみてください。


