(译)对词向量化的直观理解:从计数向量到Word2Vec 您所在的位置:网站首页 建筑结构术语怎么理解这个词 (译)对词向量化的直观理解:从计数向量到Word2Vec

(译)对词向量化的直观理解:从计数向量到Word2Vec

2024-07-04 13:14| 来源: 网络整理| 查看: 265

本文翻译自 An Intuitive Understanding of Word Embeddings: From Count Vectors to Word2Vec 能力所限,部分翻译可能会不尽准确,可点击链接参考原文。 创作不易,转载请声明。

注: 原文中使用的表示 大多是 “Word Embeddings”, 一般应当翻译做 “词嵌入”, 但是现在一般会将之等同于 “Word vectorization”, 也就是我们现在常听到的词向量化,为了方便理解和记忆,这里直接将其翻译为“词向量化”

介绍

在开始之前,请看以下示例。

您打开Goog​​le并搜索有关正在进行的冠军奖杯的新闻文章,并获得数百个搜索结果作为回报。Nate Silver 分析了数百万条推文,并正确预测了2008年美国总统选举中50个州中的49个州的结果。您在google中输入英文翻译的句子并获得等效的中文转换。

image.png

那么上面的例子有什么共同点?

您可能猜对了– TEXT处理。以上所有三个场景都处理大量文本,以执行不同范围的任务,例如google搜索示例中的聚类,第二个中的分类和第三个中的机器翻译。

人们可以非常直观地处理文本格式,但是如果我们一天要生成数百万个文档,我们就不能让人类执行以上三个任务。它既不可扩展,也不有效。

image.png

那么,既然我们知道计算机通常无法有效地处理和处理任何有效输出的字符串或文本,那么如何使今天的计算机对文本数据进行聚类,分类等呢?

当然,一台计算机可以匹配两个字符串,并告诉您它们是否相同。但是,当您搜索梅西时,我们如何使计算机告诉您有关足球或罗纳尔多的信息?您如何使计算机理解“苹果是美味的水果”中的“苹果”是可以食用的水果,而不是 苹果公司 呢?

上述问题的答案在于为单词创建表示形式,以捕获单词的含义,语义关系以及所使用的不同上下文类型。

所有这些都是通过使用词向量化或文本的数字表示实现的,以便计算机可以处理它们。

在下面,我们将正式地看到什么是词向量化及其不同类型,以及我们如何实际实现它们才能执行诸如返回有效的Google搜索结果之类的任务。

将词向量化应用于文本分类的项目

我们先来思考一个问题。

问题陈述

该任务的目的是检测推文中的仇恨言论。为了简单起见,我们说一条推文包含仇恨言论,如果该言论带有种族主义或性别歧视情绪。因此,任务是将种族主义或性别歧视推文与其他推文进行分类。

正式地,给定一条有关推文和标签的训练样本,其中标签“ 1”表示该推文是种族主义/性别歧视,标签“ 0”表示该推文不是种族主义者/性别歧视,您的目标是预测测试数据集上的仇恨标签。

在此可跳转到源网站练习

目录 什么是词向量化?不同类型的词向量化 2.1基于频率的向量化 2.1.1计数向量 2.1.2 TF-IDF 2.1.3共现矩阵 2.2基于预测的向量化 2.2.1 CBOW 2.2.2 Skip-Gram词向量化用例场景(使用词向量化可以完成所有操作吗?例如:相似性,奇数等)使用预训练的单词向量训练自己的单词向量尾注 1.什么是词向量化?

用非常简单的术语来说,“词向量化”是将文本转换为数字,并且同一文本可能会有不同的数字表示形式。但是,在我们深入研究词向量化的细节之前,应该先问以下问题-为什么我们需要向量化?

事实证明,许多机器学习算法和几乎所有的深度学习架构都无法处理原始形式的*字符串 或纯文本 *。他们需要数字作为输入来执行任何种类的工作,无论是广义上的分类,回归等。由于文本格式中存在大量数据,因此必须从中提取知识并构建应用程序。文本应用程序的一些实际应用是–亚马逊等对评论的情感分析,Google对文档或新闻的分类或聚类等。

现在让我们正式定义词向量化。词向量化格式通常尝试使用字典将词映射到向量。让我们将这句话分解成更详细的细节,以清楚地看到。

让我们看一下这个示例– 句子 =“词向量化将单词转换为数字”

这句话中的一个单词可能是“向量化”或“数字”等。

一个*字典 *可能是在所有独特单词列表**句子。 因此,字典可能看起来像– [‘Word’,‘Embeddings’,‘are’,‘Converted’,‘into’,‘numbers’]

甲已经构造函数的单词的表示可以是独热编码矢量,其中1个代表其中该字存在和0其他地方的位置。根据上述字典,此格式中“数字”的向量表示为[0,0,0,0,0,1],转换后的值为[0,0,0,1,0,0]。

这只是一个非常简单的方法来表示矢量形式的单词。让我们看一下词向量化或词向量的不同类型,以及它们与其他词相比的优缺点。

2.不同类型的词向量化

词向量化的不同类型可以大致分为两类:

基于频率的向量化基于预测的向量化

让我们尝试详细了解每种方法。

2.1基于频率的向量化

在此类别下,我们通常会遇到三种类型的向量。

计数向量TF-IDF向量共现向量

让我们详细研究每种向量化方法。

2.1.1计数向量

考虑D文档{d1,d2……dD}的语料库C,以及从语料库C中提取的N个唯一标记。N个标记将构成我们的字典,并且Count Vector矩阵M的大小将由DX N给出。矩阵M中的每一行都包含文档D(i)中令牌的频率。

让我们用一个简单的例子来理解这一点。

D1:他是一个懒惰的男孩。她也很懒。

D2:Neeraj是个懒人。

创建的词典可以是语料库中唯一的标记(单词)的列表= [‘He’,‘She’,‘lazy’,‘boy’,‘Neeraj’,‘person’]

在这里,D = 2,N = 6

大小为2 X 6的计数矩阵M将表示为–

image.png

现在,一列也可以理解为矩阵M中对应单词的单词向量。例如,上述矩阵中’lazy’的单词向量为[2,1],依此类推。这里,各行对应于语料库中的文档和列对应于词典中的标记。上面矩阵中的第二行可以读为– D2包含“lazy”:一次,“ Neeraj”:一次,“person”一次。

现在,在准备上述矩阵M时可能会有很多变化。这些变化通常会在-

准备字典的方式。 为什么 这么说?因为在现实世界的应用程序中,我们可能会有一个包含数百万个文档的语料库。借助数百万个文档,我们可以提取数亿个独特的单词。因此,基本上,将如上所述准备的矩阵将是非常稀疏的矩阵,并且对于任何计算而言都是低效的。因此,将每个唯一单词用作词典元素的替代方法是根据频率选择前10,000个单词,然后准备词典。每个单词的计数方式。 我们可以采用频率(单词出现在文档中的次数)或存在(单词出现在文档中吗?)作为计数矩阵M中的条目。但是通常,频率方法比方法更适合后者。

为了便于理解,下面是矩阵M的代表性图像。

image.png

2.1.2 TF-IDF矢量化

这是另一种基于频率方法的方法,但与计数向量化不同的是,它不仅考虑单个文档中单词的出现,还考虑整个语料库中的单词。那么,这背后的原理是什么?让我们尝试理解一下。

与对文档重要的单词相比,诸如“ is”,“ the”,“ a”等常见单词会经常出现。例如,与其他文档相比,Lionel Messi上的文档A将包含更多出现的单词“ Messi”。但是,几乎每个文档中,诸如“ the”等常见词也将以较高的频率出现。

理想情况下,我们希望减少在几乎所有文档中出现的常用单词,并更加重视出现在文档子集中的单词。

TF-IDF的工作原理是,通过给这些常用词分配较小的权重来对其进行惩罚,同时在特定文档中重视诸如Messi(梅西)之类的词。

那么,TF-IDF到底如何工作?

考虑下面的示例表,该表给出了两个文档中术语(标记/单词)的计数。

image.png

现在,让我们定义一些与TF-IDF相关的术语。

TF =(术语t在文档中出现的次数)/(所有术语在文档中出现的次数)

因此,TF(This,Document1)= 1/8

TF(This,Document2)= 1/5

它表示单词对文档的贡献,即与文档相关的单词应经常出现。例如:有关Messi的文件应包含大量“Messi”字样。

IDF = log(N / n),其中N是文档数,n是出现术语t的文档数。

其中N是文档数,n是出现术语t的文档数。

因此,IDF(This)= log(2/2)= 0。

那么,我们如何解释IDF背后的原因?理想情况下,如果一个单词出现在所有文档中,则该单词可能与特定文档无关。但是,如果它出现在一部分文档中,则该单词可能与其所在的文档有些相关。

让我们为单词“ Messi”计算IDF。

IDF(Messi)= log(2/1)= 0.301。

现在,让我们比较一下TF-IDF中常见的单词“ This”和单词“ Messi”,该单词似乎与文档1有关。

TF-IDF(This,Document1)=(1/8)*(0)= 0

TF-IDF(This,Document2)=(1/5)*(0)= 0

TF-IDF(Messi,Document1)=(4/8)* 0.301 = 0.15

如您所见,对于Document1,TF-IDF方法严重惩罚了单词’This’,但为’Messi’分配了更大的权重。因此,从整个语料库的上下文来看,“Messi”对于Document1来说是一个重要的词。

2.1.3具有固定上下文窗口的共现矩阵

伟大的想法 -相似的词往往会在一起出现,并且具有类似的上下文-例如,苹果是一种成果。芒果是一种水果。 苹果和芒果倾向于具有相似的背景,即水果。

在深入探讨共现矩阵的构造方式之前,有两个概念需要澄清:共现和上下文窗口。

共现–对于给定的语料,一对单词w1和w2的共现是它们在上下文窗口中一起出现的次数。

上下文窗口–上下文窗口由数字和方向指定。那么上下文窗口2(大约)意味着什么?让我们看下面的例子,

image.png

绿色单词是单词“ Fox”的2(周围)上下文窗口,为了计算共现,仅对这些单词进行计数。让我们看到“ Over”一词的上下文窗口。

image.png

现在,让我们以一个示例语料库来计算共现矩阵。

Corpus = He is not lazy. He is intelligent. He is smart.

image.png

让我们通过查看上表中的两个示例来了解此共现矩阵。红色和蓝色框。

红色框-这是上下文窗口2中出现“他”和“是”的次数,可以看出计数结果为4。下表将帮助您直观地看到计数。

image.png

而“lazy”一词从未在上下文窗口中与“ intelligent”一起出现,因此在蓝色框中被指定为0。

同现矩阵的变体

假设语料库中有V个唯一词。因此,词汇量=V。同现矩阵的列构成上下文词 s。共生矩阵的不同变化是-

大小为V * V的共现矩阵。现在,即使是体面的语料库V也变得非常大且难以处理。因此,一般来讲,这种架构在实践中绝不是首选。大小为V * N的共现矩阵,其中N是V的子集,可以通过删除不相关的词(例如停用词等)来获得。这仍然很大,并且存在计算困难。

但是,请记住,这个共现矩阵不是通常使用的单词矢量表示。取而代之的是,使用PCA,SVD等技术将该同现矩阵分解为因子,这些因子的组合形成词向量表示。

让我更清楚地说明这一点。例如,您对上述大小为V * V的矩阵执行PCA。您将获得V主成分。您可以从这些V分量中选择k个分量。因此,新矩阵将采用V * k的形式。

并且,单个单词而不是用V维表示,而是用k维表示,同时仍然捕获几乎相同的语义。k通常约为数百。

因此,PCA在后面所做的就是将共现矩阵分解为三个矩阵U,S和V,其中U和V都是正交矩阵。重要的是,U和S的点积表示单词矢量表示,而V表示单词上下文表示。

image.png

同现矩阵的优点

它保留了单词之间的语义关系。即男人和女人往往比男人和苹果更接近。它以SVD为核心,比现有方法产生更准确的单词向量表示。它使用因式分解,这是一个明确定义的问题,可以有效解决。它必须计算一次,并且可以在计算后随时使用。从这个意义上讲,它比其他方法更快。

共现矩阵的缺点

需要大量内存来存储共现矩阵。 但是,可以通过将矩阵分解到系统外(例如在Hadoop集群等中)来解决此问题,并可以将其保存下来。 2.2基于预测的向量

先决条件:本部分假定您具有神经网络的工作原理以及更新NN中权重的机制的实用知识。如果您不熟悉神经网络,建议您阅读Sunil的这篇很棒的文章,以对NN的工作原理有一个很好的了解。

到目前为止,我们已经看到了确定词向量的确定性方法。但是,直到Mitolov等人将word2vec引入NLP社区之前,这些方法的词表示方式仍然受到限制。从某种意义上说,这些方法是基于预测的,因为它们为单词提供了概率,并被证明是诸如单词类比和单词相似性之类的任务的最新技术。他们还能够完成类似King-man + woman = Queen的任务,这被认为几乎是神奇的结果。因此,让我们看一下截至目前用于生成单词向量的word2vec模型。

Word2vec不是单个算法,而是两种技术的组合-CBOW(连续词袋)和Skip-gram模型。这两个都是浅层神经网络,它们将单词映射到目标变量,目标变量也是单词。这两种技术都学习用作词向量表示的权重。让我们分别讨论这两种方法,并直观地了解它们的工作原理。

2.2.1 CBOW(连续词袋)

CBOW的工作方式是在给定上下文的情况下倾向于预测单词的概率。上下文可以是单个单词或一组单词。但为简单起见,我将使用单个上下文词并尝试预测单个目标词。

假设我们有一个语料库C =“Hey, this is sample corpus using only one context word.”,并且我们定义了一个上下文窗口1。可以将该语料库转换为CBOW模型的训练集,如下所示。输入如下所示。下图右侧的矩阵包含左侧输入的一键编码。

image.png

单个数据点的目标即数据点4如下所示

image.png

上图中显示的矩阵被发送到一个浅层神经网络,该网络具有三层:输入层,隐藏层和输出层。输出层是softmax层,用于将在输出层中获得的概率求和为1。现在让我们看一下正向传播如何计算隐藏层激活。

首先让我们看一下CBOW模型的示意图。

image.png

下面是单个数据点的上述图像的矩阵表示。

image.png

流程如下:

输入层和目标都进行了一次热编码,大小为[1 * V]。在上面的示例中,V = 10。有两组权重。一个在输入层与隐藏层之间,第二个在隐藏层与输出层之间。 输入隐藏层矩阵大小= [VN],隐藏输出层矩阵大小= [NV]:其中N是我们选择用来表示单词的维数。它是神经网络的任意参数和超参数。同样,N是隐藏层中神经元的数量。在此,N = 4。任何层之间都没有激活功能。(更具体地说,我指的是线性激活)输入乘以输入隐藏权重,称为隐藏激活。它只是复制的输入隐藏矩阵中的相应行。隐藏的输入乘以隐藏的输出权重,即可计算出输出。计算输出和目标之间的误差,并传播回去以重新调整权重。隐藏层和输出层之间的权重被用作单词的单词向量表示。

我们看到了针对单个上下文单词的上述步骤。现在,如果我们有多个上下文词怎么办?下图描述了多个上下文单词的体系结构。

image.png

以下是上述架构的矩阵表示,以方便理解。

image.png

上面的图像使用了3个上下文词,并预测了目标词的概率。可以假定输入为输入层中三个红色编码的矢量,如上图所示(红色,蓝色和绿色)。

因此,输入层在输入中将具有3个 [1 * V]个向量,如上所示,在输出层中将具有1个 [1 XV]个向量。其余架构与1个上下文CBOW相同。

步骤保持不变,只是隐藏激活的计算发生了变化。不仅将输入隐藏的权重矩阵的对应行复制到隐藏层,还对矩阵的所有对应行取平均值。通过上图我们可以理解这一点。计算出的平均向量成为隐藏的激活。因此,如果我们针对单个目标词具有三个上下文词,则我们将具有三个初始隐藏激活,然后将其按元素进行平均以获得最终激活。

在单个上下文词和多个上下文词中,我都显示了图像,直到计算隐藏激活为止,因为这是CBOW与简单MLP网络不同的部分。计算隐藏层之后的步骤与本文提到的MLP的步骤相同- 从头开始理解和编码神经网络。

为理解清晰起见,以下提到了MLP和CBOW之间的差异:

MLP中的目标函数是MSE(均方误差),而在CBOW中,它是给定上下文( 即 log(p(wo / wi)) )的单词的负对数,其中p(wo / wi)是给定的如

image.png

wo:输出词 wi:上下文词

2.相对于隐藏输出权重和输入隐藏权重的误差梯度有所不同,因为MLP具有(通常)为S形的激活,但CBOW具有线性激活。但是,计算梯度的方法与MLP相同。

CBOW的优势:

概率是自然,它应该表现出比确定性方法更好的(通常)。内存不足。它不需要像共现矩阵那样需要巨大的RAM需求,因为它需要存储三个巨大的矩阵。

CBOW的缺点:

CBOW取一个单词上下文的平均值(如上图所示,用于计算隐藏激活)。例如,苹果既可以是水果,也可以是公司,但CBOW会同时获取两种情况的平均值,并将其置于水果和公司的集群之间。如果未进行适当的优化,从头开始培训CBOW可能会花费很多时间。 2.2.2跳过–语法模型

跳过–克遵循与CBOW相同的拓扑。它只是颠覆了CBOW的体系结构。跳过语法的目的是预测给定单词的上下文。让我们采用与建立CBOW模型相同的语料库。C =“嘿,这是仅使用一个上下文词的示例语料库。”让我们构造训练数据。

image.png

skip-gram的输入向量将类似于1上下文CBOW模型。而且,直到隐藏层激活为止的计算都将是相同的。差异将在目标变量中。由于我们在两边都定义了一个1的上下文窗口,因此将有“ 两个”一个热编码目标变量和“ **两个”对应的输出,**如图像中的蓝色部分所示。

针对两个目标变量计算两个单独的误差,并将获得的两个误差矢量逐个元素相加以获得最终误差矢量,该误差矢量传播回以更新权重。

输入和隐藏层之间的权重被当作训练后的单词向量表示。损失函数或目标与CBOW模型的类型相同。

跳过语法架构如下所示。

image.png

为了更好地理解,下面显示了带有计算的矩阵样式结构。

image.png

让我们分解上图。

输入层大小 – [1 * V],输入隐藏权重矩阵大小 – [V* N],隐藏层中的神经元数量 – N,隐藏输出权重矩阵大小 – [NX*V],输出层大小– C [1 * V]

在上面的示例中,C是上下文单词的数量= 2,V = 10,N = 4

红色的行是对应于输入的一键编码矢量的隐藏激活。它基本上是复制的输入隐藏矩阵的相应行。黄色矩阵是隐藏层和输出层之间的权重。通过隐藏激活和隐藏输出权重的矩阵乘法获得蓝色矩阵。将为两个目标(上下文)词计算两行。蓝色矩阵的每一行分别转换为其softmax概率,如绿色框所示。灰度矩阵包含两个上下文词(目标)的一个热编码向量。通过从元素矩阵的绿色矩阵(输出)的第一行减去灰色矩阵(目标)的第一行来计算误差。对于下一行重复此过程。因此,对于n个 目标上下文词,我们将具有n个误差向量。对所有误差向量取逐个元素的和,以获得最终误差向量。该误差向量被传播回以更新权重。 Skip-Gram模型的优点 跳过语法模型可以捕获单个单词的两种语义。即它将具有Apple的两个矢量表示。一个用于公司,另一个用于水果。带有负子采样的跳过图通常胜过其他所有方法。

这是一个出色的交互式工具 ,可以可视化CBOW并在实际运行中跳过gram。我建议您真正通过此链接获得更好的理解。

3.词向量化用例场景

由于词向量化或词向量是词之间上下文相似度的数字表示,因此可以对其进行操纵和制作,以执行出色的任务,例如-

查找两个词之间的相似度。 model.similarity('woman','man') 0.73723527寻找一个奇怪的。 model.doesnt_match('breakfast cereal dinner lunch';.split()) 'cereal'女人+国王男人=女王之类的惊人事物 model.most_similar(positive=['woman','king'],negative=['man'],topn=1) queen: 0.508模型下文本的概率 model.score(['The fox jumped over the lazy dog'.split()]) 0.21

以下是word2vec的一种有趣的可视化。

image.png

上图是二维向量中词向量的t-SNE表示,您可以看到已经捕获了两个苹果上下文。一个是水果,另一个是公司。

5.可用于执行机器翻译。 image.png

上图是双语向量化,绿色为中文,黄色为英语。如果我们知道中英文含义相似的单词,则可以使用上述双语向量化将一种语言翻译成另一种语言。

4.使用预训练的词向量

我们将使用谷歌的预训练模型。它包含300万个单词的词汇向量,这些词汇经过google新闻数据集中的大约1000亿个单词训练而成。该模型的下载链接在这里。注意它有1.5 GB的大小。

fromgensim.models import Word2Vec

#loading the downloaded model model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True, norm_only=True)

#the model is loaded. It can be used to perform all of the tasks mentioned above.

# getting word vectors of a word dog = model['dog']

#performing king queen magic print(model.most_similar(positive=['woman', 'king'], negative=['man']))

#picking odd one out print(model.doesnt_match("breakfast cereal dinner lunch".split()))

#printing similarity index print(model.similarity('woman', 'man'))

5.训练自己的单词向量

我们将在自定义语料库上训练我们自己的word2vec。为了训练模型,我们将使用gensim,步骤如下所示。

word2Vec要求使用列表列表格式进行培训,其中每个文档都包含在列表中,每个列表都包含该文档的标记列表。我不会在这里讨论预处理部分。因此,让我们以列表的示例列表来训练我们的word2vec模型。

sentence=[[‘Neeraj’,’Boy’],[‘Sarwan’,’is’],[‘good’,’boy’]]

#training word2vec on 3 sentences model = gensim.models.Word2Vec(sentence, min_count=1,size=300,workers=4)

让我们尝试了解该模型的参数。

sentence – 我们的语料库列表的列表 min_count=1 单词的阈值。频率大于此频率的单词将仅包含在模型中。 size=300 我们用来代表我们的单词的维数,这是单词向量的大小。 workers=4 用于并行化

#using the model #The new trained model can be used similar to the pre-trained ones.

#printing similarity index print(model.similarity('woman', 'man'))

项目

现在,该开始尝试并实际使用其他一些实际数据集了。那么,您准备好接受挑战了吗?通过以下实践问题来加速您的NLP旅程:

| 练习题:识别情绪 | 识别推文的情绪 | | 练习题:Twitter情绪分析 | 检测推文中的仇恨言论 |

6.结束语

词向量化是一个活跃的研究领域,都在试图找出比现有单词更好的单词表示方式。但是,随着时间的流逝,它们的数量越来越大,越来越复杂。本文旨在简化这些向量化模型的某些工作,而又不承担数学上的开销。如果您认为我能够消除您的一些困惑,请在下面评论,欢迎任何建议~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有