使用word2vec嵌入句子

2024-09-28 01:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想比较一下不同句子中提到的同一个词的区别,例如“旅行”。 我想做的是:

  • 以提及“旅行”一词的句子为纯文本
  • 在每个句子中,将“旅行”替换为“旅行”
  • 根据这些句子训练word2vec模型
  • 计算行程1、行程2和其他重新标注的“行程”之间的距离 所以每个句子的“旅行”都有自己的向量,用于比较

我知道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)

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

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


Tags: andto数据模型movesentencesword2vec单词
3条回答

有趣的是,在word2vec模型上,您可以使用向量的T-SNE嵌入,并将维度减少到3,并使用任何绘图库(如matplotlib或dash)将其可视化。我还发现这些工具在可视化单词嵌入时很有用:https://projector.tensorflow.org/

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

如果你对比较句子感兴趣,Word2Vec不是最好的选择。结果表明,使用它来创建句子嵌入产生的结果不如专用的句子嵌入算法。如果您的数据集不是很大,则无法使用自己的数据创建(训练新的)嵌入空间。这迫使您对句子使用预先训练过的嵌入。幸运的是,现在这些已经足够了。我相信通用句子编码器(谷歌)将最适合您的需要

一旦你得到了你的句子的向量表示,你可以走两条路:

  1. 创建一个成对比较矩阵,并将其可视化为热图。当你有一些关于句子有多接近的先验知识,并且你想检查你的假设时,这种表述是有用的。你甚至可以try it onlineenter image description here
  2. 在向量表示上运行t-SNE。这将创建句子的二维投影,从而保持句子之间的相对距离。它比主成分分析更好地呈现数据。你可以很容易地找到某句话的邻居: enter image description here

你可以从thisthis中学到更多

请注意,word2vec本身并不是一种建模句子的方法,只是一种文字。因此,没有一种单一的、官方的方式使用word2vec来表示句子

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

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

其他算法实际上为较长的文本创建向量。与word2vec密切相关的一个浅层算法是“段落向量”,在Gensim中作为Doc2Vec类提供。但它仍然不是很复杂,仍然不懂语法。许多更深层次的网络文本模型,如BERT、ELMo和;其他可能是可能性

Word2vec&;相关的算法非常需要数据:它们所有的优点都来自于同一个单词的许多不同用法示例之间的拔河。因此,如果你有一个玩具大小的数据集,你将无法得到一组具有有用的相互关系的向量

但是,更大数据集中的稀有词也不会得到好的向量。在训练中,丢弃出现在某些min_count频率以下的单词是很典型的,因为它们的向量很差,仅仅是一个或几个特殊的样本使用,而且因为总共有许多这样的代表性不足的单词,保留它们往往会使其他单词向量更差,也它们是噪音

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

(通过(1)保留句子的原始版本,因此仍然可以得到一个travel向量,可以稍微抵消这些问题;(2)多次重复你的标记性错误句子,并在整个语料库中显示它们,以在某种程度上模拟合成上下文的更真实的出现。但如果没有真正的变化,这种单一上下文向量的大部分问题将仍然存在。)

比较travel_sent_Atravel_sent_B等的另一种可能方法是完全忽略traveltravel_sent_X的确切向量,而是为单词周围的N个单词编译一个摘要向量。例如,如果您有100个单词travel,创建100个向量,每个向量都是travel周围的N个单词。这些向量可能会显示一些模糊的簇/邻域,特别是在一个具有非常不同的交替含义的单词的情况下。(一些研究采用word2vec来解释多义现象,使用这种^{)影响/选择交替词义的方法。)

你可能也会发现,这项关于从话语的交替“原子”中提取词语的建模研究很有趣:Linear algebraic structure of word meanings

如果你有类似于标题的短文本,并且只有单词向量(没有数据或算法进行更深入的建模),你可能还想研究用于比较文本的“单词移动距离”计算。它不是将单个文本缩减为单个向量,而是将其建模为“一包文本”然后,它将距离定义为将一个袋子转换为另一个袋子的成本。(相似性越高的单词比相似性越低的单词更容易相互转换,因此非常相似的表达式,只替换了几个同义词,则表示非常接近。)

计算较长的文本可能会非常昂贵,但对于短短语和小标题/推文集/等可能很有效。它在GensimKeyedVector类中作为^{}提供。在本文中,它可能有助于发现各种关联:Navigating themes in restaurant reviews with Word Mover’s Distance

相关问题 更多 >

    热门问题