python - Doc2Vec 最相似的向量与输入向量不匹配
问题描述
我有一个包含大约 40 000 条记录的招聘信息数据集。我使用 NER 从字典中大约 30 000 个技能的描述中提取技能。每个技能都表示为一个唯一的标识符。
帖子的技能编号分布如下所示:
平均 15.12 | 标准 11.22 | 分钟 1.00 | 25% 7.00 | 50% 13.00 | 75% 20.00 |
我只使用技能 ID 训练了一个 word2vec 模型,它或多或少地工作得很好。我可以找到与给定技能最相似的技能,结果看起来还不错。
但是当涉及到 doc2vec 模型时,我对结果并不满意。
我有大约 3200 个独特的职位,其中大多数只有很少的条目,其中有不少来自同一领域(“前端开发人员”、“高级 JavaScript 开发人员”、“前端工程师”)。我特意选择了各种职位,我在 doc2vec.TaggedDocument() 中用作标签。我的目标是在将技能向量输入 docvecs.most_similar() 时查看一些相关的职位。
在训练模型后(我尝试了不同数量的 epoch(100,500,1000)和向量大小(40 和 100))有时它可以正常工作,但大多数时候它不能正常工作。例如,对于像 [numpy、postgresql、pandas、xgboost、python、pytorch] 这样的技能组合,我得到的职位与 [家庭法庭、表演、建议、社会工作] 等技能组合最相似。
我的数据集大小可能有问题吗?还是文档的大小(我认为我的文本很短)?我也认为我误解了关于 doc2vec 机制的一些东西,只是忽略了它。我还想问您是否知道任何其他可能更高级的想法,我如何从技能集中获得相关职位并比较两个技能集向量(如果它们接近或远)。
升级版:
我的数据中的职位是“标签”,技能是“单词”。每个文本都有一个标签。有 40 000 个文档,包含 3200 个重复标签。文档中出现了 7881 个独特技能 ID。每个文档的平均技能词数为 15。
我的数据示例:
job_titles skills
1 business manager 12 13 873 4811 482 2384 48 293 48
2 java developer 48 2838 291 37 484 192 92 485 17 23 299 23...
3 data scientist 383 48 587 475 2394 5716 293 585 1923 494 3
我的代码示例:
def tagged_document(df):
#tagging documents
for index, row in df.iterrows():
yield gensim.models.doc2vec.TaggedDocument(row['skills'].split(), [row['job_title']])
data_for_training = list(tagged_document(job_data[['job_titles', 'skills']])
model_d2v = gensim.models.doc2vec.Doc2Vec(vector_size=50, min_count=2, epochs=100)
model_d2v.train(data_for_training, total_examples=model_d2v.corpus_count, epochs=model_d2v.epochs)
#the skill set contains close skills which represent a front end developer
skillset_ids = '12 34 556 453 1934'.split()
new_vector = model_d2v.infer_vector(skillset_ids, epochs=100)
model_d2v.docvecs.most_similar(positive=[new_vector], topn=30)
我最近一直在尝试,并注意到如果我过滤掉少于 10 个技能的文档,它的性能会更好一些。尽管如此,还是有一些不相关的职位出现。
解决方案
如果没有看到你的代码(或者至少是它的主要选择的草图),很难判断你是否会犯错误,比如常见的“alpha
通过遵循糟糕的在线示例来管理自己”问题:我的Doc2Vec 代码,经过多次循环训练,并没有给出好的结果。可能有什么问题?
(你的最小测试数epochs
是 100 似乎很可疑;10-20 epoch 是已发表作品中的常见值,当数据集的大小和每个文档的大小都很丰富时,尽管更多的通过有时可以帮助处理更薄的数据。)
同样,从您的描述中也不能完全清楚您的培训文档是什么样的。例如:
- 是
tags
头衔和words
技能吗? - 每个文本都有一个
tag
吗? - 如果有 3,200 个 unique
tags
和 30,000 个 uniquewords
,那么只有 3,200 个TaggedDocuments
,还是更多的重复标题? - 每人的平均技能词数是
TaggedDocument
多少?
此外,如果您使用词向量(用于技能)作为查询向量,则必须确保使用实际训练这些词的训练模式。某些Doc2Vec
模式,例如普通 PV-DBOW ( dm=0
) 根本不训练词向量,但它们将作为随机初始化的垃圾存在。(添加非默认值dbow_words=1
以添加 skip-gram 词训练,或切换到 PV-DMdm=1
模式,将确保词向量在可比较的坐标空间中进行协同训练。)
推荐阅读
- python - 请求避免 ddos 保护
- widget - Flutter - 动态小部件定位
- php - php yii 框架,更改 connect.php 文件中的主机会导致网站挂起?
- apache-spark - spark结构化流式动态字符串过滤器
- javascript - NodeJS 'Cron' 包 - 计划每 20 秒运行一次的作业
- c++ - size_t 与 unsigned int 相比的大小
- networking - 由于网络原因,使用远程配置的 Coreos 点火失败
- c# - c# .net 显示图片
- mongoose - 如何在一个条件下更新文档,只使用一个查询
- mysql - DynamoDB 中的最新分区键条目