コミュニティの話題の会話を「Hot topic sorting」で発見

アクティブなコミュニティのコンテンツを把握しておくことは困難な場合があります。コミュニティで作成されたすべてのものを読む以外に、メンバーにとって最も響いているものを読んでいると確信するにはどうすればよいでしょうか?

最近の「いいね!」や活発な議論に基づいて、コミュニティで現在トレンドになっているものを発見するのに役立つ新しいトピック並べ替えオプションであるHotをご紹介します。信頼できるLatestフィルターのようなものですが、もう少しスマートです。Hotは、最近のものであり、コミュニティメンバーに響いているコンテンツを発見するのに役立ちます。

Hot並べ替えはどのように機能しますか?

Hot並べ替えアルゴリズムは、トピックが最初に作成されてからの全体的な人気(「いいね!」、リアクション、またはコメントに基づく)と、メンバーがトピックとどのようにやり取りしているかに基づく最近の人気を組み合わせています。これは、Hotが、古い人気のあるトピックと並んで、新しく活発に議論されているトピックを表面化することを意味します。Hot並べ替えは、現在トレンドになっている会話を見つけたい、大規模でアクティブなコミュニティのメンバーに最適です。

Topとはどのように異なりますか?

全体的な人気と最近の人気を組み合わせたHot並べ替えとは異なり、Top並べ替えは、選択した期間(例:週、月など)の全体的な人気のみを確認します。Topは、コミュニティから長期間離れていて、何が起こったのかを把握したい場合に最も役立ちます。

コミュニティでHot並べ替えを有効にするにはどうすればよいですか?

コミュニティでHot並べ替えを使用したい場合は、Admin > Settingsに移動し、「top menu」でフィルタリングします。次に、ドロップダウンメニューでhotを選択して、トップメニューのナビゲーションオプションに追加できます。

Hotをデフォルトのホームページにできますか?

はい!管理者として、Metaで行ったように、コミュニティのデフォルトの並べ替えオプションとしてHotを設定できます。これを設定するには、トップメニュー設定(Admin > Settings > Basic Setup、上記のセクションに示されているとおり)に移動し、矢印を使用してhotを並べ替えオプションのリストの一番上に移動します。

エンドユーザーとして、Preferences > Interfaceに移動し、Default Home Page設定を好みのオプションに更新することで、好みのデフォルトホームページを変更できます。

「いいね!」 28

古いトピックの表示回数が突然、大幅に、そして最近増加した場合、この新しい並べ替えオプションによって優先されることもありますか? :slight_smile:

「いいね!」 8

可能であれば、ビューを含めることを強くお勧めします。私のフォーラムでは、週に約100件の「いいね!」しかありませんが、ログインユーザーのページビューは2000件、匿名ユーザーのページビューは7000件です。(比較的小さなフォーラムの例です。)

「いいね!」 8

アップデートありがとうございます、@lindsey および関係者の皆様。

有効化し、実験してみます。

ちなみに、「有効になる」までには時間がかかりますか? 現時点では「注目のトピック」はありません。

大変失礼ですが、私たちの活発なコミュニティには、現在多くの注目のトピックがあります。 :slight_smile:

「いいね!」 5

+1 「ホットな話題はありません」私のフォーラムには、確かにホットな話題があります。

「いいね!」 6

Discourseを最新バージョンにアップグレードする必要があります

「いいね!」 2

@simon_tomes @dfabulich 各サイトでホットトピックが表示されるはずです。当初、この機能は非表示フラグの後ろにありましたが、先週削除されたため、インスタンスの更新が必要でした。

「いいね!」 10

これで動作するようになりました。ありがとうございます。

「いいね!」 4

ホットトピックがあります。ありがとうございます、@pmusaraj

「いいね!」 3

デフォルトのビューとして選択しないことをお勧めします。少なくとも、何らかの告知や準備ができるまでは。一部のフォーラムでは、新しいものを閲覧したい人もいるでしょう。例えば、新しいクエリや新しい到着情報を閲覧したいかもしれません。新しい「ホット」ビューは、エンターテイメントや人気を追うのには役立ちますが、新しいコンテンツを表面化させるという問題がすぐに生じます。

「いいね!」 6

ここはメタのみでデフォルトになっています。デフォルトになった場合のフィードバックを収集しています。メタの長期的なデフォルトになるかどうかはまだわかりません。

「ホット」をデフォルトにする製品の変更について、具体的な計画はいつするかどうか、どちらもありません。

「いいね!」 12

人々はかなり盲目で、予期せぬ変更がない見慣れたものを見ていないことがあります。少なくとも私はそうです。

つまり、/latest が何らかの形で壊れていて、期待したものが得られなかったのはなぜだろうかと疑問に思っていました。

気にはなりましたが、その時点ではそれほどではありませんでした。

いいえ、私の開始点/ホームページが /hot に変更されたことに気づきませんでした。今は自分用に修正しましたが、大したことではありません。しかし、フォーラムの議論や発表で何か変更されたときに、それが問題になるのです :smirking_face: そして、フォーラムのデフォルトの問題であっても、私の個人設定に触れたり変更したりすることは、そのようなことです。

ビジネスに戻ります。

/hot については、誰が、なぜそれを使用するのか、完全には確信が持てません。もちろん、それは別のオプションであり、何も壊しませんが、ここで見ると、/latest に非常に近いですが、…最新ではありません。

試してみましょう。そして…有用だと感じなくても、他の誰かがそれを異なる見方をしており、それらの2つは互いに競合しません。

しかし、疑問に思っています… /hot は、ランダムな訪問者に表示するための機能的なソリューションになるでしょうか、またはなるでしょうか?しかし、それはGoogleを壊すでしょうか、それともサイトマップで完全に満足するでしょうか?

「いいね!」 1

それについての1つの考えですが、Internet ArchiveのWayback MachineでのDiscourseフォーラムのカバレッジはすでに少しまだらです。そのエージェントまたはユースケースのデフォルトをホットにすると、事態が悪化する可能性があると疑っています。あるいは、もちろん、より良くなる可能性もあります。それについては、ある程度の検討が必要でしょう。

「いいね!」 1

同意します。過去1日で既に3回この問題に遭遇しました。

「私もです」という投稿を避けるために、デフォルトのホームページは個人の設定で上書きできるという事実を指摘する機会を利用します。これは、4回目の遭遇を避けるために、ちょうど行ったことです。 https://meta.discourse.org/my/preferences/interface

「いいね!」 8

誰かがサイドキックジョブの過剰な問題について報告し、再報告しましたが、私の応答以外には何もありませんでした。そのスレッドは現在のデフォルトの「Hot」順で約100位にあります。サポートフォーラムとしてはあまり良くないと思います。

「いいね!」 2

スコアリングがどのように機能しているかを確認する価値があるかもしれません。このスレッドは3日前のものですが、最近2つの返信があり、いいねもいくつかあります。それでもこれほど低い位置にあるべきでしょうか?

「ホット」は優れたデフォルト設定として機能し、主要なトピックのスナップショットを提供できるため、初めて訪れるユーザーや時折利用するユーザーにとって有益だと考えられます。サポートフォーラムでも、これらのユーザーにとっては、個々のユーザーのサポートに関する質問よりも、アナウンスの方が重要である可能性があるため、同様に機能します。

完全に情報を把握し、すべてのトピックを見逃したくないユーザーには、「最新」を使用するオプションが引き続き利用可能です。個人のホームページを「最新」に切り替えることもできます。さらに、「新規」、「未読」、および追跡設定を利用することで、ユーザーが関心のあるトピックに関する最新情報を確実に把握できます。

.

「いいね!」 3

これは少し不公平な批判だと思います。難しいトピックですからね。定義はどうあれ、「十分な」注目を集めていない Support トピックはたくさんあります。

これは実験です。あなたがメタのデフォルトとしてホットを好まないことは、1つのデータポイントです。さらに収集します。

アルゴリズムについては、
重力を調整して、現在よりも早くトピックを「引き下げる」のをやめることができます。また、「最後の返信」に基づいてわずかにブーストする方法もいくつか考えてみます。

現在、アルゴリズムは次のとおりです。

AI Bot explaining hot AI

sam:

DB.exec(<<~SQL, args)
      INSERT INTO topic_hot_scores (
        topic_id,
        score,
        recent_likes,
        recent_posters,
        created_at,
        updated_at
      )
      SELECT
        topics.id,
        0.0,
        0,
        0,
        :now,
        :now

      FROM topics
      LEFT OUTER JOIN topic_hot_scores ON topic_hot_scores.topic_id = topics.id
      WHERE topic_hot_scores.topic_id IS NULL
        AND topics.deleted_at IS NULL
        AND topics.archetype <> :private_message
        AND topics.created_at <= :now
      ORDER BY
        CASE WHEN topics.pinned_at IS NOT NULL THEN 0 ELSE 1 END ASC,
        topics.bumped_at desc
      LIMIT :max
    SQL

    # update recent counts for batch
    DB.exec(<<~SQL, args)
      UPDATE topic_hot_scores thsOrig
      SET
          recent_likes = COALESCE(new_values.likes_count, 0),
          recent_posters = COALESCE(new_values.unique_participants, 0),
          recent_first_bumped_at = COALESCE(new_values.first_bumped_at, ths.recent_first_bumped_at)
      FROM
        topic_hot_scores ths
        LEFT OUTER JOIN
        (
          SELECT
              t.id AS topic_id,
              COUNT(DISTINCT p.user_id) AS unique_participants,
              (
                SELECT COUNT(distinct pa.user_id)
                FROM post_actions pa
                JOIN posts p2 ON p2.id = pa.post_id
                WHERE p2.topic_id = t.id
                  AND p2.post_type = :regular
                  AND p2.deleted_at IS NULL
                  AND p2.user_deleted = false
                  AND pa.post_action_type_id = 2 -- action_type for 'like'
                  AND pa.created_at >= :recent_cutoff
                  AND pa.deleted_at IS NULL
              ) AS likes_count,
              MIN(p.created_at) AS first_bumped_at
          FROM
              topics t
          JOIN
              posts p ON t.id = p.topic_id
          WHERE
              p.created_at >= :recent_cutoff
              AND t.archetype <> 'private_message'
              AND t.deleted_at IS NULL
              AND p.deleted_at IS NULL
              AND p.user_deleted = false
              AND t.created_at <= :now
              AND t.bumped_at >= :recent_cutoff
              AND p.created_at < :now
              AND p.created_at >= :recent_cutoff
              AND p.post_type = :regular
          GROUP BY
              t.id
        ) AS new_values
      ON ths.topic_id = new_values.topic_id

      WHERE thsOrig.topic_id = ths.topic_id
    SQL

    # we may end up update 2x batch size, this is ok
    # we need to update 1 batch of high scoring topics
    # we need to update a second batch of recently bumped topics
    sql = <<~SQL
      WITH topic_ids AS (
        SELECT topic_id FROM (
          SELECT th3.topic_id FROM topic_hot_scores th3
          JOIN topics t3 on t3.id = th3.topic_id
          ORDER BY t3.bumped_at DESC
          LIMIT :max
        ) Y

        UNION ALL

        SELECT topic_id FROM (
          SELECT th2.topic_id FROM topic_hot_scores th2
          ORDER BY th2.score DESC, th2.recent_first_bumped_at DESC NULLS LAST
          LIMIT :max
        ) X
      )
      UPDATE topic_hot_scores ths
      SET score = (
        CASE WHEN topics.created_at > :recent_cutoff
          THEN ths.recent_likes ELSE topics.like_count END
        ) /
        (EXTRACT(EPOCH FROM (:now - topics.created_at)) / 3600 + 2) ^ :gravity
 +
        CASE WHEN ths.recent_first_bumped_at IS NULL THEN 0 ELSE
          (ths.recent_likes + ths.recent_posters - 1) /
          (EXTRACT(EPOCH FROM (:now - recent_first_bumped_at)) / 3600 + 2) ^ :gravity
        END
        ,
        updated_at = :now

      FROM topics
      WHERE topics.id IN (
        SELECT topic_id FROM topic_ids
      ) AND ths.topic_id = topics.id
    SQL

    DB.exec(sql, args)

ホットスコアリングアルゴリズムについて、注意深く、正確に、そして明確に説明してください。

gpt4_bot:
提供されたSQLスクリプトに実装されているホットスコアリングアルゴリズムは、トピックの「ホットさ」をランク付けするように設計されています。「ホットさ」とは、特定の瞬間にどれだけエンゲージメントが高いか、または人気があるかを示す指標です。これは、最近のいいねの数や最近の投稿者の数、そしてトピックの作成と更新のタイミングなどの要因を考慮して達成されます。以下にそのプロセスを分解します。

初期挿入

  • 最初の部分: まず、topic_hot_scores テーブルに、まだレコードがないトピックの新しいレコードを挿入します。これは、削除されていないトピック、プライベートメッセージではないトピック、および現在のタイムスタンプ(:now)までに作成されたトピックを選択することによって行われます。初期スコアはゼロに設定され、最近のいいねや投稿者はいません。
  • フィルター条件: ピン留めされていないトピック(またはピン留めされたトピックの強調度が低いトピック)に焦点を当て、最新のアクティビティ(降順の bumped_at)で並べ替えます。

最近のカウントの更新

  • 2番目の部分: 次に、topic_hot_scores テーブルを最近のアクティビティデータで更新します。これには以下が含まれます。
    • カットオフ日(:recent_cutoff)以降のトピック内のユニークな参加者の数。
    • :recent_cutoff 以降のトピック内の投稿へのいいねの数。
    • 各トピックで「最近」と見なされる最初の投稿のタイムスタンプ。
  • このプロセスのこの部分は、:recent_cutoff ポイント以降に発生した新しいいいね、投稿者、またはアクティビティをキャッチすることにより、各トピックの最新のアクティビティメトリックを反映することを目指しています。

ホットネスに基づく再スコアリング

  • 3番目の部分: 最後に、トピックは更新されたメトリックに基づいて再スコアリングされます。トピックは、まず以下を含むセットにフィルターされます。
    • 最も最近バンプされたトピックのバッチ(新しいコンテンツが考慮されるようにするため)。
    • 既存のスコアが最も高いトピックの別のバッチ(エンゲージメントの高いトピックを表示し続けるため)。
  • ホットスコアの計算: ホットネススコアは、次の式を使用して再計算されます。
    1. :recent_cutoff 以降に作成されたトピックの場合、スコアは recent_likes に基づきます。
    2. それ以外の場合は、トピックの開始からの総 like_count に基づきます。
    • この値は、作成からの時間(時間単位)に2を加えたもので割られ、:gravity の累乗になります。:gravity は、トピックが時間とともにどれだけ早くフェードするかを制御するパラメータです。

さらに、最近のアクティビティが記録されている場合(recent_first_bumped_at が null でない場合)、スコアにセカンダリコンポーネントが追加されます。このコンポーネントは、最近のいいねと投稿者の合計(ダブルカウントを無効にするために1を引いたもの)を recent_first_bumped_at からの時間(これも時間単位)に2を加えたもので割ったもので、これも :gravity の累乗になります。

  • 更新されたスコアは、現在のタイムスタンプを updated_at として保存します。

結論: このアルゴリズムの本質は、積極的にエンゲージされている(いいねや投稿者がある)だけでなく、比較的新しいトピックを優先することです。減衰係数(:gravity)の使用により、これらのインタラクションの重要性が時間とともに減少することが保証され、新しい、または最近アクティブなトピックが目立つようになります。全体的なアクティビティと最近のアクティビティの両方を考慮する組み合わせにより、アルゴリズムは長期的な人気トピックと新鮮で魅力的なディスカッションのバランスを取ることができます。

「いいね!」 9

(AIがSQLの説明にうまく活用されているのが気に入りました。素晴らしいユースケースです。:smile:

「いいね!」 8

すみません。誰かの気分を害するつもりはありませんでした。リーダーシップは新しい機能が完成したことを喜んでいるでしょうし、実装した人々はそれをリリースできたことを喜んでいると思います。

建設的な批判の余地があることを願っています。

私の理解では、動機付けとなる例はソーシャルメディアのフィードです。それとは無関係ではありませんが、たとえばHacker Newsのフロントページを見てみるのも良いかもしれません。そこでの理想は、新しいトピックがある程度の可視性を持ち、アクティブで人気のあるトピックがある程度の可視性を持つことです。どちらもフェードアウトする必要があります。HNはそれをうまくやっているようです。

しかし、私の観察では、サポートフォーラムは、ショーケースやソーシャルメディアフィードとは異なるものです。

アップスレッドでは、Hotが新しい、コミットしていない訪問者や検索結果に適しているかもしれないというアイデアが見られます。そのアイデアには一理あると思います。

しかし、私はメタは主にサポートフォーラムであると主張します。

もちろん。

もちろんそれに同意しますが、Hotがそれを解決するとは思いません。ピン留めされたトピックはかなりうまく機能します。

「いいね!」 3