【问题标题】:Sentences embedding using word2vec使用 word2vec 嵌入句子
【发布时间】:2020-12-26 00:16:10
【问题描述】:

我想比较不同句子中提到的同一个词之间的差异,例如“旅行”。 我想做的是:

  • 将提及“旅行”一词的句子作为纯文本;
  • 在每个句子中,将“travel”替换为 travel_sent_x。
  • 在这些句子上训练一个 word2vec 模型。
  • 计算 travel_sent1、travel_sent2 和其他重新标记的“旅行”提及之间的距离 所以每个句子的“旅行”都有自己的向量,用于比较。

我知道 word2vec 需要的不仅仅是几个句子来训练可靠的向量。官网推荐了几十亿字的数据集,但是我的数据集中没有这样的数字(我有几千字)。

我试图用以下几句话来测试模型:

    Sentences
    Hawaii makes a move to boost domestic travel and support local tourism
    Honolulu makes a move to boost travel and support local tourism
    Hawaii wants tourists to return so much it's offering to pay for half of their travel expenses

我构建向量的方法是:

from gensim.models import Word2Vec

vocab = df['Sentences']))
model = Word2Vec(sentences=vocab, size=100, window=10, min_count=3, workers=4, sg=0)
df['Sentences'].apply(model.vectorize)

但是我不知道如何可视化结果以查看它们的相似性并获得一些有用的见解。 欢迎任何帮助和建议。

更新:我会使用主成分分析算法来可视化 3 维空间中的嵌入。我知道如何处理每个单词,但我不知道如何处理句子。

【问题讨论】:

  • 目前还不是很清楚你到底想实现什么,word2vec在其中的作用是什么。获取相似的句子或可视化相似的词?
  • 嗨,伊格里尼斯。我想可视化类似的句子。相似度应该来自 word2vec(或其他工具)的使用,但最好基于文本语义

标签: python gensim word2vec embedding


【解决方案1】:

有趣的 word2vec 模型,您可以使用向量的 T-SNE 嵌入并将维数降低到 3,并使用任何绘图库(如 matplotlib 或 dash)将它们可视化。我还发现这个工具在可视化词嵌入时很有帮助:https://projector.tensorflow.org/

为不同上下文中的单词学习不同的词嵌入的想法是 ELMO(https://allennlp.org/elmo) 的前提,但是你需要一个庞大的训练集来训练它。幸运的是,如果您的应用程序不是很具体,您可以使用预训练模型。

【讨论】:

  • 感谢 ATIF ADIB。不幸的是,我的训练集并不庞大。我有数百个句子(所以有数千个单词),我想找到一种很好的方法来可视化它们之间的文本相似性。我的数据集中的句子与推文非常相似,但实际上它们是新闻的摘要(每个大约 200 个字符)。我不知道是否会有一个好的预训练模型。但是,我的主要困难是如何使用 word2vec 将空间中的句子可视化为数组(是否可能)
  • 如果您的目标是可视化句子,您可以使用 tf-idf 组合与句子中的单词对应的单个词向量,然后将它们可视化。
【解决方案2】:

请注意,word2vec 本质上不是一种用于建模句子的方法,只是用于建模单词。所以没有单一的、官方的方式来使用 word2vec 来表示句子。

曾经快速而粗略的方法是通过将所有词向量平均在一起来为句子(或其他多词文本)创建向量。它很快,总比没有好,并且在一些简单(广泛的主题)任务上还可以 - 但不能很好地捕捉文本的全部含义,特别是任何依赖于语法、多义词、或复杂的上下文提示。

不过,您可以使用它为每个短文本获取一个固定大小的向量,并计算这些向量之间的成对相似度/距离,并将结果输入到降维算法中以用于可视化或其他目的。

其他算法实际上为更长的文本创建向量。与 word2vec 密切相关的浅层算法是“段落向量”,在 Gensim 中作为 Doc2Vec 类可用。但它仍然不是很复杂,而且仍然不具备语法意识。 BERT、ELMo 等一些更深层次的网络文本模型可能是可能的。

Word2vec 和相关算法非常需要数据:它们的所有优点都来自同一个词的许多不同用法示例之间的拉锯战。因此,如果您有一个玩具大小的数据集,您将不会得到一组具有有用相互关系的向量。

而且,大型数据集中的稀有词也不会得到好的向量。在训练中通常会丢弃出现在某个 min_count 频率以下的词,就好像它们根本不存在一样——因为它们的向量不仅来自一个或几个特殊的样本用途,而且因为它们的向量很差。总共有许多这样的代表性不足的词,保留它们往往会使 other 词向量变得更糟。它们是噪音。

因此,您提出的将travel单个 个实例替换为单一外观标记的想法很可能会产生有趣的结果。将您的min_count 降低到 1 将为您提供每个变体的向量 - 但它们的质量会比您的其他词向量差得多(并且更随机),与其他词相比,它们受到的训练关注相对较少,并且每个完全受到其周围几个词的影响(而不是所有周围上下文的整个范围都可能有助于统一travel令牌的有用定位)。

(您可以通过以下方式稍微抵消这些问题:(1)保留句子的原始版本,因此您仍然会得到一个travel 向量;(2)多次重复您的标记损坏的句子, & 将它们打乱以出现在整个语料库中,以在某种程度上模拟合成上下文的更多真实事件。但如果没有真正的多样性,这种单一上下文向量的大部分问题将仍然存在。)

比较travel_sent_Atravel_sent_B 等的另一种可能方法是完全忽略traveltravel_sent_X 的确切向量,而是为单词周围的N 个单词编译一个摘要向量。例如,如果您有 100 个单词 travel 的示例,请创建 100 个向量,分别代表 N 个单词 around 旅行。这些向量可能会显示一些模糊的集群/邻域,尤其是在具有非常不同的替代含义的单词的情况下。 (一些采用 word2vec 来解释多义词的研究使用这种context vector 方法来影响/选择替代词义。)

您可能还会发现这项关于将单词建模为从话语的替代“原子”中提取的研究很有趣:Linear algebraic structure of word meanings

如果您有类似标题的短文本,并且只有词向量(没有数据或算法来进行更深入的建模),您可能还需要查看“Word Mover's Distance”计算来比较文本。它不是将单个文本简化为单个向量,而是将其建模为“词向量包”。然后,它将距离定义为将一个包转换为另一个包的成本。 (更相似的词比不相似的词更容易相互转换,因此非常相似的表达,仅替换了几个同义词,报告为非常接近。)

计算较长的文本可能会非常昂贵,但对于简短的短语和少量的标题/推文/等可能效果很好。它在 Gensim KeyedVector 类上可用 wmdistance()。本文中可能对发现有用的相关类型的示例:Navigating themes in restaurant reviews with Word Mover’s Distance

【讨论】:

    【解决方案3】:

    如果您对比较句子感兴趣,Word2Vec 不是最佳选择。结果表明,使用它来创建句子嵌入产生的结果比专用的句子嵌入算法差。如果您的数据集不是很大,则无法使用自己的数据创建(训练新的)嵌入空间。这迫使您对句子使用预先训练的嵌入。幸运的是,如今这些人已经足够多了。我相信 Universal Sentence Encoder(由 Google 提供)将最适合您的需求。

    一旦获得句子的向量表示,您可以采用两种方式:

    1. 创建成对比较矩阵并将其可视化为热图。当您对句子的接近程度有一些先验知识并且想要检查您的假设时,此表示很有用。你甚至可以try it online
    2. 在向量表示上运行 t-SNE。这将创建句子的 2D 投影,以保持它们之间的相对距离。它提供的数据比 PCA 好得多。比你可以很容易地找到某个句子的邻居:

    您可以通过thisthis 了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2021-11-27
      • 1970-01-01
      • 2021-02-11
      • 2018-06-09
      • 2021-11-18
      相关资源
      最近更新 更多