如何基于词嵌入实现文档过滤:保留招聘启事,排除简历
解决方法:过滤简历,保留招聘启事
一、先修复现有相似度方法的问题并添加过滤逻辑
你的现有代码有个明显bug:排序时用的列名word_embedding_similarity不存在,实际生成的列是similarity,这会导致报错。另外,单纯排序没做过滤,所以才会同时返回两类文档。
修改后的相似度过滤代码
from sklearn.metrics.pairwise import cosine_similarity import numpy as np def filter_jobs_by_similarity(dataframe, reference_text, column_name='processed_content', embedding_model=None, threshold=0.3): # 处理参考文本,生成向量 text_tokens = reference_text.lower().split() text_vector = [] for word in text_tokens: if word in embedding_model: text_vector.append(embedding_model[word]) # 处理空向量情况(参考文本无匹配词) if not text_vector: text_vector = np.zeros(embedding_model.vector_size) else: text_vector = sum(text_vector) / len(text_vector) # 用平均向量代替求和,避免长度影响相似度 # 处理DataFrame里的文本向量 def get_doc_vector(tokens): vecs = [embedding_model[word] for word in tokens if word in embedding_model] if not vecs: return np.zeros(embedding_model.vector_size) return sum(vecs) / len(vecs) dataframe['doc_vector'] = dataframe[column_name].str.lower().str.split().apply(get_doc_vector) # 计算余弦相似度 dataframe['similarity'] = dataframe['doc_vector'].apply(lambda x: cosine_similarity([text_vector], [x])[0][0]) # 核心过滤逻辑: # 如果参考文本是**典型简历**,则保留相似度低于阈值的文档(招聘启事和简历差异大) # 如果参考文本是**典型招聘启事**,则保留相似度高于阈值的文档 filtered_df = dataframe[dataframe['similarity'] < threshold].drop(columns=['doc_vector']) return filtered_df.sort_values(by='similarity', ascending=True)
使用说明
- 选一段典型的简历文本作为
reference_text(比如从你用的标注数据里挑一份简历内容),设置合适的阈值(比如0.3,可根据实际数据调整),这样相似度低的就是招聘启事。 - 改用平均向量代替求和,避免长文本的向量被过度放大,导致相似度计算失真。
二、更可靠的方案:用文本分类模型直接区分
单纯的相似度方法容易误判(比如招聘启事里提到“简历投递”这类词会和简历相似度变高),用标注好的数据训练分类模型是更稳妥的方式:
步骤:
- 用你手上的标注数据(区分简历/招聘),把
processed_content作为特征,标签设为0=简历,1=招聘启事。 - 用TF-IDF或预训练语言模型提取文本特征,训练分类器(比如Logistic Regression、朴素贝叶斯,或者BERT)。
- 用训练好的模型预测你的目标DataFrame里的文档类型,过滤掉标签为0的简历。
示例代码(TF-IDF+Logistic Regression)
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.pipeline import Pipeline # 假设你有标注好的训练数据:train_df(含processed_content和label列) train_df = ... # 加载标注数据,label=1是招聘,0是简历 # 构建分类管道 clf_pipeline = Pipeline([ ('tfidf', TfidfVectorizer(max_features=5000, stop_words='english')), ('lr', LogisticRegression()) ]) # 训练模型 clf_pipeline.fit(train_df['processed_content'], train_df['label']) # 预测并过滤目标DataFrame target_df['predicted_label'] = clf_pipeline.predict(target_df['processed_content']) filtered_jobs_df = target_df[target_df['predicted_label'] == 1].drop(columns=['predicted_label'])
这种方法的准确率远高于单纯的相似度匹配,因为模型会学习到两类文档的核心特征差异(比如简历会强调个人经历、技能,招聘启事会强调岗位要求、公司信息)。
内容的提问来源于stack exchange,提问作者Banafshe khazali
相关产品推荐
相关产品推荐

