11

ページのビュー数とコメント数に基づいて、Web サイトのサイトマップ<priority>に適切なフィールドを決定できるアルゴリズムが必要です。

サイトマップに慣れていない方のために説明すると、優先度フィールドは、同じ Web サイトの他のページと比較したページの重要性を示すために使用されます。0 から 1 までの 10 進数でなければなりません。

viewCountアルゴリズムは と の 2 つのパラメータを受け入れcommentCount、優先度の値を返します。例えば:

GetPriority(100000, 100000); // Damn, a lot of views/comments! The returned value will be very close to 1, for example 0.995
GetPriority(3, 2); // Ok not many users are interested in this page, so for example it will return 0.082
4

6 に答える 6

12

SQLクエリでこれを行うと述べたので、その中でサンプルを提供します。

テーブル/ビューがある場合Pages、このようなもの

Pages
-----
page_id:int
views:int  - indexed
comments:int - indexed

それからあなたは書くことによってそれらを注文することができます

SELECT * FROM Pages
ORDER BY 
    (0.3+LOG10(10+views)/LOG10(10+(SELECT MAX(views) FROM Pages))) +       
    (0.7+LOG10(10+comments)/LOG10(10+(SELECT MAX(comments) FROM Pages)))

私は意図的にビューとコメントの重み付けを不均等にしています。ビュー/コメントで均等な重み付けを維持することで発生する可能性がある問題は、ランキングが自己達成的な予言になることです。ページがリストの一番上に返されるため、より頻繁にアクセスされ、より多くのポイントが得られます。リストの最後に表示され、より頻繁にアクセスされ、より多くのポイントが得られます....

上記の式は、これまでの統計に基づいてランキングを表示します。そのため、先週の閲覧数/コメント数が、昨年に蓄積された別の記事と同じ数の記事には、同じ優先度が与えられます。日付の範囲を指定するたびに数式を繰り返し、アクティビティの多いページを優先することは理にかなっている場合があります。

  0.3*(score for views/comments today) - live data
  0.3*(score for views/comments in the last week)
  0.25*(score for views/comments in the last month)
  0.15*(score for all views/comments, all time)

これにより、「ホット」なページには、最近あまりアクションが見られない同様のスコアのページよりも高い優先度が与えられます。今日のスコア以外のすべての値は、スケジュールされたストアド プロシージャによってテーブルに保持できるため、データベースは多くのコメント/統計情報を集計する必要がありません。今日の統計のみが「ライブ」で計算されます。さらに一歩進んで、ランク付け式自体を計算し、毎日実行されるストアド プロシージャによって履歴データ用に保存することができます。

編集: 0.1 から 1.0 までの厳密な範囲を取得するには、次のような数式をモチーフにします。しかし、私は強調します - これはオーバーヘッドを追加するだけで不要です - 優先度の絶対値は重要ではありません - 他の URL に対する相対的な値だけです。検索エンジンはこれらを使用して、URL A は URL B よりも重要/関連性が高いかという質問に答えます。これは、絶対値ではなく、優先順位 (どれが最も大きいか) を比較することによって行われます。

// 非正規化 - x はページ ID un(x) = 0.3*log(views(x)+10)/log(10+maxViews()) + 0.7*log(comments(x)+10)/log(10 +maxComments()) // 元の式 (現在は疑似コード)

最大値は 1.0、最小値は 1.0 から始まり、ビュー/コメントが作成されるにつれて下方に移動します。

un(0) を最小値として定義します (上記の式では、ビュー (x) とコメント (x) は両方とも 0 です)。

0.1 から 1.0 までの正規化された数式を取得するには、ページの正規化された優先度である n(x) を計算します。x

                  (1.0-un(x)) * (un(0)-0.1)
  n(x) = un(x) -  -------------------------    when un(0) != 1.0
                          1.0-un(0)

       = 0.1 otherwise.
于 2010-06-01T23:06:31.440 に答える
4

ここで探しているのはアルゴリズムではなく、式です。

残念ながら、ご希望の詳細が具体的に指定されていないため、公式を提供することはできません。

代わりに、一緒に問題を解決してみましょう。

viewCount と commentCount の 2 つのパラメーターを受け取ります。優先度という単一の数値を返したいとします。ここまでは順調ですね。

Priority の範囲は 0 から 1 の間である必要がありますが、これはそれほど重要ではありません。気に入った式を思いついたが、結果が 0 から N の間の値になった場合、結果を N で割ればよいので、この制約はあまり関係ありません。

ここで、最初に決定する必要があるのは、コメントとビューの相対的な重みです。

ページ A に 100 件のコメントと 10 件のビューがあり、ページ B に 10 件のコメントと 100 件のビューがある場合、どちらを優先する必要がありますか? それとも、同じ優先順位にする必要がありますか?優先度の定義に何が正しいかを決定する必要があります。

たとえば、コメントはビューよりも 5 倍価値があると判断した場合、次のような式から始めることができます。

 Priority = 5 * Comments + Views

明らかに、これは次のように一般化できます。

Priority = A * Comments + B * Views

ここで、A と B は相対的な重みです。

しかし、次のように、重みを線形ではなく指数関数にしたい場合があります。

 Priority = Comment ^ A + Views ^ B

これにより、以前の式とは非常に異なる曲線が得られます。

同様に、

 Priority = Comment ^ A * Views ^ B

重みが等しい場合、コメント 20 件、閲覧数 20 のページの方が、コメント 1 件、閲覧数 40 のページよりも価値が高くなります。

要約すると、次のようになります。

ビューとコメントのサンプル値を含むスプレッドシートを作成し、希望する分布を持つ式が得られるまで、さまざまな式をいじる必要があります。

あなたが物事をどのように評価したいのかわからないため、私たちはあなたのためにそれを行うことはできません.

于 2010-06-04T22:07:45.637 に答える
4

Priority = W1 * views / maxViewsOfAllArticles + W2 * comments / maxCommentsOfAllArticles W1+W2=1 の場合

私見ですが、ただ使用してください0.5*log_10(10+views)/log_10(10+maxViews) + 0.5*log_10(10+comments)/log_10(10+maxComments)

于 2010-05-31T17:07:32.397 に答える
2

これが尋ねられてからしばらく経っていることは知っていますが、同様の問題に遭遇し、別の解決策がありました.

何かをランク付けする方法が必要で、そのランキングを実行するために複数の要因を使用している場合、多基準決定分析と呼ばれるものを実行しています。(MCDA)。参照: http://en.wikipedia.org/wiki/Multi-criteria_decision_analysis

これを処理するにはいくつかの方法があります。あなたの場合、基準には異なる「単位」があります。1 つはコメント単位で、もう 1 つはビュー単位です。さらに、思いついたビジネス ルールに基づいて、これらの基準に異なる重みを付けたいと思うかもしれません。

その場合、最適なソリューションは加重製品モデルと呼ばれるものです。参照: http://en.wikipedia.org/wiki/Weighted_product_model

要点は、各基準をパーセンテージに変換し (以前に提案したように)、そのパーセンテージを X 乗することです。ここで、X は 0 から 1 の間の数値です。この数値は、あなたの体重。合計重量は 1 になるはずです。

最後に、それぞれの結果を掛け合わせて順位を出します。ランクが 1 より大きい場合、分子のページは分母のページよりもランクが高くなります。

次のようにして、各ページを他のすべてのページと比較します。

  • p1C = ページ 1 コメント
  • p1V = ページ 1 ビュー
  • p2C = ページ 2 のコメント
  • p2V = ページ 2 ビュー
  • wC = コメントの重み
  • wV = ビュー ウェイト

ランク = (p1C/p2C)^(wC) * (p1V/p2V)^(wV)

最終結果は、ランクに従ってソートされたページのリストです。

IComparable を実装するオブジェクトのコレクションに対して並べ替えを実行することで、これを C# で実装しました。

于 2011-01-20T21:25:10.293 に答える
1

何人かの投稿者が概念的な明確化なしに本質的に主張しているのは、線形回帰を使用して Web ページ ビューとコメント数の重み付け関数を決定し、優先順位を確立することです。

この手法は、問題に対して非常に簡単に実装できます。基本的な概念は、線形回帰モデルに関するウィキペディアの記事で詳しく説明されています。

問題に適用する方法の簡単な要約は次のとおりです。

  1. サイトのすべての Web ページのビュー数とコメント数のデータに最適な線のパラメーターを決定します。つまり、線形回帰を使用します。
  2. ライン パラメーターを使用して、ビュー/カウント パラメーターの優先度関数を導き出します。

基本的な線形回帰のコード例は、基本的な数式からゼロから実装したくない場合に追跡するのは難しくありません (Web やNumerical Recipesなどを使用してください)。また、Matlab、R などの一般的な数学ソフトウェア パッケージには、線形回帰関数が付属しています。

于 2010-06-06T03:14:45.957 に答える
0

最も素朴なアプローチは次のとおりです。

ページv[i]のビュー、ページic[i]コメント数、iページ i の相対的なビューの重みを次のように定義します。

r_v(i) = v[i]/(sum_j v[j])

は全ページsum_j v[j]の合計です。v[.]同様に、ページ i の相対的なコメントの重みを次のように定義します。

r_c(i) = c[i]/(sum_j c[j]).

ここで、コメントに対するビューの重要性を示す定数パラメーター p: 0 < p < 1 が必要です。p = 0 はコメントのみが重要であることを意味し、p = 1 はビューのみが重要であることを意味し、p = 0.5 は等しい重みを与えます。

次に、優先順位を次のように設定します

p*r_v(i) + (1-p)*r_c(i)

これは単純すぎるかもしれませんが、おそらく最良の出発点です。

于 2010-06-04T18:48:17.680 に答える