Gensim doc2vec的d2v.wv.most_similar()给出了具有高相似度分数的不相关单词



我有一个包含约150000条记录的工作列表数据集。我使用一本包含30000种技能的词典,从NER的描述中提取技能。每一项技能都表现为一个独特的识别者。

我的数据示例:

job_title    job_id                                         skills
1  business manager         4               12 13 873 4811 482 2384 48 293 48
2    java developer        55    48 2838 291 37 484 192 92 485 17 23 299 23...
3    data scientist        21    383 48 587 475 2394 5716 293 585 1923 494 3

然后,我使用这些数据训练了一个doc2vec模型,其中职务(准确地说是他们的id(被用作标签,技能向量被用作单词向量。

def tagged_document(df):
for index, row in df.iterrows():
yield gensim.models.doc2vec.TaggedDocument(row['skills'].split(), [str(row['job_id'])])


data_for_training = list(tagged_document(data[['job_id', 'skills']]))
model_d2v = gensim.models.doc2vec.Doc2Vec(dm=0, dbow_words=1, vector_size=80, min_count=3, epochs=100, window=100000)
model_d2v.build_vocab(data_for_training)
model_d2v.train(data_for_training, total_examples=model_d2v.corpus_count, epochs=model_d2v.epochs)

它基本上还可以,但我对一些职称有意见。我试图从他们那里收集更多的数据,但我仍然有一种不可预测的行为。

例如,我有一个职位名称";商业运营总监";其表示为具有11至96种技能的41个数据记录(平均32个(。当我得到最相似的词(在我的情况下是技能(时,我得到以下内容:

docvec = model_d2v.docvecs[id_]
model_d2v.wv.most_similar(positive=[docvec], topn=5)
capacity utilization 0.5729076266288757
process optimization 0.5405482649803162
goal setting 0.5288119316101074
aeration 0.5124399662017822
supplier relationship management 0.5117508172988892

这是前5项技能,其中3项看起来很相关。然而,顶部的一个与";曝气";。问题是,没有一份职称记录具备这些技能。它看起来像是输出中的噪音,但为什么它会获得最高的相似性分数之一(尽管通常不高(?这是否意味着该模型不能为这类职位概括出非常具体的技能?可以把";嘈杂的";技能会减少吗?有时我会看到相似性得分更低的相关技能,但通常低于0.5。

另一个具有类似数据量的正确行为示例:BI分析员,29条记录,技能数量从4到48(平均21(。顶级技能看起来不错。

business intelligence 0.6986587047576904
business intelligence development 0.6861011981964111
power bi 0.6589289903640747
tableau 0.6500121355056763
qlikview (data analytics software) 0.6307920217514038
business intelligence tools 0.6143202781677246
dimensional modeling 0.6032138466835022
exploratory data analysis 0.6005223989486694
marketing analytics 0.5737696886062622
data mining 0.5734485387802124
data quality 0.5729933977127075
data visualization 0.5691111087799072
microstrategy 0.5566076636314392
business analytics 0.5535123348236084
etl 0.5516749620437622
data modeling 0.5512707233428955
data profiling 0.5495884418487549

如果模型应该报告的黄金标准是训练数据中出现的技能,你确定不想要一个简单的基于计数的解决方案吗?例如,只需提供Director Of Commercial Operations列表中最常出现的技能的排名列表?

另一方面,将N个职位和30000个技能压缩到一个较小的(在本例中为vector_size=80(坐标空间模型中的本质是迫使一些非直观(但可能是真实的(关系反映在模型中。

模型中是否存在一些真正的模式——即使可能只是不太常见的技能外观上的一些特质——使aeration必然接近其他技能?(也许这是一种罕见的技能,其很少的上下文外观与其他技能同时出现,非常接近"容量利用率"——这意味着,由于可用的数据量很小,而且对这项技能的整体关注度很低,没有比这更好的地方了。(

注意你的"异常"是否经常出现在低频技能或低频工作ID中,可以更仔细地了解数据原因,或对most_similar()结果进行一些否认/过滤。(most_similar()方法可以将其返回的排名限制在已知词汇的更频繁范围内,用于长尾词或稀有词在其粗糙向量中从更好的请求词中侵入更高质量的结果的情况。请参阅restrict_vocab参数。(

也就是说,修改训练参数可能会得到更好地反映你意图的排名。更大的min_count可能会删除更多的令牌,这些令牌在缺乏足够多的变化示例的情况下,大多只是将噪声注入其余的训练中。一个不同的vector_size,无论大小,都可能更好地捕捉到你想要的关系。更具攻击性(更小(的sample可以丢弃更多的高频词,这些词可能会让更有趣、更不频繁的词失去影响模型的机会。

注意,对于CCD_ 10&一个大窗口,每个记录都有(也许?(几十种技能,在模型中,这些词对彼此的睦邻影响比tag&lt->CCD_ 12相关性。这可能是好的,也可能是坏的。

最新更新