一、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_Develop 22_PythonPython37_64Libsite-packages , 其中D: 01_Develop 22_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_Develop 22_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