当前位置: 首页 > news >正文

深入浅出词向量(Word2Vec):从理论到实践

文章目录

    • 一、为什么需要词向量?
    • 二、词向量的基本概念
    • 三、Word2Vec 核心思想
    • 四、模型架构详解
      • 1.CBOW (Continuous Bag-of-Words)
      • 2.Skip-gram
    • 五、关键技术:负采样(Negative Sampling)
    • 六、实践:使用 Gensim 训练 Word2Vec 模型
      • 1. 安装依赖
      • 2. 准备数据与训练模型
      • 3. 使用训练好的词向量
    • 七、词向量的应用与局限性
      • 应用
      • 局限性
      • 局限性

一、为什么需要词向量?

在深度学习和NLP的早期,计算机处理文本时,通常使用“独热编码”(One-Hot Encoding)。这种方法将词汇表中的每个词表示为一个巨大的向量,向量长度等于词汇表大小,且只有对应词的位置为1,其余全为0。

例如,词汇表为 [猫, 狗, 老鼠, 奶酪]

  • -> [1, 0, 0, 0]
  • -> [0, 1, 0, 0]
  • 老鼠 -> [0, 0, 1, 0]
  • 奶酪 -> [0, 0, 0, 1]

独热编码的问题显而易见:

  1. 维度灾难: 词汇表动辄数万甚至数百万,导致向量维度极高,计算和存储成本巨大。
  2. 语义鸿沟: 任意两个词的向量都是正交的(内积为0),无法反映词与词之间的语义或语法相似性。例如,“猫”和“狗”在语义上很接近(都是宠物),但在独热编码下毫无关联。

为了解决这些问题,词向量(Word Embedding) 应运而生。它将高维稀疏的独热向量映射到一个低维、稠密的连续向量空间中。在这个空间里,语义或语法上相似的词,其向量在空间中的距离也更近。


二、词向量的基本概念

词向量的本质是分布式表示(Distributed Representation)。一个词的含义由其在大量文本中出现的上下文共同决定(即“你从邻居来判断你是谁”)。词向量是一个实数向量,如 [0.25, -0.1, 0.8, ..., 0.3](维度通常为50-300),它捕捉了词的多种语言特征(如语义、语法角色、情感等)。

词向量的神奇之处在于其线性关系:

  • 国王 - 男 + 女 ≈ 王后
  • 巴黎 - 法国 + 意大利 ≈ 罗马

这种向量运算能力是词向量强大表达力的直接体现。


三、Word2Vec 核心思想

Word2Vec 是由 Google 在 2013 年提出的高效词向量学习框架,由 Tomas Mikolov 等人开发。其核心思想基于分布假说上下文相似的词,其语义也相似

Word2Vec 通过训练一个简单的神经网络模型,学习预测一个词的上下文(或根据上下文预测中心词),在训练过程中,网络的权重(即词向量)被不断调整,最终得到能有效表示词义的向量。


四、模型架构详解

Word2Vec 主要有两种模型架构:CBOWSkip-gram

1.CBOW (Continuous Bag-of-Words)

  • 目标: 给定一个词的上下文(Context),预测该中心词(Target Word)。
  • 输入: 上下文窗口内的词向量(通常是求和或取平均)。
  • 输出: 中心词在词汇表上的概率分布(通常用 Softmax)。
  • 特点:
    • 训练速度快。
    • 对高频词表现较好。
    • 在小数据集上通常效果不错。

2.Skip-gram

  • 目标: 给定一个中心词,预测其上下文中的词。
  • 输入: 中心词的向量。
  • 输出: 上下文窗口内每个词在词汇表上的概率分布。
  • 特点:
    • 训练速度相对较慢。
    • 对低频词和复杂语义关系捕捉能力更强。
    • 在大数据集上通常效果优于 CBOW。

总结: CBOW 是“多对一”,Skip-gram 是“一对多”。实践中,Skip-gram 因其在捕捉复杂语义关系上的优势而更受欢迎。


五、关键技术:负采样(Negative Sampling)

无论是 CBOW 还是 Skip-gram,原始的 Softmax 计算需要对词汇表中所有词进行归一化,当词汇表巨大时(如百万级),计算量极其庞大。

负采样(Negative Sampling) 是一种高效的近似方法:

  1. 对于一个正样本(中心词,上下文词)对,我们只更新该词对的参数。
  2. 同时,从词汇表中随机采样 k 个“负样本”(即不应该是该中心词上下文的词)。
  3. 模型的目标是让正样本的得分尽可能高,同时让负样本的得分尽可能低。

这将多分类问题(Softmax)转化为了 k+1 个二分类问题,极大地提升了训练效率。通常 k 取 5-20。


六、实践:使用 Gensim 训练 Word2Vec 模型

接下来,我们使用 Python 的 gensim 库来训练一个简单的 Word2Vec 模型。

1. 安装依赖

pip install gensim jieba

2. 准备数据与训练模型

import jieba
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)# 模拟一些中文文本数据(实际应用中可以从文件读取)
sentences = ["自然语言处理是人工智能的重要分支","词向量能够将词语表示为向量","Word2Vec是一种常用的词向量模型","深度学习在自然语言处理中应用广泛","人工智能正在改变我们的世界"
]# 使用 jieba 进行中文分词
segmented_sentences = []
for sentence in sentences:words = list(jieba.cut(sentence))# 过滤掉可能的空格或标点(这里简单处理)words = [word for word in words if word.strip() and word != ' ']segmented_sentences.append(words)print("分词后的句子:", segmented_sentences)# 训练 Word2Vec 模型
# 参数说明:
#   sentences: 分词后的句子列表
#   vector_size: 词向量维度 (旧版size)
#   window: 上下文窗口大小
#   min_count: 忽略词频低于此值的词
#   workers: 并行训练的线程数
#   sg: 1表示使用Skip-gram, 0表示使用CBOW
model = Word2Vec(sentences=segmented_sentences,vector_size=100,window=5,min_count=1,workers=4,sg=1,  # 使用Skip-gramepochs=100  # 训练轮数
)# 保存模型
model.save("word2vec_model.model")# 加载模型(可选)
# model = Word2Vec.load("word2vec_model.model")

3. 使用训练好的词向量

# 获取词向量
vector_nlp = model.wv['自然语言处理']
print(f"“自然语言处理”的词向量 (前10维): {vector_nlp[:10]}")# 计算词相似度
similarity = model.wv.similarity('自然语言处理', '人工智能')
print(f"“自然语言处理” 和 “人工智能” 的相似度: {similarity:.4f}")# 查找最相似的词
similar_words = model.wv.most_similar('词向量', topn=3)
print("与“词向量”最相似的词:")
for word, score in similar_words:print(f"  {word}: {score:.4f}")# 词向量运算 (示例,取决于训练数据)
# result = model.wv.most_similar(positive=['人工智能', '世界'], negative=['我们'], topn=1)
# print(f"“人工智能” - “我们” + “世界” ≈ {result[0][0]}")

输出示例:

分词后的句子: [['自然语言处理', '是', '人工智能', '的', '重要', '分支'], ['词向量', '能够', '将', '词语', '表示为', '向量'], ['Word2Vec', '是', '一种', '常用', '的', '词向量', '模型'], ['深度学习', '在', '自然语言处理', '中', '应用', '广泛'], ['人工智能', '正在', '改变', '我们', '的', '世界']]
“自然语言处理”的词向量 (10): [ 0.0123 -0.0456  0.1234 ...]
“自然语言处理” 和 “人工智能” 的相似度: 0.8765
与“词向量”最相似的词:Word2Vec: 0.9234向量: 0.8876词语: 0.7654

注意: 由于我们的训练数据量非常小,结果仅供参考。在真实场景中,需要大量高质量的文本语料库(如维基百科、新闻文章等)来训练出有意义的词向量。


七、词向量的应用与局限性

应用

  • 文本分类: 将句子/文档的词向量平均或使用更复杂的池化方法作为特征输入分类器。
  • 信息检索: 计算查询和文档的语义相似度。
  • 机器翻译: 作为神经机器翻译模型的输入。
  • 问答系统: 匹配问题和答案的语义。
  • 推荐系统: 将用户行为序列(如点击的商品)视为“句子”,训练 Item2Vec。

局限性

  1. 一词多义(Polysemy): 传统 Word2Vec 为每个词分配一个唯一的向量,无法区分不同语境下的不同含义(如“苹果”指水果还是公司)。
  2. OOV(Out-of-Vocabulary)问题: 无法处理训练词汇表之外的新词。
  3. 上下文无关: 生成的向量是静态的,不随上下文变化。

为“句子”,训练 Item2Vec。

局限性

  1. 一词多义(Polysemy): 传统 Word2Vec 为每个词分配一个唯一的向量,无法区分不同语境下的不同含义(如“苹果”指水果还是公司)。
  2. OOV(Out-of-Vocabulary)问题: 无法处理训练词汇表之外的新词。
  3. 上下文无关: 生成的向量是静态的,不随上下文变化。

后续发展: 为了解决这些局限性,后续出现了 上下文相关的词向量 模型,如 ELMo、GPT 和 BERT。这些模型基于深度神经网络(如Transformer),能够根据词在具体句子中的上下文生成动态的、更精确的向量表示。

http://www.dtcms.com/a/331430.html

相关文章:

  • 数据结构初阶(13)排序算法-选择排序(选择排序、堆排序)(动图演示)
  • 【Java 后端】Spring Boot 集成 JPA 全攻略
  • HTTPS 工作原理
  • 电池充放电测试仪厂家:技术深耕与场景驱动的行业进阶
  • Java使用Apache POI读取Excel文件
  • Vue浅学
  • 深入解析 GitHub Actions 工作流文件编写:从入门到实战
  • 简单的 HTTPS 学习
  • 第四天-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • IPv6互联网地址解析
  • 从合规到卓越:全星QMS如何成为制造企业的质量战略引擎
  • linux 软硬链接详解
  • 《算法导论》第 25 章:所有结点对的最短路径问题
  • 计算机视觉CS231n学习(8)
  • 12 ABP Framework 租户管理
  • 介绍一下 自动驾驶 感知多任务训练模型设计
  • 面试题:如何用Flink实时计算QPS
  • 第4节 神经网络从公式简化到卷积神经网络(CNN)的进化之路
  • 第三章、GRU(门控循环网络,Gated Recurrent Unit)
  • redis中分布式锁的应用
  • 【js】让项目支持倾听和朗读AI技术
  • RTC时钟倒计时数码管同步显示实现(STC8)
  • AI模型选型:租快艇还是造航母?
  • 协作同步问题的深度分析与解决方案:结合表单汇总与AI技术提升运维效能
  • Git报错:Unlink of file ‘src/global/env.ts‘ failed. Should I try again? (y/n) y
  • AI对话框海量消息渲染优化:告别卡顿与跳动
  • 5.从零开始写LINUX内核--从实模式到保护模式的过渡实现
  • 嵌入式LINUX——————网络2
  • 晶台光耦在工业控制领域的应用