2012-05-12 52 views
3

我需要实现类似于http://venturocket.com的技能匹配功能 - 候选人输入技能列表并评估他的熟练程度。然后您可以再次输入一些技能和您正在寻找的专业知识水平。结果是按照他们的技能与您的搜索相匹配的顺序排列的候选人列表。技巧匹配算法

实施例:

候选1进入技能的Java(熟练度90)和候选2进入的Java(50)。当我搜索Java(60)时,候选人2更接近匹配。

这个故事也适用于多种技能。

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

+0

让人们在大范围内输入自己的熟练程度将是很难做到的。只是说。当然,我不是指编程式的意思。 – keyser

回答

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) 

对于多个性状你总结各正方形的差异。

请参阅Wikipedia: Euclidean Distance了解更多细节(具体为“平方欧氏距离”部分)。请注意,这个答案实际上是DanRedux的(见评论/编辑)。

+2

确定候选人亲密度的更准确的方法是简单的笛卡尔距离,将每个熟练度水平作为一个维度,这意味着总结每个技能差异的平方。假设,和你的例子一样,两个候选人拥有Java(50),SQL(70),另一个拥有Java(60),SQL(40),有人搜索Java(60),SQL(60)将是200,400,所以第一个候选人将被选中。这只是笛卡尔距离,将每个技能等级视为自己的维度,并找到最接近的坐标。 – DanRedux

+0

@DanRedux - 你是对的,更合适。你应该让你的评论一个答案,然后你可以有代表! :) –

+0

呐,我不太在乎代表,因为我可以帮助只有1个代表的人。 – DanRedux

2

如果我被要求实现这样的事情,我会先看看聚类算法。

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

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

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

有在集体智慧编程了很多关于基于集群过滤良好的信息 - http://shop.oreilly.com/product/9780596529321.do

0

你可以把它当作一个information retrieval问题,使用cosine similarity

这涉及为每个候选人形成他们为每个标签输入的分数的矢量。未提及的标签获得0分。查询被类似地转换,允许用户为每个标签请求分数,或者可能仅仅将所提及的标签视为高分等。使用点积和大小,可以计算查询之间的相似性分数和每个候选人;排序并选择最高的。

这些是自己实施它的广泛笔触。在任何严重的应用程序,我建议你不是做到这一点,而不是像sphinxlucene灰尘的东西来为你做。

+0

如果您使用skill-as-vector vs query-as-vector的点积,那么在例如'java'不是查询的一部分的情况下,您最终会选择'java = 0' ?这似乎是错误的 - 你不需要将每个向量投影到所涉及的维度上吗? – gcbenison

+0

公平点;我故意简化。有整本书(例如http://nlp.stanford.edu/IR-book/)关于如何正确使用;我的解释只是为了说明。这也是我建议认真尝试使用现有Search Appliance的原因。 – phs