首页 > 解决方案 > 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 个技能的文档,它的性能会更好一些。尽管如此,还是有一些不相关的职位出现。

标签: pythonnlpgensimword2vecdoc2vec

解决方案


如果没有看到你的代码(或者至少是它的主要选择的草图),很难判断你是否会犯错误,比如常见的“alpha通过遵循糟糕的在线示例来管理自己”问题:我的Doc2Vec 代码,经过多次循环训练,并没有给出好的结果。可能有什么问题?

(你的最小测试数epochs是 100 似乎很可疑;10-20 epoch 是已发表作品中的常见值,当数据集的大小和每个文档的大小都很丰富时,尽管更多的通过有时可以帮助处理更薄的数据。)

同样,从您的描述中也不能完全清楚您的培训文档是什么样的。例如:

  • tags头衔和words技能吗?
  • 每个文本都有一个tag吗?
  • 如果有 3,200 个 uniquetags和 30,000 个 unique words,那么只有 3,200 个TaggedDocuments,还是更多的重复标题?
  • 每人的平均技能词数是TaggedDocument多少?

此外,如果您使用词向量(用于技能)作为查询向量,则必须确保使用实际训练这些词的训练模式。某些Doc2Vec模式,例如普通 PV-DBOW ( dm=0) 根本不训练词向量,但它们将作为随机初始化的垃圾存在。(添加非默认值dbow_words=1以添加 skip-gram 词训练,或切换到 PV-DMdm=1模式,将确保词向量在可比较的坐标空间中进行协同训练。)


推荐阅读