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

从代码学习深度学习 - 词的相似性和类比任务 PyTorch版

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 加载预训练词向量
    • TokenEmbedding 类详解
    • 预训练词向量简介 (GloVe)
      • 具体含义
      • 总结建议
  • 应用预训练词向量
    • 词相似度
      • knn 函数
      • get_similar_tokens 函数
      • 相似词查找示例
    • 词类比
      • get_analogy 函数
      • 词类比任务示例
  • 总结


前言

词向量(Word Embeddings)是自然语言处理(NLP)中的基石之一。它们是将词汇表中的词语映射到低维连续向量空间的技术,使得语义上相似的词在向量空间中也彼此接近。实际上,在大型语料库上预先训练的词向量可以应用于下游的自然语言处理任务,这将在后面讨论。为了直观地演示大型语料库中预训练词向量的语义,让我们将预训练词向量应用到词的相似性和类比任务中。

本篇博客将通过 PyTorch 代码实例,展示如何加载和使用预训练的 GloVe 词向量,并将其应用于查找相似词和完成词类比任务。我们将一步步解析代码,帮助大家理解其背后的原理。

在这里插入图片描述

完整代码:下载链接

加载预训练词向量

首先,我们需要一种方式来加载和管理预训练的词向量。下面我们将定义一个 TokenEmbedding 类,它能够从文本文件中加载词向量(如 GloVe 或 fastText 格式),并提供方便的接口来查询词语对应的向量。

TokenEmbedding 类详解

这个类将负责以下核心功能:

  1. 从指定的词向量文件加载词汇表和对应的向量。
  2. 为词汇表中的每个词创建一个索引。
  3. 为不在词汇表中的“未知”词(unk)提供一个默认向量(通常是零向量)。
  4. 允许通过词语列表快速获取它们对应的向量矩阵。
import torch
import osclass TokenEmbedding:"""GloVe词嵌入类用于加载和使用预训练的词向量(如GloVe、fastText等)"""def __init__(self, embedding_name):"""初始化TokenEmbedding对象参数:embedding_name (str): 嵌入文件名(不含扩展名),例如 'glove.6B.50d'属性:idx_to_token (list): 索引到词汇的映射列表,维度为[vocab_size]idx_to_vec (torch.Tensor): 索引到向量的映射矩阵,维度为[vocab_size, embedding_dim]unknown_idx (int): 未知词汇的索引,默认为0token_to_idx (dict): 词汇到索引的映射字典"""# 加载嵌入文件,获取词汇列表和向量矩阵self.idx_to_token, self.idx_to_vec = self._load_embedding(embedding_name)# 设置未知词汇的索引为0(对应'<unk>'标记)self.unknown_idx = 0# 创建词汇到索引的反向映射字典# token_to_idx: dict,键为词汇(str),值为索引(int)self.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}def _load_embedding(self, embedding_name):"""从文件加载预训练的词嵌入参数:embedding_name (str): 嵌入文件名返回:idx_to_token (list): 词汇列表,维度为[vocab_size]idx_to_vec (torch.Tensor): 词向量矩阵,维度为[vocab_size, embedding_dim]"""# 初始化词汇列表和向量列表,第一个位置预留给未知词汇标记idx_to_token = ['<unk>']  # list,存储所有词汇,维度为[vocab_size]idx_to_vec = []  # list,临时存储向量,后续转换为tensor# 构建数据文件路径data_dir = embedding_name + ".txt"# GloVe网站:https://nlp.stanford.edu/projects/glove/# fastText网站:https://fasttext.cc/# 检查文件是否存在if not os.path.exists(data_dir):print(f"警告:嵌入文件 {data_dir} 不存在。请确保已下载并放置在正确路径。")print("例如,可以从 https://nlp.stanford.edu/data/glove.6B.zip 下载glove.6B.50d.txt")# 为演示目的,创建一个空的占位符,实际应用中应抛出错误或处理# raise FileNotFoundError(f"嵌入文件 {data_dir} 不存在")return ['<unk>'], torch.zeros((1,1)) # 返回一个最小的有效结构# 逐行读取嵌入文件with open(data_dir, 'r', encoding='utf-8') as f:for line in f:# 移除行尾换行符并按空格分割elems = line.rstrip().split(' ')# 第一个元素是词汇,其余元素是向量值token = elems[0]  # str,当前词汇# 将字符串向量值转换为浮点数列表try:# 尝试转换,处理fastText首行可能不符合格式的情况vec_values = [float(elem) for elem in elems[1:]]  # list[float],维度为[embedding_dim]except ValueError:# print(f"跳过格式不正确的行: {line[:50]}...") # 对于fastText,这可能是第一行continue# 跳过标题信息或格式错误的行(例如fastText中的首行通常是词汇数和维度)if len(vec_values) > 1 and token: # 确保有向量值且token不为空idx_to_token.append(token)idx_to_vec.append(vec_values)# 为未知词汇<unk>创建零向量# 向量维度与其他词汇向量保持一致embedding_dim = len(idx_to_vec[0]) if idx_to_vec else 50 # 如果列表为空,默认50维unknown_vec = [0.0] 
http://www.xdnf.cn/news/14426.html

相关文章:

  • linux 阻塞和非阻塞
  • 【JAVA】支付,积分相关代码开发总结
  • Linux信号机制:进程异步通信的秘密
  • 黑马python(六)
  • 【Canvas与艺术】三只堂前燕
  • DAY49 超大力王爱学Python
  • 深度解析Vue路由原理与实战指南
  • AUTOSAR Adaptive系统如何进行时间同步与延迟分析?
  • YOLOv11改进 | Conv/卷积篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv11有效涨点(二次创新C3k2)
  • 【 C++ 模板中 `template<typename T>` 与 `template<class T>` 的深度解析】
  • springboot测试类原理
  • AI编程:正在拉开新一轮“人与人”的差距
  • Kafka多副本机制
  • python 将字典的值替换为键名作为变量名的形式(带缩进)
  • 基于51单片机的直流电动控制速度系统proteus仿真
  • leetcode 分割回文串 java
  • 总结用ubuntu一直以来遇到的问题
  • 加盐加密算法
  • 浏览器基础及缓存
  • 【Linux】Linux 信号驱动I/O
  • Git 配置 SSH 密钥与私钥教程(跨平台完整指南)
  • 京东API接口最新指南:店铺所有商品接口的接入与使用
  • 易语言模拟真人鼠标轨迹算法 - 非贝塞尔曲线
  • 大模型的开发应用(十一):对话风格微调项目(下):微调与部署
  • 《AI辅助编程:从零掌握核心逻辑》工作坊开业
  • mysql修改密码笔记
  • 基于51单片机的智能小车:按键调速、障碍跟踪、红外循迹与数码管显示(一个合格的单片机课设)
  • 浙江康冠锁业携智能锁具亮相2025上海国际快递物流展
  • 山东大学软件学院创新项目实训开发日志——第十七周(二)
  • 【C语言扩展识别实数负数】2022-5-29