1

次のジョブ テーブルがあるとします。

`jobpost`
 - name
 - position
 - is_featured (boolean)

ユーザーの役職に一致する、特定のユーザーに提案された仕事のリストを作成したいと思いますjobpost.position(たとえば、会計士は経理の仕事を受け取ります)。

これを達成するための基本的なクエリは次のようになります。

SELECT name FROM jobpost WHERE jobpost.position IN (list of user positions) LIMIT 10

is_featured=Trueまた、取り上げられている ( ) ジョブが特別に重み付けされるようにしたいと考えています。次に、ランダムな数のジョブが選択される確率分布リストを作成する必要があります。このために、ジョブ名と確率を使用してタプルの Python リストを作成し、random.random(). たとえば、(疑似コードで)次のようになります。

x = [('job 1', 0.2), ('job 2', 0.2), ('job 3', 0.2),  ('job 4', 0.4)]
# pick three out of the list of jobs above
random.random.sample(x,  3)

これに関連して 3 つの質問があります。

  1. これは正しいアプローチのように思えますか?

  2. randomモジュール (または別のもの) を使用して、各オブジェクトが特定の確率を持つ n 個のオブジェクトを選択するにはどうすればよいですか?

  3. 注目の仕事と注目されていない仕事の加重平均を与えるという点で、次のクエリは正しいアプローチでしょうか? そうでない場合、より良い方法は何ですか?

    SELECT name, 1 * (CASE WHEN is_featured=True THEN % ELSE 1) as weighted_average FROM ...

これにより、ジョブ名と相対的な重みのタプルが得られます。

4

1 に答える 1

1

SQLAlchemyを使用し、SQLではなくPythonの構文を使用することをお勧めします。しかし、あなたの問題を解決するために、これが私が試みることです:

import random

x = [('job 1', 0.2), ('job 2', 0.2), ('job 3', 0.2), ('job 4', 0.2), ('job 5', 0.4)]

def random_choice(jobs_list, number=1):
  jobs = jobs_list[:]
  choice = random.uniform(0, 1)
  total = 0

  while total < number:
    index, job_item = random.choice(list(enumerate(jobs)))
    job, weight = job_item

    if weight > random.uniform(0, 1):
      yield job
      jobs.pop(index)
      total += 1

print list(random_choice(x, 3))

補足として、「重み」が個別のPDFに従うためには、正確に合計する必要があり1.0ます。

正直なところ、この「重み付け」は問題の適切な解決策ではないと思います。特定のジョブの個別の「重み」を作成するための適切なPDFがありません。代わりに、なぜ仕事のために別々のカテゴリーを持っていないのですか?

于 2012-06-14T04:19:32.810 に答える