2012-05-12 53 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