← ブックマーカー図鑑トップ
SPECIFICATION

仕組みと仕様

プロフィールページがどう作られているか、その考え方と使っているスクリプトを公開します。

このサイトについて

ブックマーカー図鑑は、はてなブックマークの公開情報だけをもとに、 各ユーザーの傾向を「図鑑エントリー」としてまとめた非公式の分析です。 ページは人手ではなく、以下の決まった手順(パイプライン)で機械的に生成しています。

プロフィールができるまで

  1. 取得 fetch_bookmarks.rb → CSV
    公開ブックマーク(日時・タイトル・URL・コメント・タグ・スター)を取得します。
  2. 正規化 normalize.py → JSONL
    列の揺れや日本語ヘッダを吸収し、URLを除いたコメント本文などを整えます。ここでは評価・分類はしません。
  3. 形態素解析 tokenize.py(SudachiPy)→ tokenized JSONL
    コメントを単語に分割し、はてなユーザーへの言及(idコール等)も検出します。
  4. 集計 aggregate.py → aggregate.json
    巨大な解析結果を、機械で確定できる定量データ(computed)と、 LLMが判断するための材料(materials)に圧縮します。 この段階でも攻撃性などの断定はせず、候補の集計に留めます。
  5. 生成 LLM(ChatGPT)→ analyzed.json
    材料と実際のコメントを読み、テーマ分類・攻撃性の判断・紹介文を書きます。 出力は決まったスキーマ(profile.schema.json)に従います。
  6. 描画 render.rb → profiles/<id>.html
    できあがったデータをHTMLの図鑑カードに整形します。あなたが見ているこのページも同じ仕組みです。
  7. 目視で確認 人による最終チェック
    生成されたカードを人が確認し、明らかな誤りや不適切な表現がないかを見ます。問題があれば修正・非公開にします。

設計上の約束

LLMは何を見てどう判断しているのか

LLMには生のデータではなく、機械で集計・整理した材料aggregate.json)を渡します。 数値の集計はすでに済んでいるので、LLMの仕事は「材料が本当にその通りか」を実際のコメントで確かめ、言葉にすることです。

テーマ分類 ― 候補を実例で確かめる

まず機械が、テーマ辞書(政治/経済/ジェンダー/メディア/医療… の標準12分類)のキーワードを、 各ブックマークのタイトル・コメント・タグと突き合わせ、テーマごとの件数つき候補を作ります。 ただしキーワード一致は素朴なので、LLMは添えられた実例(例文)を見て次の点を補正します。

こうして確かめたうえで、上位8〜12テーマを「関心の地図」として提示します。件数は機械カウントを使うので、印象で盛ることはありません。

攻撃性 ― 数ではなく文脈で判断する

機械は攻撃語辞書(重み1〜8)で「攻撃語の候補」を検出し、各候補に実際のコメント例を添えて渡します。 例文はスターの高い順だけでなく、星が付かなかった生の発言も混ぜてあります(本当に危険な攻撃ほど支持されにくいため)。 LLMはこの例文を読み、その語が本当に攻撃かを次の観点で判断します。

公開している仕様・スクリプト

出力の仕様書は公開しています。処理に使っているスクリプトと辞書の構成は以下の通りです。

スクリプト・辞書一式をダウンロード(zip) 前処理スクリプト・攻撃語/テーマ辞書・ストップワードをまとめた一括ダウンロード。展開すると scripts/ dict/ stopwords/ の構成で取り出せます。

当初は profile_instruction.md だけで、LLMに生データを渡して解析のすべてを任せていました。 しかしこの方式では、攻撃語やテーマ語といった単語の検出精度が十分ではありませんでした。 そこで、形態素解析や集計などの機械的な前処理をあらかじめ行い、その結果をLLMに渡して判断してもらう方式へ改めました。 集計版の指示書(profile_instruction_aggregate.md)は、この新しい流れのための補足で、ベースの profile_instruction.md と一緒にLLMへ渡します(置き換えではありません)。