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)

我有三个与此相关的问题:

  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并使用 Python 的语法,而不是 SQL。但要解决您的问题,我会尝试以下方法:

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 回答