Python Doc2Vec最相似的向量不';不匹配输入向量

Python Doc2Vec最相似的向量不';不匹配输入向量,python,nlp,gensim,word2vec,doc2vec,Python,Nlp,Gensim,Word2vec,Doc2vec,我有一个有大约40000条记录的招聘信息数据集。我使用NER从描述中提取技能,字典中有大约30000个技能。每一项技能都代表着一个独特的识别者 发布的技能编号分布如下所示: 平均15.12| 标准11.22| 最低1.00| 25% 7.00 | 50% 13.00 | 75%20.00| 我已经训练了一个word2vec模型,它只使用技能ID,并且或多或少工作得很好。我能找到与给定技能最相似的技能,结果看起来不错 但对于doc2vec模型,我对结果并不满意 我

我有一个有大约40000条记录的招聘信息数据集。我使用NER从描述中提取技能,字典中有大约30000个技能。每一项技能都代表着一个独特的识别者

发布的技能编号分布如下所示:

平均15.12| 标准11.22| 最低1.00| 25% 7.00 | 50% 13.00 | 75%20.00|

我已经训练了一个word2vec模型,它只使用技能ID,并且或多或少工作得很好。我能找到与给定技能最相似的技能,结果看起来不错

但对于doc2vec模型,我对结果并不满意

我有大约3200个独特的职位,其中大多数只有很少的条目,而且有相当多的职位来自同一个领域(“前端开发人员”、“高级javascript开发人员”、“前端工程师”)。我谨慎地选择了各种各样的职位,在doc2vec.TaggedDocument()中用作标签。我的目标是在将技能向量输入到docvecs.most_simple()中时,看到许多相关的职位

在训练一个模型后(我尝试了不同数量的历元(1005001000)和向量大小(40和100)),有时它可以正常工作,但大多数时候它不能。例如,对于像[numpy、postgresql、pandas、xgboost、python、pytorch]这样的技能集,我获得了与之最相似的职位,比如[家庭法庭、表演、咨询、社会工作]

我的数据集的大小会有问题吗?还是文档的大小(我认为我有短文本)?我还认为我误解了doc2vec机制的某些内容,只是忽略了它。我还想问你是否知道其他可能更高级的想法,我如何从一个技能集中获得相关的职位,并比较两个技能集向量,如果它们接近或远离

UPD:

我的数据中的职称是“标签”,技能是“文字”。每个文本都有一个标记。有40000个文档,其中包含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
我自己”问题:

(你测试的
历代记录的最小数量是100似乎是可疑的;10-20个历代记录是已发表作品中的常见值,当数据集的大小和每个文档的大小都很丰富时,尽管更多的过程有时有助于更细的数据。)

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

  • 标签
    标题和
    单词
    技能吗
  • 每个文本是否都有一个
    标记
  • 如果有3200个独特的
    标签
    和30000个独特的
    单词
    ,那么这仅仅是3200个
    标签文档
    ,还是更多具有重复标题的文档
  • 每个
    TaggedDocument
    的平均技能单词数是多少

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

我认为他试图将一组单词与文档进行比较。这是一个很好的比较吗。您是否应该将文档与文档进行比较,而不仅仅是一组单词。某些模式的
Doc2Vec
将文档和单词向量训练到相同的坐标中,这可能会产生有用的/可解释的结果-例如,您好,gojomo,非常感谢您的回复!我已经添加了您在我的初始问题中询问的信息。我看不出您的设置有任何明显的错误,但我会对
data\u中的一些项目进行采样,以便进行培训
,然后查看
model\u d2v.docvec.doctags
model\u d2v.wv.indexword
,以仔细检查您认为正在培训的内容。您的数据大小较小,但可能足以尝试较大的
vector\u size
值。如果技能顺序不相关,您也可以尝试一个非常大的
窗口
(例如
窗口=1000000
),在使用
窗口
的模式下,使所有技能基本上彼此相邻,而不是受最近的技能的影响。非常感谢您的推荐,gojomo!我认为dm=0,dbow_words=1已经改变了游戏规则。目前的结果要好得多。