目录
词嵌入(Embedding)技术是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处理成连续且固定长度的向量,使模型可以学习和处理语义信息。
假设需要将["Are", "you", "OK","?"]转换成向量的形式作为神经网络的输入。
将["Are", "you", "OK","?"]转换为4*4的向量矩阵。
1.词嵌入的作用
-
捕捉语义关系
- 词嵌入能够将词汇映射到低维向量空间中,使得语义相近的词在向量空间中的位置也相近。例如,"国王""皇后""王子" 等词的向量会比较接近,因为它们在语义上有一定的关联性。
- 这种特性有助于计算机更好地理解词汇之间的语义关系,从而提高自然语言处理任务的准确性。
-
丰富语义信息
- 词向量不仅仅是简单的数字表示,它还蕴含了词汇的多种语义信息。例如,一个词的向量可能包含了其词性、词义、情感倾向等方面的信息。
- 这使得计算机在处理自然语言时能够更全面地考虑词汇的各种特征,从而做出更准确的判断。
-
降低数据维度
- 在自然语言处理中,词汇的数量通常非常庞大。如果采用传统的独热编码(one-hot encoding)方式表示词汇,向量的维度会非常高,且数据稀疏。词嵌入将词汇表示为低维向量,有效地降低了数据的维度。
- 降维后的向量不仅更易于存储和计算,还能减少计算资源的消耗,提高算法的运行效率。
-
加速计算过程
- 低维向量之间的计算速度通常比高维稀疏向量更快。在自然语言处理任务中,如文本分类、机器翻译等,需要频繁地计算词汇之间的相似度或进行矩阵运算。词嵌入提供的低维向量能够加速这些计算过程,提高算法的执行速度。
将高维的稀疏向量转换为浮点数的低维连续向量
进行PCA降维,可以发现语义相近的词语词语对应的向量位置也更相近。
具体来说,词嵌入技术具有以下几个重要作用:
首先,它有效地将自然语言中的词语,转换为数值向量表达词语之间的语义关系。这样一来,计算机可以更好地理解词语的含义和它们之间的关系,从而提高自然语言处理任务的准确性。
其次,词嵌入技术能够降低数据的维度,减少计算量和存储空间的需求。相比于传统的独热编码方式,词嵌入向量更加紧凑和高效。
此外,词嵌入技术为各种自然语言处理任务提供了丰富的语义信息。这些信息可以被用于文本分类、情感分析、机器翻译等任务中,帮助模型更好地理解和处理自然语言文本。
总之,词嵌入技术是自然语言处理领域中的一项重要技术,它为更高级的自然语言处理任务提供了有力的支持。
2.嵌入矩阵的计算
假设现在需要将["Are", "you", "OK","?"]中的每个词转换为128维的向量。
基于矩阵相乘的方法解释:
基于索引查找的方法解释
一、基于神经网络的方法
-
Word2Vec
-
FastText
- FastText 在 Word2Vec 的基础上进行改进,能够处理词的子词信息。它将每个词表示为字符 n-gram 的集合,然后通过神经网络学习词向量和子词向量。
- 在计算词嵌入矩阵时,FastText 会考虑词的全局信息和子词信息,从而提高对低频词和生僻词的表示效果。
二、基于矩阵分解的方法
-
潜在语义分析(Latent Semantic Analysis,LSA)
-
非负矩阵分解(Non-negative Matrix Factorization,NMF)
- NMF 是另一种矩阵分解方法,它要求分解后的矩阵元素都是非负的。对于词 - 文档矩阵X,NMF 试图找到两个非负矩阵W和H,使得X~=WH。
- 矩阵W的每一行对应一个词的低维向量表示,即词嵌入矩阵。在训练过程中,通过最小化重构误差来调整W和HH的参数。
三、基于全局词频统计的方法
- GloVe
- GloVe(Global Vectors for Word Representation)基于全局词频统计信息来学习词向量。它通过构建词 - 词共现矩阵X,其中Xij表示词i和词j在语料库中共同出现的次数。
- GloVe 定义了一个损失函数,通过最小化这个损失函数来学习词向量。损失函数考虑了词的局部上下文窗口和全局统计信息,能够有效地捕捉词语的语义和语法关系。
- 最终得到的词向量组成了词嵌入矩阵。
3.Embedding层的代码实验
python
from torchtext.vocab import Glove #导入GloVe词向量
# 简单介绍一下Glove词向量,它是斯坦福大学的研究者在2014年开发和发布的GloVe和word2vec与fasttext, # 是当前最常用的3个词向量版本
# 6B表示了模型是基于60亿个单词的语料库训练的在300表示一个单词,使用300维的向量表示
glove =GloVe(name='6B',dim=300)
python
# 使用nn.Embedding创建词嵌入层将qlove.vectors,通过from pretrained接口,导入到Embedding层中
# 此时的embedding层,就载入了Glove词向量数据
embedding = nn.Embedding.from_pretrained(glove.vectors)
# 打印embedding层中的weiqht的尺寸
print(f"embedding.shape :{embedding.weight.shape}")
程序输出:
embedding.shape: torch.size([400000,300])
python
#将man、king、queen等8个词语的词问量,绘制到二维平面上
words =['man', 'woman', 'king', 'queen', 'dog', 'mother', 'father']
indices =[]
for word in words: #将单词word,通过glove的词汇表,转换为单词的索引
index = glove.stoi[word] #将这些索引保存到indices数组中
indices.append(index) # 打印单词word和索引index的对应关系
print(f"{word}->{index}")
python
#将索引列表,使用torch.tensor,转为张量的形式
indices = torch.tensor(indices) # 将索引列表转换为,词向量的矩阵
vectors =embedding(indices).detach().numpy() #打印vector的尺寸
print(f"vectors.shape:{vectors.shape}")
输出结果:
python
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 使用PCA降维算法,将向量vectors进行降维
pca = PCA(n_components=2)
vectors_2d = pca.fit_transform(vectors)
# 将单词和向量,绘制到二维平面上
plt.scatter(vectors_2d[:, 0], vectors_2d[:, 1])
for i, word in enumerate(words):
plt.annotate(word,
xy=(vectors_2d[i, 0], vectors_2d[i, 1]),
xytext=(-10, 10),
textcoords='offset points')
plt.show()
参考链接: