我遇到一种情况,需要从可用的职位描述中提取特定申请者的技能,并将其存储为一个全新的列。数据框X看起来如下:
Job_ID Job_Desc 1 申请人应具备包括熟练掌握Python和SQL的技术能力2 申请人应具备包括熟练掌握Python和SQL以及R的技术能力
结果输出应如下所示:
Job_ID Skills1 Python,SQL2 Python,SQL,R
我使用了tf-idf计数向量化来获取Job_Desc列中最重要的词,但仍然无法在输出中获得所需的技能数据。是否可以使用Word2Vec的跳字模型或连续词袋模型来实现这一目标?
我的代码如下所示:
from sklearn.feature_extraction.text import CountVectorizercv=CountVectorizer(max_df=0.50)word_count_vector=cv.fit_transform(X)from sklearn.feature_extraction.text import TfidfTransformertfidf_transformer=TfidfTransformer(smooth_idf=True,use_idf=True)tfidf_transformer.fit(word_count_vector)def sort_coo(coo_matrix):tuples = zip(coo_matrix.col, coo_matrix.data)return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True)def extract_topn_from_vector(feature_names, sorted_items, topn=10):"""get the feature names and tf-idf score of top n items"""#use only topn items from vectorsorted_items = sorted_items[:topn]score_vals = []feature_vals = []for idx, score in sorted_items: fname = feature_names[idx] #keep track of feature name and its corresponding score score_vals.append(round(score, 3)) feature_vals.append(feature_names[idx])#create a tuples of feature,score#results = zip(feature_vals,score_vals)results= {}for idx in range(len(feature_vals)): results[feature_vals[idx]]=score_vals[idx]return resultsfeature_names=cv.get_feature_names()doc=X[0]tf_idf_vector=tfidf_transformer.transform(cv.transform([doc]))sorted_items=sort_coo(tf_idf_vector.tocoo())keywords=extract_topn_from_vector(feature_names,sorted_items,10)print("\n=====Title=====")print(X[0])print("\n===Keywords===")for k in keywords: print(k,keywords[k])
回答:
我认为仅靠TF-IDF、Word2Vec或其他简单的无监督算法无法单独识别您所需的“技能”类型。
您可能需要一个大型的手工策划的技能列表——至少作为一种自动评估声称能提取技能的方法的方式。
有了策划的列表,Word2Vec之类的东西可能有助于建议同义词、替代形式或相关技能。(对于已知的技能X,以及您文本上的大型Word2Vec模型,与X相似的术语很可能是类似的技能——但不保证,因此您可能仍然需要人工审查/策划。)
如果您有足够大的数据集,将文本映射到结果——例如,将候选人描述文本(简历)映射到人类审查者是否选择他们进行面试,或雇用他们,或他们在工作中是否成功,您可能能够识别出某些工作角色中高度预测适合的术语。这些术语可能常常是事实上的“技能”。但发现这些相关性可能是一个更大的学习项目。