赞
踩
本文翻译自 An Intuitive Understanding of Word Embeddings: From Count Vectors to Word2Vec
能力所限,部分翻译可能会不尽准确,可点击链接参考原文。
创作不易,转载请声明。
注: 原文中使用的表示 大多是 “Word Embeddings”, 一般应当翻译做 “词嵌入”, 但是现在一般会将之等同于 “Word vectorization”, 也就是我们现在常听到的词向量化,为了方便理解和记忆,这里直接将其翻译为“词向量化”
在开始之前,请看以下示例。
那么上面的例子有什么共同点?
您可能猜对了– TEXT处理。以上所有三个场景都处理大量文本,以执行不同范围的任务,例如google搜索示例中的聚类,第二个中的分类和第三个中的机器翻译。
人们可以非常直观地处理文本格式,但是如果我们一天要生成数百万个文档,我们就不能让人类执行以上三个任务。它既不可扩展,也不有效。
那么,既然我们知道计算机通常无法有效地处理和处理任何有效输出的字符串或文本,那么如何使今天的计算机对文本数据进行聚类,分类等呢?
当然,一台计算机可以匹配两个字符串,并告诉您它们是否相同。但是,当您搜索梅西时,我们如何使计算机告诉您有关足球或罗纳尔多的信息?您如何使计算机理解“苹果是美味的水果”中的“苹果”是可以食用的水果,而不是 苹果公司 呢?
上述问题的答案在于为单词创建表示形式,以捕获单词的含义,语义关系以及所使用的不同上下文类型。
所有这些都是通过使用词向量化或文本的数字表示实现的,以便计算机可以处理它们。
在下面,我们将正式地看到什么是词向量化及其不同类型,以及我们如何实际实现它们才能执行诸如返回有效的Google搜索结果之类的任务。
我们先来思考一个问题。
该任务的目的是检测推文中的仇恨言论。为了简单起见,我们说一条推文包含仇恨言论,如果该言论带有种族主义或性别歧视情绪。因此,任务是将种族主义或性别歧视推文与其他推文进行分类。
正式地,给定一条有关推文和标签的训练样本,其中标签“ 1”表示该推文是种族主义/性别歧视,标签“ 0”表示该推文不是种族主义者/性别歧视,您的目标是预测测试数据集上的仇恨标签。
用非常简单的术语来说,“词向量化”是将文本转换为数字,并且同一文本可能会有不同的数字表示形式。但是,在我们深入研究词向量化的细节之前,应该先问以下问题-为什么我们需要向量化?
事实证明,许多机器学习算法和几乎所有的深度学习架构都无法处理原始形式的*字符串 或纯文本 *。他们需要数字作为输入来执行任何种类的工作,无论是广义上的分类,回归等。由于文本格式中存在大量数据,因此必须从中提取知识并构建应用程序。文本应用程序的一些实际应用是–亚马逊等对评论的情感分析,Google对文档或新闻的分类或聚类等。
现在让我们正式定义词向量化。词向量化格式通常尝试使用字典将词映射到向量。让我们将这句话分解成更详细的细节,以清楚地看到。
让我们看一下这个示例– 句子 =“词向量化将单词转换为数字”
这句话中的一个单词可能是“向量化”或“数字”等。
一个*字典 *可能是在所有独特单词列表**句子。 因此,字典可能看起来像– [‘Word’,‘Embeddings’,‘are’,‘Converted’,‘into’,‘numbers’]
甲已经构造函数的单词的表示可以是独热编码矢量,其中1个代表其中该字存在和0其他地方的位置。根据上述字典,此格式中“数字”的向量表示为[0,0,0,0,0,1],转换后的值为[0,0,0,1,0,0]。
这只是一个非常简单的方法来表示矢量形式的单词。让我们看一下词向量化或词向量的不同类型,以及它们与其他词相比的优缺点。
词向量化的不同类型可以大致分为两类:
让我们尝试详细了解每种方法。
在此类别下,我们通常会遇到三种类型的向量。
让我们详细研究每种向量化方法。
考虑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将表示为–
现在,一列也可以理解为矩阵M中对应单词的单词向量。例如,上述矩阵中’lazy’的单词向量为[2,1],依此类推。这里,各行对应于语料库中的文档和列对应于词典中的标记。上面矩阵中的第二行可以读为– D2包含“lazy”:一次,“ Neeraj”:一次,“person”一次。
现在,在准备上述矩阵M时可能会有很多变化。这些变化通常会在-
为了便于理解,下面是矩阵M的代表性图像。
这是另一种基于频率方法的方法,但与计数向量化不同的是,它不仅考虑单个文档中单词的出现,还考虑整个语料库中的单词。那么,这背后的原理是什么?让我们尝试理解一下。
与对文档重要的单词相比,诸如“ is”,“ the”,“ a”等常见单词会经常出现。例如,与其他文档相比,Lionel Messi上的文档A将包含更多出现的单词“ Messi”。但是,几乎每个文档中,诸如“ the”等常见词也将以较高的频率出现。
理想情况下,我们希望减少在几乎所有文档中出现的常用单词,并更加重视出现在文档子集中的单词。
TF-IDF的工作原理是,通过给这些常用词分配较小的权重来对其进行惩罚,同时在特定文档中重视诸如Messi(梅西)之类的词。
那么,TF-IDF到底如何工作?
考虑下面的示例表,该表给出了两个文档中术语(标记/单词)的计数。
现在,让我们定义一些与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来说是一个重要的词。
伟大的想法 -相似的词往往会在一起出现,并且具有类似的上下文-例如,苹果是一种成果。芒果是一种水果。
苹果和芒果倾向于具有相似的背景,即水果。
在深入探讨共现矩阵的构造方式之前,有两个概念需要澄清:共现和上下文窗口。
共现–对于给定的语料,一对单词w1和w2的共现是它们在上下文窗口中一起出现的次数。
上下文窗口–上下文窗口由数字和方向指定。那么上下文窗口2(大约)意味着什么?让我们看下面的例子,
绿色单词是单词“ Fox”的2(周围)上下文窗口,为了计算共现,仅对这些单词进行计数。让我们看到“ Over”一词的上下文窗口。
现在,让我们以一个示例语料库来计算共现矩阵。
Corpus = He is not lazy. He is intelligent. He is smart.
让我们通过查看上表中的两个示例来了解此共现矩阵。红色和蓝色框。
红色框-这是上下文窗口2中出现“他”和“是”的次数,可以看出计数结果为4。下表将帮助您直观地看到计数。
而“lazy”一词从未在上下文窗口中与“ intelligent”一起出现,因此在蓝色框中被指定为0。
同现矩阵的变体
假设语料库中有V个唯一词。因此,词汇量=V。同现矩阵的列构成上下文词 s。共生矩阵的不同变化是-
但是,请记住,这个共现矩阵不是通常使用的单词矢量表示。取而代之的是,使用PCA,SVD等技术将该同现矩阵分解为因子,这些因子的组合形成词向量表示。
让我更清楚地说明这一点。例如,您对上述大小为V * V的矩阵执行PCA。您将获得V主成分。您可以从这些V分量中选择k个分量。因此,新矩阵将采用V * k的形式。
并且,单个单词而不是用V维表示,而是用k维表示,同时仍然捕获几乎相同的语义。k通常约为数百。
因此,PCA在后面所做的就是将共现矩阵分解为三个矩阵U,S和V,其中U和V都是正交矩阵。重要的是,U和S的点积表示单词矢量表示,而V表示单词上下文表示。
同现矩阵的优点
共现矩阵的缺点
先决条件:本部分假定您具有神经网络的工作原理以及更新NN中权重的机制的实用知识。如果您不熟悉神经网络,建议您阅读Sunil的这篇很棒的文章,以对NN的工作原理有一个很好的了解。
到目前为止,我们已经看到了确定词向量的确定性方法。但是,直到Mitolov等人将word2vec引入NLP社区之前,这些方法的词表示方式仍然受到限制。从某种意义上说,这些方法是基于预测的,因为它们为单词提供了概率,并被证明是诸如单词类比和单词相似性之类的任务的最新技术。他们还能够完成类似King-man + woman = Queen的任务,这被认为几乎是神奇的结果。因此,让我们看一下截至目前用于生成单词向量的word2vec模型。
Word2vec不是单个算法,而是两种技术的组合-CBOW(连续词袋)和Skip-gram模型。这两个都是浅层神经网络,它们将单词映射到目标变量,目标变量也是单词。这两种技术都学习用作词向量表示的权重。让我们分别讨论这两种方法,并直观地了解它们的工作原理。
CBOW的工作方式是在给定上下文的情况下倾向于预测单词的概率。上下文可以是单个单词或一组单词。但为简单起见,我将使用单个上下文词并尝试预测单个目标词。
假设我们有一个语料库C =“Hey, this is sample corpus using only one context word.”,并且我们定义了一个上下文窗口1。可以将该语料库转换为CBOW模型的训练集,如下所示。输入如下所示。下图右侧的矩阵包含左侧输入的一键编码。
单个数据点的目标即数据点4如下所示
上图中显示的矩阵被发送到一个浅层神经网络,该网络具有三层:输入层,隐藏层和输出层。输出层是softmax层,用于将在输出层中获得的概率求和为1。现在让我们看一下正向传播如何计算隐藏层激活。
首先让我们看一下CBOW模型的示意图。
下面是单个数据点的上述图像的矩阵表示。
流程如下:
我们看到了针对单个上下文单词的上述步骤。现在,如果我们有多个上下文词怎么办?下图描述了多个上下文单词的体系结构。
以下是上述架构的矩阵表示,以方便理解。
上面的图像使用了3个上下文词,并预测了目标词的概率。可以假定输入为输入层中三个红色编码的矢量,如上图所示(红色,蓝色和绿色)。
因此,输入层在输入中将具有3个 [1 * V]个向量,如上所示,在输出层中将具有1个 [1 XV]个向量。其余架构与1个上下文CBOW相同。
步骤保持不变,只是隐藏激活的计算发生了变化。不仅将输入隐藏的权重矩阵的对应行复制到隐藏层,还对矩阵的所有对应行取平均值。通过上图我们可以理解这一点。计算出的平均向量成为隐藏的激活。因此,如果我们针对单个目标词具有三个上下文词,则我们将具有三个初始隐藏激活,然后将其按元素进行平均以获得最终激活。
在单个上下文词和多个上下文词中,我都显示了图像,直到计算隐藏激活为止,因为这是CBOW与简单MLP网络不同的部分。计算隐藏层之后的步骤与本文提到的MLP的步骤相同- 从头开始理解和编码神经网络。
为理解清晰起见,以下提到了MLP和CBOW之间的差异:
wo:输出词
wi:上下文词
2.相对于隐藏输出权重和输入隐藏权重的误差梯度有所不同,因为MLP具有(通常)为S形的激活,但CBOW具有线性激活。但是,计算梯度的方法与MLP相同。
CBOW的优势:
CBOW的缺点:
跳过–克遵循与CBOW相同的拓扑。它只是颠覆了CBOW的体系结构。跳过语法的目的是预测给定单词的上下文。让我们采用与建立CBOW模型相同的语料库。C =“嘿,这是仅使用一个上下文词的示例语料库。”让我们构造训练数据。
skip-gram的输入向量将类似于1上下文CBOW模型。而且,直到隐藏层激活为止的计算都将是相同的。差异将在目标变量中。由于我们在两边都定义了一个1的上下文窗口,因此将有“ 两个”一个热编码目标变量和“ **两个”对应的输出,**如图像中的蓝色部分所示。
针对两个目标变量计算两个单独的误差,并将获得的两个误差矢量逐个元素相加以获得最终误差矢量,该误差矢量传播回以更新权重。
输入和隐藏层之间的权重被当作训练后的单词向量表示。损失函数或目标与CBOW模型的类型相同。
跳过语法架构如下所示。
为了更好地理解,下面显示了带有计算的矩阵样式结构。
让我们分解上图。
输入层大小 – [1 * V],输入隐藏权重矩阵大小 – [V* N],隐藏层中的神经元数量 – N,隐藏输出权重矩阵大小 – [NX*V],输出层大小– C [1 * V]
在上面的示例中,C是上下文单词的数量= 2,V = 10,N = 4
这是一个出色的交互式工具 ,可以可视化CBOW并在实际运行中跳过gram。我建议您真正通过此链接获得更好的理解。
由于词向量化或词向量是词之间上下文相似度的数字表示,因此可以对其进行操纵和制作,以执行出色的任务,例如-
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的一种有趣的可视化。
上图是二维向量中词向量的t-SNE表示,您可以看到已经捕获了两个苹果上下文。一个是水果,另一个是公司。
5.可用于执行机器翻译。
上图是双语向量化,绿色为中文,黄色为英语。如果我们知道中英文含义相似的单词,则可以使用上述双语向量化将一种语言翻译成另一种语言。
我们将使用谷歌的预训练模型。它包含300万个单词的词汇向量,这些词汇经过google新闻数据集中的大约1000亿个单词训练而成。该模型的下载链接在这里。注意它有1.5 GB的大小。
from
gensim.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'))
我们将在自定义语料库上训练我们自己的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情绪分析 | 检测推文中的仇恨言论 |
词向量化是一个活跃的研究领域,都在试图找出比现有单词更好的单词表示方式。但是,随着时间的流逝,它们的数量越来越大,越来越复杂。本文旨在简化这些向量化模型的某些工作,而又不承担数学上的开销。如果您认为我能够消除您的一些困惑,请在下面评论,欢迎任何建议~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。