1.1 什么是词向量
词向量(Word Embedding)是自然语言处理(NLP)中用来表示词汇的一种高维向量。这种向量通常是通过训练神经网络模型从大量文本数据中学习得到的,能够捕捉词汇之间的语义和语法关系。
传统的词表示方法是基于独热编码(One-Hot Encoding),即为每个词在词汇表中分配一个唯一的索引,然后创建一个与词汇表大小相同的向量,其中只有该词的索引位置为1,其余位置为0。然而,这种方法存在几个问题:
-
维度灾难:随着词汇表的增大,向量的维度也会急剧增加,导致计算效率低下。
-
语义缺失:独热编码无法表示词汇之间的语义关系,例如“猫”和“狗”在语义上是相近的,但它们的独热编码表示却是完全独立的。
为了克服这些问题,研究者们提出了词向量的概念。词向量是一种低维、稠密的向量表示,通常维度在几十到几百之间。每个词都被映射到一个这样的向量上,并且向量之间的相似性可以反映词汇之间的语义关系。
词向量的训练通常基于无监督学习的方法,例如Word2Vec(包括Skip-Gram和CBOW两种模型)、GloVe、FastText等。这些模型通过最大化文本序列中词汇的共现概率来学习词向量,使得在语义上相近的词汇在向量空间中的距离也更近。
词向量在NLP任务中有着广泛的应用,例如文本分类、情感分析、命名实体识别、机器翻译等。通过将文本中的词汇表示为词向量,可以将NLP任务转化为机器学习问题,并利用各种机器学习算法进行建模和预测。此外,词向量还可以作为特征输入到深度学习模型中,以进一步提高模型的性能。
1.2⽂本张量表示⽅法
什么是⽂本张量表示
将⼀段⽂本使⽤张量进⾏表示,其中⼀般将词汇为表示成向量,称作词向量,再由各个词向
量按顺序组成矩阵形成⽂本表示.
["⼈⽣", "该", "如何", "起头"] ==> # 每个词对应矩阵中的⼀个向量 [[1.32, 4,32, 0,32, 5.2], [3.1, 5.43, 0.34, 3.2], [3.21, 5.32, 2, 4.32], [2.54, 7.32, 5.12, 9.54]]
⽂本张量表示的作⽤:
将⽂本表示成张量(矩阵)形式,能够使语⾔⽂本可以作为计算机处理程序的输⼊,进 ⾏接下来⼀系列的解析⼯作.
2 常见的词向量模型
2.1one-hot编码
one-hot编码
无论是人类还是计算机都很难直接将语言字符进行计算。我们期望着把语言字符转换为一种便于计算的形式,也就是把对应的词汇用数值类型的数据进行唯一表示。最简单的一种将语言字符转换为便于计算的一种方式就是one-hot编码。
Color ----- red green blue red
结果
Color_red Color_green Color_blue --------- ----------- ---------- 1 0 0 0 1 0 0 0 1 1 0 0
在这个例子中,我们为每一个颜色创建了一个新的列,并且在原始数据中的颜色对应的列上标记为 1,其余列标记为 0。
One-Hot Encoding 的主要优点是它创建了一个稀疏矩阵,这个矩阵可以很容易地用于大多数机器学习算法。然而,它的缺点也很明显,那就是当类别的数量非常大时,会导致特征空间变得非常大,这可能会增加计算成本,并可能导致过拟合。此外,One-Hot Encoding 不能很好地处理有序类别变量(即类别之间存在自然顺序的情况)。
- 优点:
1)解决了分类器处理离散数据困难的问题
2)一定程度上起到了扩展特征的作用
- 缺点:
1)没有考虑到词与词之间的顺序问题
2)全部都是词与词之间相互独立的表示
3)one-hot得到的特征是离散的,稀疏的
为了解决one-hot编码中词与词之间独立的缺点,引入embedding矩阵。embedding矩阵是一个行数为one-hot编码列数,列数自定义的一个随机权重矩阵。
2.2 Word2Vec
Word2vec 也叫 Word Embeddings,中文名“词向量”。作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。
Word2Vec是由谷歌于2013年正式提出的,但是对词向量的研究可以追溯到2003年论文《a neural probabilistic language model》。但正是谷歌对Word2Vec的成功应用,让词向量的技术得以在业界迅速推广,使Embedding这一研究话题成为热点。毫不夸张地说,Word2Vec对人工智能时代Embedding方向的研究具有奠基性的意义。
Word2Vec是一种在自然语言处理中广泛使用的词嵌入技术,它通过训练神经网络模型将文本中的每个单词映射为一个高维向量,从而捕捉单词之间的语义关系。以下是一个Word2Vec的案例,用于说明其工作原理和应用。
案例背景
假设我们有一个包含大量文本数据的语料库,我们的目标是学习这些文本中单词的语义表示,以便在后续的NLP任务中使用。
Word2Vec模型训练
-
数据预处理
-
对文本数据进行清洗,去除标点符号、停用词等无关信息。
-
将文本数据切分为单词或短语,构建词汇表。
-
-
模型选择
-
选择Word2Vec模型,并确定其参数,如向量维度(例如,100维)、窗口大小(例如,5)等。
-
Word2Vec提供了两种主要的训练模型:Skip-Gram和CBOW(Continuous Bag of Words)。Skip-Gram模型通过给定一个中心词来预测其上下文单词,而CBOW模型则通过上下文单词来预测中心词。
-
-
训练过程
-
使用语料库中的文本数据训练Word2Vec模型。在训练过程中,模型会学习单词之间的共现关系,并将每个单词映射为一个高维向量。
-
训练完成后,模型会生成一个词汇表到向量的映射表,其中每个单词都对应一个唯一的向量表示。
-
Word2Vec应用
-
语义相似度计算
-
利用Word2Vec生成的词向量,我们可以计算两个单词之间的语义相似度。例如,通过计算“猫”和“狗”两个单词向量的余弦相似度,我们可以发现它们之间的语义关系较为接近。
-
-
文本分类
-
在文本分类任务中,我们可以将文本中的单词转换为对应的词向量,并将这些向量作为特征输入到分类模型中。由于词向量能够捕捉单词之间的语义关系,因此这种方法通常能够提高文本分类的准确率。
-
-
推荐系统
-
在推荐系统中,我们可以将用户的行为序列和文本内容映射为词向量表示,然后计算用户向量和文本向量之间的相似度,从而为用户推荐相关的文本内容。
-
安装使用
以下是一个使用Python和Gensim库来训练Word2Vec模型的简单案例代码。Gensim是一个流行的主题建模和文档相似性检索的库,其中包含了对Word2Vec的实现。
首先,确保你已经安装了Gensim库。如果没有,可以使用pip进行安装:
pip install gensim
实现步骤:
第⼀步: 获取训练数据
第⼆步: 训练词向量
第三步: 模型超参数设定
第四步: 模型效果检验
第五步: 模型的保存与重加载
代码
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import logging
# 配置日志,避免训练过程中的警告信息
# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# 假设我们有一个名为'text_corpus.txt'的文本文件,每行包含一个句子,句子中的单词由空格分隔
sentences = LineSentence('text_corpus.txt') # 加载文本数据
# 训练Word2Vec模型
# 参数可以根据你的数据和需求进行调整
#参数如vector_size(向量维度)、window(上下文窗口大小)、min_count(最小词频)和workers(工作线程数)都可以根据你的数据集和需求进行调整。
model = Word2Vec(sentences, vector_size=100, window=15, min_count=1, workers=4)
# 保存模型,以便后续使用
model.save("word2vec.model")
# 加载已保存的模型
# model = Word2Vec.load("word2vec.model")
# 查找单词的向量表示
vector = model.wv['apple'] # 假设'apple'在我们的词汇表中
# print(vector)
# 查找最相似的单词
similar_words = model.wv.most_similar('apple')
print(similar_words)
2.3 Embedding
Embedding在大模型中的到了广泛的应用。
ChatGPt在transform的基础上训练了自己的词向量模型。 还有阿里、百度分别推出了自己的词向量模型。
那么如何存储Embeddin呢,那么就需要用到向量数据库了,向量数据库后面再讲解。
Embedding,中文直译为“嵌入”,常被翻译为“向量化”或者“向量映射”。
计算机如何表示客观知识的世界?
embedding(嵌入)
在机器学习和自然语言处理(NLP)中,embedding(嵌入)是一种将一个高维空间中的对象(如单词、短语、句子、图像等)映射到一个低维、稠密、连续的向量空间中的表示方法。这种表示方法通常能够保留原始对象之间的某些关系或属性,使得在向量空间中相似的对象具有相近的表示。
在自然语言处理中,word embedding(词嵌入)是最常见的嵌入类型,它将词汇表中的每个单词映射到一个固定大小的向量。这些向量通常是通过训练神经网络模型(如Word2Vec、GloVe、FastText等)在大量文本数据上学习得到的。
词嵌入的主要优点包括:
-
语义表示:词嵌入能够捕捉单词之间的语义关系。在向量空间中,相似的单词(如“猫”和“狗”)通常具有相近的表示,而不相关的单词则具有较远的距离。
-
降低维度:与独热编码相比,词嵌入使用低维向量表示单词,从而减少了计算复杂性和存储需求。
-
泛化能力:由于词嵌入是在大量文本数据上训练得到的,因此它们能够处理未见过的单词或短语(通过计算其附近单词的向量表示的平均值或类似方法)。
词嵌入在NLP任务中有着广泛的应用,如文本分类、情感分析、命名实体识别、机器翻译等。通过将文本中的单词表示为词嵌入向量,可以将NLP任务转化为机器学习问题,并利用各种机器学习算法进行建模和预测。
此外,除了词嵌入之外,还有其他类型的嵌入方法,如句子嵌入(将整个句子映射为一个向量)和文档嵌入(将整个文档映射为一个向量)。这些嵌入方法可以帮助我们处理更复杂的NLP任务,如问答系统、文本摘要等。
安装
pip install torch
案例
import torch
import torch.nn as nn
import torch.optim as optim
# 超参数
vocab_size = 10000 # 词汇表大小
embedding_dim = 50 # 嵌入维度
output_dim = 2 # 输出维度(例如,二分类任务)
num_epochs = 5 # 训练轮数
batch_size = 64 # 批处理大小
learning_rate = 0.001 # 学习率
# 模拟文本数据(实际中你会从文本数据集中获取这些索引)
# 这里我们随机生成一些单词索引作为示例
text_indices = torch.randint(0, vocab_size, (batch_size, 10)) # (batch_size, sequence_length)
# 标签数据(随机生成)
labels = torch.randint(0, output_dim, (batch_size,))
# 定义模型
class SimpleEmbeddingModel(nn.Module):
def __init__(self, vocab_size, embedding_dim, output_dim):
super(SimpleEmbeddingModel, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.fc = nn.Linear(embedding_dim, output_dim)
def forward(self, text_indices):
# 取文本序列中最后一个单词的嵌入(简化的例子)
embedded = self.embedding(text_indices)[:, -1, :]
output = self.fc(embedded)
return output
# 实例化模型
model = SimpleEmbeddingModel(vocab_size, embedding_dim, output_dim)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(num_epochs):
# 前向传播
outputs = model(text_indices)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印统计信息
if (epoch+1) % 1 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')
# 训练完成后,你可以通过调用model.embedding来获取嵌入层
# 例如,查询索引为5的单词的嵌入向量
embedding_vector = model.embedding(torch.tensor([5], dtype=torch.long))
print(embedding_vector)