词嵌入的完整指南

505 阅读5分钟

在这篇文章中,我们已经解释了单词嵌入背后的想法,为什么它很重要,不同的单词嵌入算法,如嵌入层,word2Vec和其他算法。

目录:

  1. 词嵌入简介

  2. 词嵌入重要吗?

  3. 词嵌入算法
    3.1.嵌入层
    3.2.Word2Vec
    3.2.1.跳格
    3.2.2.连续词袋(CBOW)
    3.3.GloVe

  4. 结语

让我们开始吧。

词嵌入简介

也许你们中的一些人在阅读这篇文章时,对机器学习和如何使用它有基本的了解。机器学习通过使用数字建立的表格格式的数据集进行学习。但在这个世界上,并不是所有的东西都是由数字构成的。我们有一个由文字和句子构成的数据,而不是由数字构成的数据,怎么样?为了解决这个特殊问题,我们有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]

词嵌入算法

词嵌入方法从文本中预定义的固定大小的词汇的向量表示中学习。学习过程要么与神经网络模型联合,如文档分类,要么是使用文档统计的无监督过程。

在本节中,我们将看到三种最流行的词嵌入算法。

  • 嵌入层
  • 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]

连续词袋(CBOW)

CBOW模型试图理解单词的上下文并将其作为输入。让我们把*"今天是个愉快的日子*"作为我们的例子。该模型将这个句子转化为不同形式的词对。用户将不得不设置窗口大小。如果窗口大小为2,那么词对将看起来像([it, a], is), ([is, pleasant], a), ([a, day], pleasant)。

有了这些词对,该模型就会尝试预测考虑到上下文的目标词。

Word Embedding [Complete Guide]

3.GloVe

GloVe是一种无监督的学习算法,用于获得单词的向量表示。训练是在来自语料库的全局词-词共现统计数据上进行的,所得到的表征展示了词向量空间的有趣的线性子结构。GloVe的优势与Word2Vec不同,Word2Vec依赖于单词的局部语境信息,但也结合了全局统计数据(单词共现,基于计数的模型)来obatin单词向量。

如果你想看一个使用Python的GloVe的例子,那就去GitHub上的GloVe吧。

结论

词嵌入是一种非常通用的方法,可以教导计算机在单词之间的语义。每种方法都有它的优势和劣势。最后,感谢您的阅读!

通过OpenGenus的这篇文章,你一定对单词嵌入有了一个完整的概念。