【AI 大模型】RAG 检索增强生成 ③ ( 文本向量 | Word2Vec 词汇映射向量空间模型 - 算法原理、训练步骤、应用场景、实现细节 | Python 代码示例 )

2024-08-20 13:59:08 浏览数 (2)

一、Word2Vec 词汇映射向量空间模型


1、Word2Vec 模型简介

Word2Vec 是一个 将 词汇 映射 到 高维向量空间 的模型 , 其 核心思想 是 通过大量的文本数据来学习每个词的向量表示 , 使得 语义相似 的 单词 或 汉字 在向量空间中彼此接近 ;

Word2Vec 的 训练模型 :

  • 连续词袋模型 CBOW
  • 跳字模型 Skip-gram

下面介绍上述两种模型的 算法原理 ;

2、连续词袋模型 CBOW - 算法原理

连续词袋模型 CBOW 算法的目的 : 预测 给定上下文词汇 的 中心词 ;

在 CBOW 模型中 , 先给定 某个词汇 ( 中心词 ) 的上下文 , 模型的目标是 预测 这段文字 中心的词汇 , 也就是 预测 中心词 ;

连续词袋模型 CBOW 通过 上下文词汇 的 平均 或 加权和 操作 , 预测中心词的 向量 , 然后从 文本向量表 中 查找 距离该向量 最近的词汇是哪个 , 这个词 就是 预测的结果 , 中心词 ;

将 上下文词汇 对应的 文本向量 进行 平均 或 加权 操作 后 , 传递给一个输出层 , 输出层 使用 softmax 激活函数 来预测中心词 ;

下图中 , X1 X2 X3 等词汇 , 每个词汇 都由 向量表示 , 每个向量都由 若干 浮点数组成 ;

输出层是多个 上下文词汇 , 隐藏层 进行 平均或加权和 计算操作 , 得到 输出层 的 中心词 对应的 向量 ;

举例说明 :

假设 给定一句话 " The cat sits on the mat " , 并选择 " sits " 单词 作为 中心词 , 那么我们将 “The”, “cat”, “on”, “the”, “mat” 作为上下文词汇 ;

根据 这些 上下文词汇 , 预测出中心词 , 看是否能把 " sit " 单词作为中心词 预测出来 ;

3、连续词袋模型 CBOW - 模型训练步骤

连续词袋模型 CBOW 训练步骤 :

  • 输入层 : 输入层的每个节点对应一个上下文词汇 , 每个上下文词汇用一个 编码向量表示 ;
  • 隐藏层: 上下文词汇的 编码向量 通过一个权重矩阵映射到隐藏层 , 这些权重是模型要学习的 ;
  • 输出层: 隐藏层的输出通过另一个权重矩阵映射到词汇表的大小 , 并通过 softmax 函数计算每个词的概率分布 ;

该模型的 训练目标 是 最大化 预测 中心词的 准确率 ;

4、跳字模型 Skip-gram - 算法原理

跳字模型 Skip-gram 算法原理 : 给定一个 中心词 , 预测 中心词 的 上下文词汇 ;

在 Skip-gram 模型中 , 给定一个中心词,模型的目标是预测这个中心词周围的上下文词汇 ;

Skip-gram 模型通过中心词的向量来预测每个上下文词汇的向量,即中心词的向量经过一个权重矩阵映射到输出层,通过 softmax 函数来预测上下文词汇的概率分布。

举例说明 : 假设我们有一个句子 " The cat sits on the mat " , 选择 " sits " 作为中心词 , 那么 “The”, “cat”, “on”, “the”, “mat” 就是上下文词汇 ;

给定 中心词 " sits " , 进行 上下文预测 , 看是否能预测出 “The”, “cat”, “on”, “the”, “mat” 等上下文词汇 ;

5、跳字模型 Skip-gram - 模型训练步骤

跳字模型 Skip-gram - 模型训练步骤 :

  • 输入层 : 输入层的每个节点对应一个中心词 , 中心词用一个 编码向量表示 ;
  • 隐藏层 : 中心词的独热编码向量通过一个权重矩阵映射到隐藏层 , 这些权重是模型要学习的 ;
  • 输出层 : 隐藏层的输出通过另一个权重矩阵映射到词汇表的大小 , 并通过 softmax 函数计算每个上下文词的概率分布 ;

该模型 的 目标是 最大化 预测 上下文 的 准确率 ;

6、文本向量表示

Word2Vec 模型 训练完成后 , 每个 词汇 将被映射到一个高维向量空间中 , 相似的 词汇 在向量空间中的距离较近 ;

这些 词向量 / 文本向量 可以用来进行各种 自然语言处理任务 , 如词义相似度计算、文本分类等 ;

将下面的一段文本进行训练 ,

代码语言:javascript复制
# 示例文本数据
sentences = [
    "I love machine learning",
    "Deep learning is amazing",
    "Natural language processing is a fascinating field"
]

向量维度设置为 50 , 那么就是在 50 维的向量空间中表示每个单词 , 每个单词都使用 50 个 浮点数进行表示 ;

下面是 单词 " learning " 的 文本向量 , 由 50 个浮点数 ;

代码语言:javascript复制
Word: learning, 
Vector: [-0.00321157  0.03927787  0.00616916  0.02789649  0.02203173  0.03612738
  0.00637109  0.04316046 -0.049891    0.02915843 -0.00426264  0.02841807
  0.01823073  0.0149862  -0.02141328 -0.00687046  0.0535442   0.01235065
 -0.046329    0.00192757 -0.00424403  0.00364727  0.05790862  0.04215468
  0.04061833  0.03017248 -0.03808379  0.05979197  0.03251123 -0.01618787
 -0.05283526 -0.01509981  0.05030754 -0.03224825  0.05769876 -0.01519872
  0.02141866  0.01543435 -0.01191425 -0.00674526  0.00728445  0.04265702
  0.01254657  0.04424815 -0.05862596 -0.00738266  0.01891772  0.02471734
  0.01362135  0.02899224]

7、Word2Vec 文本向量的应用场景

Word2Vec 文本向量 的 应用场景如下 :

  • 计算同义词 : 通过计算 词向量 之间的 距离 或 余弦相似度 , 可以衡量词义的相似性 ;
  • 文本分类 : 使用 文本向量 表示 文本的特征 , 可以提高 文本分类器 在 垃圾邮件检测、情感分析 等方面的性能 ;
  • 语言翻译 : 词向量 帮助将源语言词汇映射到目标语言词汇 , 增强翻译系统的准确性和流畅性 ;
  • 向量检索 : 替代传统的 " 关键词检索 " , 通过词向量改进搜索引擎的相关性排名 , 使得搜索结果与用户意图更加匹配 , 即使没有一模一样的词汇 , 也可以通过近义词进行检索 ;
  • 命名实体识别(NER): 在文本中 识别 和 分类实体名称 , 词向量有助于提升识别准确率 ;
    • 实体名称 指的是 人名 , 地名 , 公司名 等 ;
  • GPT 生成文本模型 : 在 大语言模型 的 文本生成任务中 , 如 : 对话生成 , 自动写作,词向量可以帮助生成更自然和相关的内容 ;

二、Word2Vec 完整代码示例


1、Python 中实现 Word2Vec 模型的库

Python 中 实现了 Word2Vec 模型 的函数库 :

  • TensorFlow : 开源的机器学习库 , 可以用来构建 Word2Vec 模型 , TensorFlow 提供了深度学习的基础工具 , 可以实现 Word2Vec 模型 ;
    • 使用前先执行 pip install tensorflow 命令 , 安装软件包 ;
  • Gensim : 用于自然语言处理的库 , 提供了高效的 Word2Vec 实现 ;
    • 使用前先执行 pip install gensim 命令 , 安装软件包 ;
  • Keras : 高级神经网络 API , 可以在 TensorFlow、Theano 和 CNTK 后端上运行 ; Keras 内置了很多功能来构建和训练模型 , 包括 Word2Vec ;
    • 使用前先执行 pip install keras 命令 , 安装软件包 ;
  • FastText : Facebook 开发的一个库 , 扩展了 Word2Vec 的功能 , 并且通常更快且准确度更高 ;
    • 使用前先执行 pip install fasttext 命令 , 安装软件包 ;

2、安装 tensorflow 软件包

在 Windows 系统的 cmd 命令行中执行

代码语言:javascript复制
pip install tensorflow

命令 , 安装 PyCharm 中使用的 Python 函数库 tensorflow 软件包 ;

Python 中使用 pip install 命令 , 安装的 软件包 都在 Python SDK 的 Libsite-packages 目录下 ;

本次的安装目录是 D:01_Develop22_PythonPython37_64Libsite-packages , 其中D:01_Develop22_PythonPython37_64 目录是 Python 的 SDK 安装位置 ;

tensorflow 库安装后有 1 GB , 因此 千万不要把 Python 的 SDK 装在 C 盘 , 系统盘不够用 ;

3、代码示例

示例代码解析 : 在下面的代码中 , 展示了 tensorflow 中提供的 Word2Vec 模型用法示例 ;

  • 首先 , 进行 数据准备 操作 ;
    • 使用 Tokenizer 将文本数据转换为整数序列 , 并生成词汇表 ;
    • 使用 skipgrams 函数生成训练对 , 这里我们使用了 Skip-gram 方法来生成上下文和目标词对 ;
  • 然后 , 构建简单的 Word2Vec Skip-gram 模型 , 包括 两个 嵌入层 和 一个 点积层 ;
    • 两个 嵌入层 分别对应 目标词 和 上下文词 ;
    • 模型的输入是 目标词 和 上下文词 , 输出的是 两个词 之间的相似度 ;
  • 再后 , 使用 binary_crossentropy 函数作为 损失函数 , 进行模型训练 ;
  • 最后 , 从 训练好 的 模型中 , 提取 文本向量 , 并 输出 到命令行中 ;

代码示例 :

代码语言:javascript复制
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import skipgrams
from tensorflow.keras.layers import Embedding, Dot, Reshape
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam

# 示例文本数据
sentences = [
    "I love machine learning",
    "Deep learning is amazing",
    "Natural language processing is a fascinating field"
]

# 使用 Tokenizer 进行词汇表创建
tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences)  # 构建词汇表
word_index = tokenizer.word_index  # 获取词汇表中的词及其对应的索引
index_word = {i: w for w, i in word_index.items()}  # 创建索引到词的映射
vocab_size = len(word_index)   1  # 词汇表大小

# 将文本数据转为整数序列
sequences = tokenizer.texts_to_sequences(sentences)  # 将文本转换为整数序列

# 生成 Skip-gram 数据对
pairs, labels = [], []  # 初始化数据对和标签列表
for sequence in sequences:
    skipgram_pairs, skipgram_labels = skipgrams(sequence, vocabulary_size=vocab_size, window_size=2)  # 生成 Skip-gram 对
    pairs.extend(skipgram_pairs)  # 添加数据对
    labels.extend(skipgram_labels)  # 添加标签

pairs = np.array(pairs)  # 转换为 NumPy 数组
labels = np.array(labels)  # 转换为 NumPy 数组

# 模型参数
embedding_dim = 50  # 嵌入向量维度

# 构建模型
input_target = tf.keras.Input(shape=(1,))  # 目标词输入层
input_context = tf.keras.Input(shape=(1,))  # 上下文词输入层

embedding = Embedding(vocab_size, embedding_dim, input_length=1, name='embedding')  # 嵌入层
target = embedding(input_target)  # 目标词嵌入
context = embedding(input_context)  # 上下文词嵌入
dot_product = Dot(axes=-1)([target, context])  # 计算目标词和上下文词的点积
output = Reshape((1,))(dot_product)  # 调整输出形状

model = Model(inputs=[input_target, input_context], outputs=output)  # 创建模型
model.compile(optimizer=Adam(), loss='binary_crossentropy')  # 编译模型,使用 Adam 优化器和二元交叉熵损失函数

# 训练模型
model.fit([pairs[:, 0], pairs[:, 1]], labels, epochs=10, batch_size=256)  # 训练模型

# 提取词向量
word_embeddings = model.get_layer('embedding').get_weights()[0]  # 获取词嵌入矩阵

# 打印词向量
for word, index in word_index.items():  # 遍历词汇表中的每个词
    print(f'Word: {word}, Vector: {word_embeddings[index]}')  # 打印词和对应的词向量

4、执行结果

上述 代码 执行结果如下 : 每个单词都转为了 50 个浮点数组成的向量值 ;

代码语言:javascript复制
D:01_Develop22_PythonPython37_64python.exe D:/002_Project/011_Python/OpenAI/word2vec2.py
2024-08-16 09:28:11.076184: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Epoch 1/10
1/1 [==============================] - 0s 338ms/step - loss: 4.6802
Epoch 2/10
1/1 [==============================] - 0s 2ms/step - loss: 4.5502
Epoch 3/10
1/1 [==============================] - 0s 2ms/step - loss: 4.4719
Epoch 4/10
1/1 [==============================] - 0s 949us/step - loss: 4.4127
Epoch 5/10
1/1 [==============================] - 0s 981us/step - loss: 4.3644
Epoch 6/10
1/1 [==============================] - 0s 969us/step - loss: 4.3234
Epoch 7/10
1/1 [==============================] - 0s 2ms/step - loss: 4.2877
Epoch 8/10
1/1 [==============================] - 0s 2ms/step - loss: 4.2559
Epoch 9/10
1/1 [==============================] - 0s 2ms/step - loss: 4.2272
Epoch 10/10
1/1 [==============================] - 0s 2ms/step - loss: 4.2011
Word: learning, Vector: [-0.00321157  0.03927787  0.00616916  0.02789649  0.02203173  0.03612738
  0.00637109  0.04316046 -0.049891    0.02915843 -0.00426264  0.02841807
  0.01823073  0.0149862  -0.02141328 -0.00687046  0.0535442   0.01235065
 -0.046329    0.00192757 -0.00424403  0.00364727  0.05790862  0.04215468
  0.04061833  0.03017248 -0.03808379  0.05979197  0.03251123 -0.01618787
 -0.05283526 -0.01509981  0.05030754 -0.03224825  0.05769876 -0.01519872
  0.02141866  0.01543435 -0.01191425 -0.00674526  0.00728445  0.04265702
  0.01254657  0.04424815 -0.05862596 -0.00738266  0.01891772  0.02471734
  0.01362135  0.02899224]
Word: is, Vector: [-0.04850127 -0.01817817 -0.01943211 -0.01507875 -0.03522446  0.03017616
  0.00195579 -0.03032363  0.0471383   0.01740152 -0.02025871  0.03517399
 -0.04072831 -0.01689353 -0.03618398  0.00728186  0.00643327 -0.04072586
  0.02850184  0.02287598  0.02504763  0.04877659 -0.0156221  -0.02940094
 -0.01005022  0.00579242 -0.03306862 -0.00362998  0.02999207 -0.02017872
  0.04102116  0.04162875 -0.0057752   0.03878671 -0.01668419  0.01415582
 -0.01787119  0.00202267 -0.0329514   0.00652844 -0.02275511 -0.01437672
  0.02438227 -0.0381818   0.01253717 -0.0312217  -0.00204155  0.04164918
  0.01921753  0.00964438]
Word: i, Vector: [ 0.04335381  0.00592583  0.0551033  -0.04590617  0.01631795 -0.04812752
  0.04417964 -0.00318619 -0.01099156  0.00030646  0.05510231  0.03580425
  0.00289193  0.03353943 -0.02868991  0.04636407 -0.00301994  0.02667969
  0.00518026  0.03257323 -0.02532974  0.0029622   0.0350619  -0.00119264
  0.02978915 -0.0100148   0.03251199  0.00673161  0.03937319 -0.04120999
  0.01482028  0.04927919  0.03851033 -0.04100788 -0.00907034  0.02863063
  0.02633214  0.04849904 -0.03800495  0.00345759  0.00713671 -0.01573475
  0.0277383   0.00490151  0.02959421  0.01058907  0.05890618  0.05071354
  0.00069239  0.0139456 ]
Word: love, Vector: [ 0.02124948  0.03345285 -0.03899518  0.04016155  0.01410933  0.00758267
 -0.00921821 -0.03663526 -0.03631829 -0.03561198 -0.01100456  0.03640453
 -0.01154441 -0.01214306 -0.00158718 -0.0030126  -0.00050348 -0.03853129
 -0.03771586  0.006332    0.03172655  0.02283206  0.0449295  -0.03155522
  0.03132889  0.03243085 -0.01863536 -0.01228887  0.00677787  0.01169837
 -0.02064442 -0.01630308  0.00475659 -0.03805356  0.04366293 -0.00203237
  0.03167215 -0.00051814 -0.01819641  0.02029561 -0.0150766   0.03840049
 -0.0011336   0.01110033 -0.05739464 -0.03759264  0.00992759  0.03664881
 -0.03737824  0.04481837]
Word: machine, Vector: [ 0.01256744  0.05493961  0.05156352 -0.05254603  0.05222714 -0.02787161
  0.00884341  0.05859774 -0.01706602  0.05661383  0.02399637 -0.02899282
 -0.01091578  0.02853572 -0.05435005  0.02165839 -0.02526646 -0.02812575
 -0.05316673  0.00179729 -0.05648367  0.0175765   0.05152157  0.0199957
  0.03839891 -0.0121992  -0.00552106  0.05587437 -0.00706059 -0.02177661
 -0.00821144  0.0303122   0.05555865  0.00988145  0.01431244  0.03425541
 -0.03562244  0.03591005 -0.02323821 -0.0334999  -0.03741898  0.0082142
  0.04124561  0.01959193  0.01364672 -0.01761863  0.02024727  0.01130799
  0.0123606   0.03641927]
Word: deep, Vector: [-0.05665746 -0.04792808 -0.05014217  0.03106089 -0.04355281 -0.03822718
 -0.02590954  0.02262733  0.01333261  0.03697808 -0.00640199  0.02848412
 -0.04587119 -0.04111011 -0.02802585  0.0494941   0.00170043 -0.0509933
 -0.01448047 -0.03505946 -0.01690938 -0.03925737 -0.036212   -0.05171141
  0.02333118 -0.04062278 -0.05268471 -0.00650161  0.0005835   0.02760867
  0.01664205  0.03617666 -0.01858392  0.03185634 -0.00503922 -0.04093894
 -0.05554398  0.01787306  0.03889327 -0.0032624  -0.01550952 -0.02787351
  0.01413828 -0.03148517 -0.00636994  0.0135811   0.04020449 -0.01036272
  0.04809713  0.0139291 ]
Word: amazing, Vector: [-0.03804016  0.02857452  0.00322663 -0.03340072 -0.0381109   0.03038805
  0.02846212  0.02931504 -0.01197881  0.01147577 -0.03653805  0.02703354
 -0.04092281 -0.02101623 -0.00295804 -0.01291655  0.03330976 -0.03112418
 -0.01069261  0.0437712  -0.02810412  0.02468324 -0.01412242  0.01921122
 -0.00858794  0.04074717 -0.01255008  0.00473223  0.00847079 -0.04750414
  0.00631876  0.02589377  0.04084728  0.00478772  0.04552785 -0.02180728
  0.02622463 -0.02766575 -0.04723873 -0.00096275 -0.01052775  0.0362574
  0.00161303 -0.01221719 -0.05281541 -0.03373772 -0.02718632 -0.00968645
  0.00077633 -0.02636372]
Word: natural, Vector: [ 0.00922634 -0.00767834 -0.04555733 -0.03261197 -0.04359912  0.00299391
  0.02118976 -0.02598096 -0.04075725  0.00434979  0.03954858  0.01491208
  0.03670142 -0.01688498  0.00044547 -0.00746624 -0.00594356  0.00970965
 -0.02324747  0.01481842  0.04039751  0.03627228  0.04142744 -0.03160152
  0.02938914  0.02712004 -0.03241567  0.04020814 -0.01078338  0.03352029
  0.04328843  0.00454491  0.02176973  0.01938275 -0.00989198  0.02724446
 -0.05303999 -0.02890654 -0.00905713 -0.03527548  0.01366975 -0.01083682
  0.05119205  0.03923048 -0.02052928 -0.02876336  0.006407   -0.0167786
 -0.03914975 -0.02305199]
Word: language, Vector: [ 0.00847483 -0.05559875 -0.05925155 -0.0355204  -0.05359524 -0.00608283
  0.00320329  0.00066788  0.03430515  0.00894064  0.00096238 -0.02127819
  0.00662573 -0.00953977  0.03618817  0.02098873 -0.03547039  0.02478442
  0.03772367  0.05674538 -0.01768715  0.05667575 -0.01954747 -0.05168736
  0.01183402  0.03491602 -0.01471148  0.02342941  0.01461189  0.03154018
  0.02979536  0.04334725  0.04547536  0.03179631  0.02813049  0.05590999
 -0.01982505 -0.04677211  0.00529861  0.03856302 -0.01671158  0.02163729
  0.03889727 -0.0004473  -0.05948495 -0.03651699 -0.01727288  0.04068163
  0.01857873 -0.029497  ]
Word: processing, Vector: [ 0.01042999 -0.03210147 -0.00543597 -0.05209697 -0.03351552  0.04402945
  0.04770755 -0.05743022 -0.00061579 -0.02664622 -0.04397092  0.01692001
  0.01631451 -0.04232658 -0.01666508 -0.01825891  0.02082774 -0.00202723
 -0.03656881  0.0267873   0.01689488 -0.00137658 -0.00539987 -0.04710834
 -0.03627909  0.0566317  -0.01942493 -0.02341237  0.02579835 -0.0117269
  0.03720793  0.03990724  0.05278151  0.02369007  0.01840199  0.04370767
 -0.05255595 -0.03147706  0.03517626  0.03002381 -0.03626465  0.02583629
  0.02560278  0.04363503 -0.02960237 -0.02247534  0.02859247 -0.00505896
  0.04147723  0.0269079 ]
Word: a, Vector: [ 0.00220123 -0.05223196  0.02945516  0.01754405 -0.050515    0.02510117
 -0.02950761 -0.03056652  0.00088651  0.0317716   0.03254192 -0.00572918
 -0.02531261  0.02860654  0.04450737  0.05419686  0.02541122  0.02225946
 -0.05497834 -0.04607365  0.03371739 -0.00586361  0.01924774  0.03487618
 -0.02686865  0.04013187 -0.01317471 -0.04139041 -0.00958664  0.02934398
 -0.05417831  0.02288332  0.01579129 -0.01211508  0.02824134 -0.03828157
 -0.00427263  0.03503546  0.03345916 -0.03407149  0.01519595  0.04121489
  0.04955248  0.00572149 -0.01740555 -0.0336564  -0.05183009 -0.02940635
 -0.02089442 -0.03992337]
Word: fascinating, Vector: [-0.03372697 -0.00548039  0.01430078 -0.02538841  0.01516997 -0.0042397
 -0.01453294 -0.05913377  0.05197076  0.01240273  0.01846839  0.02746565
  0.02233218 -0.05126255 -0.0090773   0.0167577  -0.03819533  0.00548373
  0.02731238  0.05524713  0.04552881  0.01024329  0.00757937 -0.02946985
 -0.02368664  0.03069277 -0.02440017  0.00595432  0.04770452  0.02805043
 -0.02024739  0.00269523 -0.04128293 -0.02501465 -0.04641492  0.01521988
  0.02474929  0.00230619 -0.04900512 -0.01796082 -0.0155594  -0.03421747
  0.02724069 -0.0107807  -0.00976059  0.01740771 -0.02639746  0.016172
  0.05962607  0.05553653]
Word: field, Vector: [ 0.00322471 -0.03018627  0.01437822  0.03609617 -0.03801164 -0.01510745
  0.03879017 -0.01652177  0.01412087 -0.02735655 -0.02743557 -0.03221446
 -0.05086558  0.03224384  0.02504818  0.03592138 -0.02861246  0.01564104
 -0.02967609 -0.0399616  -0.01911848 -0.03690275  0.02965165  0.0108167
 -0.04724862 -0.00419907  0.02764304 -0.02756451 -0.05550781  0.01215103
 -0.01837657  0.04681823  0.01622975  0.04263613  0.00836677  0.01799515
 -0.00060863 -0.00125658  0.01633861  0.02095414 -0.00010253 -0.00389527
  0.015011   -0.03505156 -0.00920992 -0.01243817 -0.04472306 -0.04413529
 -0.03762042 -0.03157695]

Process finished with exit code 0

0 人点赞