3

我需要实现类似于http://venturocket.com的技能匹配功能- 候选人输入技能列表并对每个技能的熟练程度进行评分。然后,您可以通过再次输入您正在寻找的一些技能和专业水平进行搜索。结果是根据他们的技能与您的搜索匹配程度排序的候选人列表。

例子:

考生 1 进入技能 Java(熟练度 90),考生 2 进入 Java(50)。当我搜索 Java (60) 时,候选 2 更接近。

这也适用于多种技能。

我正在寻找的是可以帮助我实现这一目标的技术或算法的指针。我目前的方法是在数据库中进行范围查询(例如查找 45 到 75 之间的 Java 技能),然后在客户端上进行排序,但这不会很快。

4

3 回答 3

4

将您要检查的值作为查询的参数传递,然后使用欧几里德距离(差的平方)进行排序:

SELECT TOP 20 * -- added a TOP 20 as example, choose/limit as appropriate for your situation
FROM Candidate
ORDER BY SQUARE(Candidate.JavaProficiency - @JavaProficiency) + SQUARE(Candidate.SqlProficiency - @SqlProficiency)

对于多个特征,您可以总结每个平方差异。

有关更多详细信息,请参见维基百科:欧几里得距离(特别是“平方欧几里得距离”部分)。请注意,这个答案实际上是 DanRedux 的(见评论/编辑)。

于 2012-05-12T07:00:15.600 回答
2

如果我被要求实现这样的东西,我会从查看聚类算法开始。

通过根据候选人在许多属性(技能)上的相似程度将候选人分组在一起,很容易找出最有可能与您的搜索参数匹配的候选人集群。

k-means 聚类相当容易使用,可能是一个很好的起点。 http://en.wikipedia.org/wiki/K-means_clustering

在大多数编程语言中都有可靠的 k-means 实现,因此入门应该相当容易。

Programming Collective Intelligence 中有很多关于基于集群的过滤的好信息 — <a href="http://shop.oreilly.com/product/9780596529321.do" rel="nofollow">http://shop.oreilly。 com/product/9780596529321.do

于 2012-05-12T15:54:37.377 回答
0

您可以将此视为信息检索问题并使用余弦相似度

这涉及为每个候选人形成一个向量,该向量包含他们为每个标签输入的分数。未提及的标签得分为 0。查询被类似地转换,让用户为每个标签请求一个分数,或者可能只是将提及的标签视为高分等。使用点积和量值,可以计算查询之间的相似性分数以及每位候选人;排序并选择最高的。

这些是您自己实施它的大致步骤。在任何严肃的应用程序中,我建议您要这样做,而是使用sphinxlucene之类的东西来为您做这件事。

于 2012-05-13T00:18:21.590 回答