アルゴリズムの開示
ふつうのニュースアプリでは、何がどんな理由で表示されているかは公開されません。 OwnNewsは「推薦の主導権をユーザーに」を掲げる研究プロジェクトとして、 使っているアルゴリズムを実装値そのままに公開します。
全体像
サーバー側の仕事は「全員に共通の記事データを準備して配る」ところまで。 あなたの関心の学習と推薦の計算は、すべて端末の中で行われます。 アカウント保管庫に同期されるのは端末間で引き継ぐためのデータで、本人以外は読めません。
1. 記事の収集と解析
- 記事はニュース検索サイト CEEK.JP NEWS のRSSから 1日5回収集します(見出し・短い抜粋・リンクのみ。本文は収集しません)。
- 各記事は多言語埋め込みモデル BGE-M3 で1024次元のベクトルに変換されます。 意味が近い記事ほど、ベクトルの向きが近くなります。
- AI(gpt-oss-120b等のオープンな大規模言語モデル)が各記事に「栄養素」5指標(事実・背景・視点・感情・速報、各0〜100)と中分類・キーワードを付与します。
- 直近800記事をひとつの「記事パック」にまとめ、 全ユーザー共通のデータとして配信します。パックには記事ごとの 匿名の閲覧数・リアクション集計も焼き込まれます。
- 記事データベースに保持するのは直近30日分のみです。 それより古い記事の見出し・解析結果は研究用アーカイブに移し、 データベースからは削除します(記事の原本は各報道機関・CEEK.JP NEWSにあります)。
2. あなたの関心の学習(端末内)
あなたの関心は、記事と同じ1024次元の「関心ベクトル」1本で表現されます。 記事を読むたびに、指数移動平均で少しずつ更新されます:
v ← normalize( (1−α)·v + α·e ) … 読んだ記事の方向へ α だけ近づく
v ← normalize( v − 0.15·e ) … 「興味なし」の記事から遠ざかる
v = あなたの関心ベクトル / e = 記事のベクトル / α = 学習率学習率αはどれだけ真剣に読んだかで決まります。 開いただけ(5秒未満)では学習しません:
| 行動 | 学習率 α |
|---|---|
| 開いてすぐ閉じた(5秒未満) | 0(学習しない) |
| ざっと見た(5〜15秒) | 0.06 |
| 読んだ(15〜40秒) | 0.12 |
| じっくり読んだ(40〜120秒) | 0.20 |
| 熟読(120秒以上) | 0.25 |
| +最後までスクロール | +0.05(上限0.3) |
| AIで深掘り(外部AIに質問)した | 0.25 |
| ストックした | 0.15 |
| 興味なし(×・左スワイプ) | −0.15(遠ざかる) |
この計算はすべてあなたのブラウザの中で行われます。 サーバーは学習済みベクトルを端末間同期のために保存するだけで、サーバー側で推薦を計算することはありません。
3. フィードの組み立て
- 全記事と関心ベクトルのコサイン類似度を端末内で計算します。
- あなたのバブル: 類似度が 0.65以上の記事を類似度順に最大15件。 類似度0.88以上の記事同士は「同じ話題」として1枚のカードにまとめます(複数紙の報道の集約)。
- バブルの外(いろいろなニュース): 類似度0.65未満の記事を、「世間の窓」スコア = 閲覧数 + リアクション数×3の高い順に並べ、さらに全ジャンルから1件ずつ交互に取り出して偏りをなくします(あなた以外の人がよく読み・反応している記事が、ジャンル均等に並ぶ)。
- 「視野の広さ」スライダー(0.1刻み11段階)は、バブルの外の初期表示量を変えます。 どこまでも下にスクロールすれば、設定に関わらず全記事に辿り着けます。
- 閲覧済み・「興味なし」にした記事はフィードから消えます。
- ウォッチタグ(📌): 記事のキーワードをタップして購読すると、 そのタグを含む記事がトップの専用枠に必ず表示されます(もう一度タップで解除)。 「確実に見たい」の明示的な表明であり、関心ベクトルの学習には使いません。 購読・解除の履歴は「関心の変遷」としてあなたのアカウントに記録されます(本人のみ閲覧可)。
- キーワード検索: サイドバーの検索は、端末にキャッシュ済みの 記事パックをその場で全文一致検索します(検索語はサーバーに送信されません)。 検索した回数だけは匿名の利用統計として記録します(検索語そのものは送信・記録されません)。 検索したキーワードはそのままウォッチタグとして購読できます。
- 話題のキーワード: TF-IDFと同じ発想で、リフト(直近24時間の出現率 ÷ それ以前の平常時の出現率)× 注目度(その語を含む記事の閲覧数・リアクション、対数)で選びます。 訃報や株価のように毎日一定量出る語はリフト≒1倍になるため、2倍未満は除外します (「今日特有」かつ「みんなが読んでいる」言葉だけが残る)。 ランキングではないため、表示順は毎回シャッフルされます。この計算も端末内で行います。
- トピック別ビュー: ジャンルごとのセクション表示。 偏食予防のため、セクションの並び順は訪問ごとにシャッフルされ、 各セクションの1枠は注目順の上位圏外からランダムに選ばれます(🎲印のセレンディピティ枠)。
4. あえて推薦に使っていないもの
- リアクション(賛成・反対など)は推薦に使いません。反対した記事を減らすと「同意できる記事だけが並ぶ」意見のバブルを作ってしまうためです。 リアクションは集計の可視化にだけ使います。
- 「もっと知る」でX・はてなブックマークを開いた記録は推薦学習に使いません。どの記事でSNSの反応を見に行ったか(開いた事実)は端末とアカウントに記録されますが、 AIで深掘りしたとき(deep_dive)とは別扱いで、関心ベクトルの学習には反映しません。 運営が観測するのは「もっと知る」を使った匿名の回数だけです。
- 広告・スポンサー枠・「おすすめの押し付け」はありません。表示順を金銭で変える仕組みは存在しません。
5. 情報的健康の指標
- 多様性スコア: 閲覧履歴のジャンル分布の シャノンエントロピーを0〜100に正規化したもの。全ジャンルを均等に読むと100、 1ジャンルだけだと0に近づきます。
- 栄養バランス: 読んだ記事の栄養素5指標の平均。 「事実ばかりで視点が足りない」といった偏りが見えます。
- 意見バランス: 自分が押した賛成と反対の比率。 賛成一色なら「同意できる記事だけを読んでいる」サインです。
6. データの置き場所
| データ | 場所 | 誰が見られるか |
|---|---|---|
| 記事パック(全記事・共通) | CDN配信+端末キャッシュ | 全員(個人情報なし) |
| 関心ベクトル・閲覧履歴・設定 | 端末内+アカウント同期 | 本人のみ(アクセス制御) |
| リアクション | アカウント同期 | 本人+匿名の件数集計のみ公開 |
| 推薦の計算 | あなたのブラウザ内 | —(サーバーでは計算しない) |
運営(研究)が観測するのは、利用者数・閲覧状況・フィルタ強度の分布・バブルの形といった研究のための集計です。詳しくはこのサービスについて をご覧ください。
このページの数値はすべて実装と同じ値です。アルゴリズムを変更した場合はこのページも更新します。 ソースコードは公開リポジトリで確認できます。