具有相同长度的多个向量之间的相似性

Similarity between multiple vectors having same length

Objective : 根据他们的技能计算两个用户之间的相似度

方法:使用gensim 库根据从工作描述中获得的技能集训练了一个word2vec 模型。使用时模型似乎工作得很好 model.wv.most_similar 例如

问题:训练模型所用的技能词汇与我目前拥有的技能不匹配,所以我继续从中找到了当前技能的替代品通过使用模块 difflib 中的 SequenceMatcher 找到相似性 w.r.t 拼写,模型的词汇表。例如“PyTorch”是我目前的技能,但模型的词汇表中有“火炬”作为一项技能。因此,使用 SequenceMatcher 我发现“torch”与模型词汇表的相似度最高,因此我将“Pytorch”替换为“torch”,并通过将“torch”传递给模型来计算相同的向量表示,model.wv["torch"] 并将其存储在字典中,这样我就不必一次又一次地计算它了。

计算相同的函数:

def new_to_old_embedding(skill_embeddings, new_skill, model)
    """ Computing embeddings for new skills from app by mapping new skills with old skills from model's vocabulary
    
    Returns:
        dict: Embeddings of new skills after mapping with old skills
    """
    if new_skill not in old_skills:
        thresh = 0.6
        replaced_skill = ''
        for old_skill in old_skills :
            spell_sim = SequenceMatcher(None, old_skill, new_skill).ratio()
            if spell_sim > thresh :
                thresh = spell_sim
                replaced_skill = old_skill
        skill_embeddings[new_skill] = model.wv[replaced_skill]
    else :
        skill_embeddings[new_skill] = model.wv[new_skill]
    return skill_embeddings

与我当前的所有技能类似,我找到了最接近的技能 w.r.t 拼写并计算了它的矢量表示并将其存储在 python 字典中。

现在,如果 user1 的技能 = ["OpenCV", "Python"] 并且 user2 的技能 = ["Machine Learning", "Deep Learning", "Python"] 并且我已经将每项技能的向量表示存储在字典中,那么我如何计算这两组技能之间的相似性?

换句话说,我必须找到维度为 (m, L) 和 (n, L) 的两个矩阵之间的相似性 其中,

我确实找到了 this 问题,但由于我的问题是 NLP 问题,所以我不确定这是否有效。

一种选择是对每个 set-of-skills 的多个向量进行平均,然后计算这些平均向量之间的 cosine-similarity。

下一个版本的 Gensim 将在 KeyedVectors 上有一个实用方法,可以让您提供一个键(词)列表,以及 return 所有这些向量的平均值。在它发布之前,您可以使用它的源代码作为您自己计算的模型:

https://github.com/RaRe-Technologies/gensim/blob/97cef997032c3222645ebdc898c199a7b63e5395/gensim/models/keyedvectors.py#L462

还有一种实用方法可以计算一个向量与其他向量列表 KeyedVectors.cosine_similarities() 之间的 cosine-similarity,您可以在这些平均值上使用:

文档:https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.KeyedVectors.cosine_similarities

来源:https://github.com/RaRe-Technologies/gensim/blob/97cef997032c3222645ebdc898c199a7b63e5395/gensim/models/keyedvectors.py#L1147

但是,这种比较 sets-of-vectors 的方法 – 按他们的平均值 – 虽然简单且常见,但只是许多可能方法中的一种。

另一个选项是所谓的“Word Mover's Distance”(WMD),它的计算成本更高(尤其是在较大的集合上),因为它实际上使用搜索来搜索对 'shift' 的最小更改集不同的 sets-of-meanings 来匹配。但是由此产生的距离(对于 more-similar 集来说更小)有时可以更好地捕捉有意义的东西。

它作为 KeyedVectors 上的一种方法可用,您可以在其中提供两个应该位于 set-of-KeyedVectors 中的键(单词)列表,并且它 return s 计算距离:

文档:https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.KeyedVectors.wmdistance