10

stackoverflow / digg / redditに似たレコメンデーションシステムでウェブサイトを実装するにはどうすればよいですか?つまり、ユーザーはコンテンツを送信し、Webサイトは、アイテムの人気度に応じて、ある種の「ホットネス」を計算する必要があります。フローは次のとおりです。

  • ユーザーがコンテンツを送信する
  • 他のユーザーがコンテンツを表示して投票します(ユーザーの90%がコンテンツのみを表示し、10%がコンテンツに積極的に賛成または反対票を投じると仮定します)
  • 新しいコンテンツは継続的に送信されます

提出されたアイテムの「ホットネス」を、できればリアルタイムで計算するアルゴリズムを実装するにはどうすればよいですか?ベストプラクティスやデザインパターンはありますか?

アルゴリズムは次のことを考慮していると思います。

  • アイテムが提出されたとき
  • 各投票が行われたとき
  • アイテムが表示されたとき

たとえば、一定の票のトリクルを取得するアイテムは常にいくらか「ホット」なままですが、最初に送信されたときに大量の投票を受け取ったアイテムは「ホットネス」リストの一番上にジャンプしますが、その後は投票として落ちます入ってくるのをやめなさい。

(MySQL + PHPを使用していますが、一般的なデザインパターンに興味があります)。

4

5 に答える 5

6

Reddit アルゴリズムに似たものを使用できます。その基本原理は、投稿された時間とスコアに基づいて投稿の値を計算することです。Reddit アルゴリズムの優れた点は、投稿のスコアが変化したときにのみ値を再計算する必要があることです。フロント ページを表示したい場合は、そのスコアに基づいてデータベースから上位 n 件の投稿を取得するだけです。時間の経過とともにスコアは自然に増加するため、最初のページからアイテムを削除するために特別な処理を行う必要はありません。

于 2008-09-16T13:05:05.407 に答える
4

私自身のサイトでは、単調に増加するシリーズから各エントリに一意の整数を割り当てます (新しい投稿ほど数値が高くなります)。賛成票を投じるたびに数値が 1 ずつ増え、反対票を投じるたびに数値が 1 ずつ減ります (もちろん、これらの値は微調整できます)。次に、番号で並べ替えて、「最もホットな」エントリを表示します。

于 2008-09-19T17:04:36.047 に答える
1

Paul Grahamは、HackerNewsの開発で学んだことについてエッセイを書きました。アルゴリズム自体よりも、彼が引き付け/作成しようとしていた人々/相互作用に重点が置かれていますが、それでも読む価値は十分にあります。たとえば、彼は、ストーリーがトップページの下部(HN)からバブルアップするときと、トップページの上部(Digg)に展開するときのさまざまな結果について説明します。(私がHNについて見たものからは、ストーリーがそこにも爆発しているように見えます)。

彼はこの引用を提供します:

パフォーマンスの鍵は、特別な場合の大隊ではなく、優雅さです。

これは、HNフロントページを生成するためのアルゴリズムとされているものに照らして:

(p-1)/(t + 2)^ 1.5

どこ

p=記事のポイントと

t=記事の提出からの時間

良い出発点かもしれません。

于 2010-04-11T14:56:50.657 に答える
1

私はソーシャル ブックマーク サイトSites Favoritosを開発し、複雑なアルゴリズムを使用しました。

  1. まず、投票は有限であり、ユーザーは限られた数の投票しかできず、投票数はユーザーポイントに依存します。ポイントを獲得するには、各ユーザーは肯定的な投票を得るリンクを追加する必要があります。
  2. 次に、ユーザーは各リンクに対して -3、-2、-1、1、2、または 3 票を投票できます。投票数が限られているため、各ユーザーは気に入ったリンクにのみ投票します。
  3. ユーザーが同じユーザーのリンクのみに投票するのを防ぎ、サポート グループを作成すると、各投票がリンクに追加するポイントは、合計投票と投票されたリンクの所有者のリンクへの投票の比率によって決まります。いつも同じユーザーのリンクに投票すると、投票の価値が失われます。
  4. 投票は時間の経過とともに価値を失います。
  5. ポイントを持っていないユーザー (新規ユーザー) からの新しいリンクは、最初は 0 ポイントになります。古いユーザーからの新しいリンクには、ポイントに応じてポイントが付きます。+3 から -infinite の範囲。否定的な点を持つユーザーからのリンクには否定的な出発点があり、肯定的な点を持つユーザーからのリンクには肯定的な出発点があります。

リンクが投票されると、ユーザーはランダムなポイントを獲得します。プラス票はプラス点を与え、マイナス票はマイナス点を与えます。

于 2008-09-19T17:25:27.960 に答える
1

次のように、ビデオ アグリゲーター用に Reddit のランキング アルゴリズムの SQL バージョンを実装しました。

SELECT id, title
FROM videos
ORDER BY 
    LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total)   
    + (UNIX_TIMESTAMP(created_at) / 300000) DESC
LIMIT 50

*cached_votes_total* は、新しい投票が行われるたびにトリガーによって更新されます。現在のサイトでは十分に高速に実行されますが、ランキング値の列を追加して、*cached_votes_total* 列と同じトリガーで更新する予定です。その最適化の後、ほとんどすべてのサイズのサイトで十分に高速になるはずです.

于 2012-10-31T13:46:19.260 に答える