【问题标题】:very different values from normed_vector cosine similarity and most_similar与 normed_vector 余弦相似度和 most_similar 非常不同的值
【发布时间】:2021-11-02 02:06:36
【问题描述】:

我有一个基于网站数据的 Doc2Vec 模型。我正在尝试使用嵌入来查找彼此最相似的网站。为此,我正在做矩阵的余弦相似度。我还将它与 most_similar() 的输出进行比较。

问题是,他们提供了本质上不同的匹配项(不仅略有不同)。

具体来说,对于一家指数值为 791 的公司和我比较的文本值文本。

text = self.website_info.iloc[791].text
tokens = text.split()
vec = self.word2vec_model.infer_vector(tokens,negative=0)

most_similar = self.word2vec_model.docvecs.most_similar([vec])

self.word2vec_model.init_sims()
mat = self.word2vec_model.docvecs.get_normed_vectors()
w2v_sim = np.dot(mat, mat.T)

sims = pd.DataFrame(pd.Series(w2v_sim[791]))
sims.rename(columns={0:'sim'}, inplace = True)
sims.sort_values(by='sim',ascending=False,inplace=True)

most_similar  = sims.head(20)

我还看到嵌入向量 real 和 inferred 本质上是不同的。不仅是标准化或数值,还有分量符号的巨大差异。

【问题讨论】:

    标签: python word2vec doc2vec


    【解决方案1】:

    你的代码中有一堆不太合理的地方。

    • 如果您使用的是 Gensim-4.0 或更高版本(存在 .get_normed_vectors()),则无需调用 .init_sims()。 (实际上,它应该显示弃用警告。)

    • 只有Doc2Vec 模型支持.infer_vector() - 所以将变量命名为word2vec_model 很奇怪

    • .infer_vector() 方法不采用 negative=0 参数 - 因此代码会在 Gensim 库中生成错误,否则您似乎正在使用该错误。 (而且,如果它确实以某种方式采用 negative 参数将推理更改为使用 0 否定示例,那将破坏推理 - 它应该使用与模型训练期间相同的 negative 值。)

    我也不确定您的替代计算 - 特别是,通过 Pandas 而不是原生 Numpy 操作来驱动它似乎是不必要的,并且在任何具有足够 -大量文档。

    而且:推断的向量在训练期间基本上永远不会与相同文本的向量相同。如果模型的所有内容都运行良好,并且有足够的训练数据和参数(尤其是足够的epochs 和没有太多的vector_size 维度),它就会“接近”。 (有关运行/推理之间如何存在固有“抖动”的更多详细信息,请参阅this FAQ item。)

    所以我建议:

    • 第一,检查您的项目 #791 的推断向量与批量训练创建的向量有多相似。 (您可以将它们相互比较,或者将前 N 个 .most_similar() 项目的列表相互比较。)如果它们非常不同,则模型训练(数据/参数)可能存在其他问题,导致模型动力不足。 (在某些情况下,更多的epochs 或更少的vector_size 维度有助于使模型更加一致、运行到运行,但如果您的数据很薄,Doc2Vec 的工作效果就会受到限制.)

    • 检查您对最近邻的替代计算是否与.most_similar() 返回的结果完全匹配,使用完全相同(非推断)的原点向量。如果不是这样,那将是一个单独的问题,而不是来自批量训练的向量与来自以后重新推理的向量之间的任何松散/差异。

    • 尝试评估.most_similar() 结果的实际质量 - 通过临时观察,或某种严格的领域专家黄金标准,“应该”对文档进行类似的判断。 .most_similar() 方法的计算是一种典型的方法,通常是人们想要的 - 所以知道这是否对您的数据/模型/目标有帮助可能比您是否可以将其与单独的外部计算相匹配更有趣。

    如果您仍然遇到问题,请确保在任何后续 cmet、问题编辑或新问题中多说一点:

    这些可以帮助确定您的模型是否存在其他更基础的问题/薄弱环节。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2017-04-04
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2019-05-21
      • 2018-02-19
      • 2019-08-06
      • 2018-06-30
      相关资源
      最近更新 更多