在这篇文章中,我们已经解释了单词嵌入背后的想法,为什么它很重要,不同的单词嵌入算法,如嵌入层,word2Vec和其他算法。
目录:
-
词嵌入简介
-
词嵌入重要吗?
-
词嵌入算法
3.1.嵌入层
3.2.Word2Vec
3.2.1.跳格
3.2.2.连续词袋(CBOW)
3.3.GloVe -
结语
让我们开始吧。
词嵌入简介
也许你们中的一些人在阅读这篇文章时,对机器学习和如何使用它有基本的了解。机器学习通过使用数字建立的表格格式的数据集进行学习。但在这个世界上,并不是所有的东西都是由数字构成的。我们有一个由文字和句子构成的数据,而不是由数字构成的数据,怎么样?为了解决这个特殊问题,我们有NLP或自然语言处理。NLP只将单词转化为数字集,如果单词有类似或相同的含义呢?
词嵌入是最流行的文档词汇表示法之一。它能够捕捉到一个词在文档中的上下文,语义和句法的相似性,与其他词的关系,等等。
词嵌入实际上是一类技术,其中单个词被表示为预定义矢量空间中的实值矢量。每个词都被映射为一个向量,向量值的学习方式类似于神经网络,因此该技术经常被归入深度学习的领域。
词嵌入重要吗?
嗯,算是吧。假设你有两个句子,嘿,有一个伟大的日子和嘿,有一个好日子。听起来很相似吧?对我们人类来说,很容易知道这些句子有相似的意思。但是,机器或计算机如何知道这些句子有相似的含义?
如果我们对这些句子进行单热编码,我们将得到一个大小为6的单热编码向量。我们将得到一个稀疏的矩阵(矩阵的大部分数值为零),除了代表相应单词的索引元素外,该特定单词的数值为1:
Hey = [1,0,0,0,0,0,];
Have = [0,1,0,0,0,0];
a=[0,0,1,0,0,0] ;
good=[0,0,0,1,0,0] ;
great=[0,0,0,0,1,0] ;
day=[0,0,0,0,0,1]
我们的目标是让具有相似含义或背景的词占据接近的空间位置。这些向量之间的余弦角应该接近于1。
![Word Embedding [Complete Guide]](https://iq.opengenus.org/content/images/2021/09/ezgif.com-gif-maker.jpg)
词嵌入算法
词嵌入方法从文本中预定义的固定大小的词汇的向量表示中学习。学习过程要么与神经网络模型联合,如文档分类,要么是使用文档统计的无监督过程。
在本节中,我们将看到三种最流行的词嵌入算法。
- 嵌入层
- Word2Vec
- GloVe。
1.嵌入层
嵌入层主要用于自然语言处理(NLP)应用,如语言建模,也可用于其他涉及神经网络的任务。我们可以使用Keras嵌入层训练自己的嵌入。
如果我们像上面的例子那样使用一热编码,那么,如果我们只有10个词,也没有关系。如果我们有数以万计的词呢?这意味着10000个单词的词汇量要有10000个特征。这不是一个可行的方法,因为它需要大量的存储空间和计算成本来处理单词向量,并降低了模型效率。
嵌入层将每个词转换成固定大小的向量。由此产生的向量将有实值,而不是1和0,它帮助我们以更好的方式表示单词,同时减少维度。
使用Python实现
import tensorflow as tf
import numpy as np
model = tf.keras.models.Sequential(tf.keras.layers.Embedding(input_dim=10, output_dim=4, input_length=2))
model.compile('adam','mse')
我们在这个例子中使用了三个参数
- input_dim : 词汇量的大小
- output_dim : 每个词的向量的长度
- input_length : 一个序列的最大长度
现在让我们尝试将一个样本传递给我们的模型
example_data = np.array([[1,2]])
prediction = model.predict(example_data)
print(prediction)
输出结果将是
[[[-0.04762522 -0.01984248 0.02542869 0.00895121]
[-0.00362737 -0.04952393 0.00295565 0.00539055]]]
正如你在上面看到的,每个词,在这个例子中我们用1和2,用一个长度为4的向量表示。
print(model.get_weights())
[array([[-0.04712992, -0.02390954, -0.03724641, -0.00431691],
[-0.04762522, -0.01984248, 0.02542869, 0.00895121],
[-0.00362737, -0.04952393, 0.00295565, 0.00539055],
[ 0.01084892, 0.03391702, 0.02364905, -0.02012431],
[-0.02966552, -0.02163639, 0.01329075, 0.02944157],
[ 0.02609027, -0.019652 , -0.02144928, -0.00568701],
[ 0.04210575, 0.04411073, 0.00118216, 0.02990314],
[ 0.03721917, 0.01015004, -0.01026484, 0.04712752],
[ 0.02047607, -0.01568204, -0.00621259, -0.02511761],
[ 0.04750984, 0.02907586, 0.004831 , 0.00073004]],
dtype=float32)]
这些权重是词汇中的向量表示。这是一个大小为10×4的查找表,用于0到9个词。在这个例子中,我们没有训练这个模型。分配给向量的权重是随机初始化的。
2.Word2Vec
Word2Vec是一种NLP技术,使用神经网络作为它的算法。一旦经过训练,Word2Vec模型可以检测出具有相同或相似语义的单词,或者为部分句子建议额外的单词。
Word2Vec可以用两种涉及神经网络的方法完成"
- 跳过格拉姆
- 连续词袋(CBOW)
跳过格拉姆
Skip-Gram是一种无监督的学习技术,用于为给定的词语寻找最相关的词语。
![Word Embedding [Complete Guide]](https://iq.opengenus.org/content/images/2021/09/word-embedding-pic-2.png)
连续词袋(CBOW)
CBOW模型试图理解单词的上下文并将其作为输入。让我们把*"今天是个愉快的日子*"作为我们的例子。该模型将这个句子转化为不同形式的词对。用户将不得不设置窗口大小。如果窗口大小为2,那么词对将看起来像([it, a], is), ([is, pleasant], a), ([a, day], pleasant)。
有了这些词对,该模型就会尝试预测考虑到上下文的目标词。
![Word Embedding [Complete Guide]](https://iq.opengenus.org/content/images/2021/09/word-embedding-cbow.png)
3.GloVe
GloVe是一种无监督的学习算法,用于获得单词的向量表示。训练是在来自语料库的全局词-词共现统计数据上进行的,所得到的表征展示了词向量空间的有趣的线性子结构。GloVe的优势与Word2Vec不同,Word2Vec依赖于单词的局部语境信息,但也结合了全局统计数据(单词共现,基于计数的模型)来obatin单词向量。
如果你想看一个使用Python的GloVe的例子,那就去GitHub上的GloVe吧。
结论
词嵌入是一种非常通用的方法,可以教导计算机在单词之间的语义。每种方法都有它的优势和劣势。最后,感谢您的阅读!
通过OpenGenus的这篇文章,你一定对单词嵌入有了一个完整的概念。