word2vec 词嵌入创建了很远的向量,最近的余弦相似度仍然很远,只有 0.7

数据挖掘 word2vec 词嵌入 gensim 嵌入 余弦距离
2021-09-30 11:43:50

我开始使用 gensim 的 FastText 在专业领域的大型语料库上创建词嵌入(在发现现有的开源嵌入在这个领域表现不佳之后),虽然我没有使用它的字符级 n-gram,所以它基本上是只是word2vec。

我正在通过查看一些“最相似”的词来测试结果,模型似乎运行良好,除了最相似的词最多获得相似度分数(使用余弦相似度,gensim 的 FastTextmost_similar()函数) 0.7与 google 或 spacy 的嵌入同义词的相似度往往约为 0.95+。我想知道为什么他们不在我的情况下。这不一定是问题,但我不清楚为什么会发生这种情况;为什么即使是非常相似的词,使用非常相似的词也只有 0.7 的相似度?同样,相似的词本身确实很有意义,所以训练进行得很好,但分数有点低。

我最好的猜测是我使用的嵌入大小可能太大了 - 256。任何人都可以提出其他解释吗?

我使用 CBOW、15 个 epoch、窗口大小 = 4、几千万个文档对其进行了训练,但我感兴趣的词汇表中只有约 100000 个单词。

1个回答

在查看距离之前,让我们尝试了解 Word2Vector 的实际工作原理:

有两种方法可以为单词生成向量:

  1. 连续的词袋
  2. 跳过克

下图解释了这两种方法之间的区别。

词向量

如果您想进一步了解这两种方法的本质,这里有大量的博客

现在让我们看看图像试图告诉我们什么。

对于 CBOW,它查看相邻单词以提供另一个单词在该空间中同时出现的概率。

对于 Skipgram,给定一个单词,它提供所有其他单词在邻域中出现的概率。

为什么知道这一点很重要?

如果不了解这些算法在做什么,就不太可能解决 NLP 问题,因为词向量是任何深度学习/机器学习算法的主要输入。

词向量为我们提供了哪些其他功能?

由于您在 n 维空间中对 Words 进行了矢量化,它使您能够执行快速操作,例如在此 n 维空间中计算距离。一种这样的方法是余弦距离,您已经概述了使用过的方法。

了解如何计算距离也有帮助。这是余弦相似度如何工作的一个小解释:

当您查看 n 维空间中的向量投影时,您会发现这些向量之间的角度差异。如果角度很小,假设为 0,则 cos(0) = 1,这意味着这些向量之间的距离非常小,从而使它们成为相似的向量。

鉴于此信息,您可以从单词之间的距离结果中推断出什么:

  1. 您的语料库中的词分布多样,可能与大量词同时出现,从而使相似词之间的距离不 > 0.7
  2. 鉴于单词的变化以及词汇表中可能存在大量停用词,浅层神经网络很难为您的单词提供准确的向量。

有助于提高矢量质量的建议:

  1. 使用 TFIDF,您可以删除停用词,以防您不感兴趣。
  2. 预处理您的文本以使其成为标准格式。例如,文本的小写、特殊字符的去除、空格的去除。
  3. 尝试不同的嵌入大小。从 100 开始,因为您只对有限数量的单词感兴趣。
  4. 使用 tsne / PCA 可视化您的向量并将它们投影到 2 或 3 维空间。
  5. 对不同的时期执行相同的操作,以查看向量如何收敛/发散。
  6. 很好地理解你的语料库也很重要,这样你就知道这些向量意味着什么以及它们是如何同时出现的。

希望这可以帮助。