技能匹配算法

3
我需要实现一个技能匹配功能,类似于http://venturocket.com- 求职者输入一系列技能并对每个技能进行评分。然后你可以通过再次输入一些技能和你所寻找的专业水平进行搜索。结果是一个候选人列表,按照他们的技能与你的搜索匹配程度排序。
例如:求职者1输入Java技能(熟练度90),求职者2输入Java技能(50)。当我搜索Java技能(60)时,求职者2更接近匹配。
这也应该适用于多项技能。
我正在寻找指向可帮助我实现此目标的技术或算法。我的当前方法是在数据库中进行范围查询(例如查找45到75之间的Java技能),然后在客户端进行排序,但速度不会很快。

让人们在大规模中输入自己的熟练程度将会非常难以实现。只是这么说而已,当然我并不是指编程方面。 - keyser
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的(请参见评论/编辑)。


2
更准确的确定候选人接近度的方法是使用笛卡尔距离,将每个技能水平视为一个维度,这意味着需要对每个技能差异的平方求和。假设像您的例子一样,两个候选人具有Java(50),SQL(70),另一个候选人具有Java(60),SQL(40),并且有人搜索Java(60),SQL(60),则各自的距离将分别为200, 400,因此第一个候选人将被选择。这只是笛卡尔距离,将每个技能水平视为它自己的维度,并找到最接近传递进来的坐标。 - DanRedux
@DanRedux - 你说得对,这样更合适。你应该把你的评论变成一个答案,这样你就可以获得声望了! :) - Chris Shaffer
不,我并不太关心声望,因为我可以用只有1点声望来帮助人们。 - DanRedux

2
如果让我实现这样的东西,我会从聚类算法入手。通过根据候选人在多个属性(技能)上的相似程度将其分组,很容易确定哪个候选人簇最有可能与您的搜索参数匹配。K均值聚类算法相对容易使用,可能是一个不错的起点。http://en.wikipedia.org/wiki/K-means_clustering大多数编程语言中都有可靠的K均值实现,因此入门应该相对容易。《编程集体智慧》中有很多关于基于聚类的过滤的好信息。http://shop.oreilly.com/product/9780596529321.do

0

你可以将这看作是一个信息检索问题,并使用余弦相似度

这涉及为每个候选人形成一个向量,该向量包含他们为每个标签输入的分数。未提及的标签得分为0。查询也以类似的方式进行转换,让用户请求每个标签的分数,或者只将提到的标签视为高分,等等。使用点积和大小,可以计算查询和每个候选人之间的相似度得分;排序并选择前几个最高的。

这些是自己实现它的基本步骤。在任何严肃的应用程序中,我建议你不要这样做,而是使用像sphinxlucene这样的工具来为你完成。


如果您使用技能向量与查询向量的点积,那么在查询中不包含“java”等内容的情况下,您是否会更喜欢“java=0”的候选人?这似乎是错误的 - 您不需要将每个向量投影到涉及的维度上吗? - gcbenison
公正的观点;我故意简化了。有整本书(例如http://nlp.stanford.edu/IR-book/)专门讲述如何做到这一点;我的解释只是为了说明。这也是为什么我建议认真尝试使用现有的搜索设备。 - phs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接