【问题标题】:Gensim doc2vec's d2v.wv.most_similar() gives not relevant words with high similarity scoresGensim doc2vec 的 d2v.wv.most_similar() 给出了相似度高的不相关词
【发布时间】:2022-01-17 21:17:53
【问题描述】:

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

【问题讨论】:

    标签: nlp gensim word2vec word-embedding doc2vec


    【解决方案1】:

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

    另一方面,将 N 个职位和 30,000 个技能压缩成一个更小的(在本例中为 vector_size=80)坐标空间模型的本质是强制一些非直观(但可能是真实的)关系反映在模型中。

    模型中是否存在一些真实的模式——即使可能只是在不太常见的技能的外观上存在一些特质——这使得aeration 必然与其他技能接近? (也许这是一种罕见的技能,它很少与其他技能同时出现在“产能利用率”附近——这意味着可用的数据量很少,而且对该技能的整体关注量很小,没有比这更好的地方了.)

    注意您的“异常”是否经常出现在低频技能或低频工作 ID 中,这可能有助于更仔细地查看数据原因,或者对 most_similar() 结果进行一些免责/过滤。 (most_similar() 方法可以将其返回的排名限制在已知词汇表的更频繁范围内,以防长尾词或稀有词以其更粗糙的向量从更好呈现的词中侵入更高质量的结果.见restrict_vocab参数。)

    也就是说,修改训练参数可能会产生更能反映您意图的排名。更大的min_count 可能会删除更多的标记,这些标记缺乏足够多样的示例,大多只是将噪声注入到其余的训练中。不同的vector_size,更小或更大,可能更好地捕捉您正在寻找的关系。更激进(更小)的sample 可能会丢弃更多高频词,这些词可能会导致更有趣的低频词无法影响模型。

    请注意,dbow_words=1 和一个大窗口,并且每个记录(可能?)有几十个技能,在模型中,这些词彼此之间具有更相邻的影响,而不是 tagword 相关性。这可能是好是坏。

    【讨论】:

    • 嗨@gojomo,非常感谢您的回复。
    • 基于计数的解决方案实际上是目前问题的临时解决方案,但理想情况下,我希望获得罕见异常的结果。我发现 restrict_vocab 参数对于不同的职位具有不同的值是一个更好的解决方案,而不是仅仅用最频繁的技能替换。但是,我会尝试使用训练参数并找出影响最大的参数。此外,我似乎需要多检查一下数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2019-02-28
    • 1970-01-01
    • 2019-07-02
    • 2020-06-02
    • 2018-08-14
    • 2019-03-02
    相关资源
    最近更新 更多