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

Gensim doc2vec's d2v.wv.most_similar() gives not relevant words with high similarity scores

我有一个包含大约 150 000 条记录的职位列表数据集。我使用 NER 使用包含 30 000 个技能的字典从描述中提取技能。每个技能都表示为一个唯一的标识符。

我的数据示例:

          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 项技能(平均 32 项)的 41 条数据记录。当我得到最相似的词时(在我的案例中是技能),我得到以下信息:

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 项看起来很相关。然而,最上面的一个与“曝气”一起看起来不太有效。问题是 none 的职位记录根本就没有这些技能。这似乎是输出中的噪音,但为什么它获得了最高的相似度分数之一(尽管通常不高)? 这是否意味着该模型无法为此类职位概述非常具体的技能? 能不能减少“嘈杂”技能的数量?有时我会看到相似度得分较低的更多相关技能,但通常低于 0.5。

另一个具有相似数据量的正确行为示例: BI Analyst,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个职位和30,000个技能压缩到一个更小的(在本例中vector_size=80)坐标-space模型的本质是强制一些非直观的(但可能是真实的)关系将反映在模型中。

模型中是否存在某种真实模式——即使,也许只是一些不太常见的技能出现的特殊性——这使得 aeration 必然靠近其他技能? (也许这是一种罕见的技能,它很少与其他技能同时出现 'capacity utilization' - 这意味着可用的数据量很少,而且对该技能的总体关注很少,没有比这更好的地方了它。)

记下您的 'anomalies' 是否经常使用低频技能或低频工作 ID,可能有助于更仔细地查看数据原因,或者某些 disclaimering/filtering most_similar() 结果。 (most_similar() 方法可以将其返回的排名限制在已知词汇的更频繁范围内,对于长尾词或稀有词以其更粗糙的向量侵入更好的高质量结果的情况 -要求的词。请参阅 restrict_vocab 参数。)

也就是说,修改训练参数可能会导致排名更能反映您的意图。较大的 min_count 可能会删除更多标记,这些标记缺乏足够多变的示例,主要只是将噪声注入其余的训练中。不同的 vector_size,无论大小,都可能更好地捕捉您正在寻找的关系。更具攻击性(更小)sample 可以丢弃更多高频词,这些词可能会让更有趣、频率更低的词失去影响模型的机会。

请注意,dbow_words=1 和大量 window,并且每个记录都有(也许?)数十种技能,这些词的 更接近 相互影响,在模型中,比 tag<->word 相关。这可能是好事也可能是坏事。