具有相同长度的多个向量之间的相似性
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) 的两个矩阵之间的相似性
其中,
- m 是 user1 的技能数
- n 是 user2 的技能数
- L 是表示技能的向量的长度,它是固定的(在我的例子中是 300)
我确实找到了 this 问题,但由于我的问题是 NLP 问题,所以我不确定这是否有效。
一种选择是对每个 set-of-skills 的多个向量进行平均,然后计算这些平均向量之间的 cosine-similarity。
下一个版本的 Gensim 将在 KeyedVectors
上有一个实用方法,可以让您提供一个键(词)列表,以及 return 所有这些向量的平均值。在它发布之前,您可以使用它的源代码作为您自己计算的模型:
还有一种实用方法可以计算一个向量与其他向量列表 KeyedVectors.cosine_similarities()
之间的 cosine-similarity,您可以在这些平均值上使用:
但是,这种比较 sets-of-vectors 的方法 – 按他们的平均值 – 虽然简单且常见,但只是许多可能方法中的一种。
另一个选项是所谓的“Word Mover's Distance”(WMD),它的计算成本更高(尤其是在较大的集合上),因为它实际上使用搜索来搜索对 'shift' 的最小更改集不同的 sets-of-meanings 来匹配。但是由此产生的距离(对于 more-similar 集来说更小)有时可以更好地捕捉有意义的东西。
它作为 KeyedVectors
上的一种方法可用,您可以在其中提供两个应该位于 set-of-KeyedVectors
中的键(单词)列表,并且它 return s 计算距离:
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) 的两个矩阵之间的相似性 其中,
- m 是 user1 的技能数
- n 是 user2 的技能数
- L 是表示技能的向量的长度,它是固定的(在我的例子中是 300)
我确实找到了 this 问题,但由于我的问题是 NLP 问题,所以我不确定这是否有效。
一种选择是对每个 set-of-skills 的多个向量进行平均,然后计算这些平均向量之间的 cosine-similarity。
下一个版本的 Gensim 将在 KeyedVectors
上有一个实用方法,可以让您提供一个键(词)列表,以及 return 所有这些向量的平均值。在它发布之前,您可以使用它的源代码作为您自己计算的模型:
还有一种实用方法可以计算一个向量与其他向量列表 KeyedVectors.cosine_similarities()
之间的 cosine-similarity,您可以在这些平均值上使用:
但是,这种比较 sets-of-vectors 的方法 – 按他们的平均值 – 虽然简单且常见,但只是许多可能方法中的一种。
另一个选项是所谓的“Word Mover's Distance”(WMD),它的计算成本更高(尤其是在较大的集合上),因为它实际上使用搜索来搜索对 'shift' 的最小更改集不同的 sets-of-meanings 来匹配。但是由此产生的距离(对于 more-similar 集来说更小)有时可以更好地捕捉有意义的东西。
它作为 KeyedVectors
上的一种方法可用,您可以在其中提供两个应该位于 set-of-KeyedVectors
中的键(单词)列表,并且它 return s 计算距离: