利用 Pytorch 加载词向量库文件

1. 示例代码

完整代码:

import torch
from torch.nn import Embedding

# 载入讯飞词向量文件
word_vector_file = '../Downloads/tencent-ailab-embedding-zh-d100-v0.2.0-s.txt' # 库文件的路径。本程序选择了最小的一个库文件。
word_vectors = {}
with open(word_vector_file, 'r', encoding='utf-8') as f:
    for line in f:
        word, vector_str = line.split(' ', 1)
        vector = torch.FloatTensor([float(x) for x in vector_str.split()])
        word_vectors[word] = vector

# 构建词典和词向量矩阵
words = list(word_vectors.keys())
word_dict = {w: i for i, w in enumerate(words)}
word_vectors_matrix = torch.stack(list(word_vectors.values()))

# 构建Embedding层
embedding = Embedding.from_pretrained(word_vectors_matrix)

# 得到某个单词的词向量
word = "勇敢"
word_idx = word_dict.get(word, None)
if word_idx is not None:
    word_vector = embedding(torch.LongTensor([word_idx]))
else:
    # 如果单词不在词向量文件中,则随机初始化一个词向量
    word_vector = embedding.weight.mean(dim=0, keepdim=True)

2. 数据流分析

  • step-01: 词向量文件.txt => word_vectors。word_vectors 是一个 (key = 词,value = 词向量) 的词典。
  • step-02:word_vectors.keys() => word_dict。word_dict 是一个词的索引倒排表,给定单词,可查出顺序号。因为后面会把词向量表转换成张量,因此,查询单词对用的词向量,必须根据顺序号才可以。
  • step-03:word_vectors.values() => word_vectors_matrix。把词向量列表转成矩阵,详见后面的代码详解。
  • step-04:word_vectors_matrix => embedding。词向量矩阵转成嵌入层。嵌入层是神经网络中的一部分,用于将词汇表中的单词(由数字表示)转换为词向量,以便神经网络进行学习和预测。
  • step-05: word => word_idx。根据单词,得到它在词向量表中的顺序号。
  • step-06:word_idx + embedding => word_vector。查询顺序号为 word_idx 的词向量。

3. 代码详解

word, vector_str = line.split(' ', 1)

这行代码将字符串“line”根据第一个空格分割成两个部分,并将分割后的结果保存在两个变量“word”和“vector_str”中。

具体来说,变量“word”是第一个空格之前的子串,变量“vector_str”是第一个空格之后的剩余子串。参数“1”表示最多只对“line”进行一次分割,因此如果“line”中有多个空格,只会将第一个空格作为分隔符。

这种操作常见于通过空格或其他特定字符来分割文本数据,并将分割后的结果存储到不同的变量中进行进一步处理。例如,在NLP任务中,可能会将每个单词的向量存储为一个文本文件,每行格式为“word value1 value2 … valuen”,该语句就可以帮助将每行数据分解成单词和向量值两部分。

vector = torch.FloatTensor([float(x) for x in vector_str.split()])

这行代码首先将变量“vector_str”按空格分割成一组字符串,然后使用列表推导式将每个字符串转化为浮点数,并将它们作为一个列表传递给torch.FloatTensor()函数。该函数将得到的列表转换为PyTorch张量(tensor),并赋值给变量“vector”。

这里的张量是PyTorch中的一种数据结构,类似于多维数组,可以用来存储和进行高效计算。该语句构建了一个浮点型的一维张量(即向量),其中每个元素对应于分隔符分割的字符串所表示的浮点数。

总之,这一行代码的目的是将一个表示向量的字符串转化为一个一维的PyTorch张量,以便后续的计算和处理。

word_vectors[word] = vector

这行代码将变量“vector”赋值给字典“word_vectors”的键“word”,其中“word_vectors”是一个存储单词向量的字典变量,而“word”是具体的单词。

这里“vector”是一个一维PyTorch张量(即向量),其表示了“word”所对应的向量。通过将其赋值给字典中的相应键,“word_vectors”就可以存储该单词的向量表示。

字典是 Python 中的一种 可变数据类型,它是一种键-值(key-value)映射的集合,可用于存储各种类型的数据。在这里,字典“word_vectors”可以用于存储单词及其对应的向量表示,从而方便后续的机器学习或自然语言处理任务中的使用。

words = list(word_vectors.keys())

这行代码将创建一个名为“words”的列表变量,其中包含了“word_vectors”字典中所有键(即所有单词)的列表。

具体而言,函数“word_vectors.keys()”返回一个迭代器对象,其中包含“word_vectors”字典中所有的键。通过将这个迭代器对象传递给“list()”函数,可以将其转换为一个包含所有键的列表。代码把这个列表赋给变量“words”,以便于我们能够归纳地处理字典中的每个键值对。

这行代码通常用于在对单词向量进行处理时,需要遍历所有单词,并进行一些操作的情况下。例如,可能需要计算两个单词之间的相似度,这就需要比较两个向量的余弦距离值。此时需要一个包含所有单词的列表,以便于按顺序获取每个单词的向量表示,并进行一些数学计算和处理。

word_dict = {w: i for i, w in enumerate(words)}

这行代码创建了一个名为“word_dict”的字典变量,其中包含了单词列表“words”中的所有单词,并为每个单词赋予了一个唯一的整数ID。每个单词都作为键,与其对应的整数ID作为值。

具体而言,代码使用了Python中的一种语法规则“字典推导式”,即通过一行代码在创建字典时完成键值对的定义和赋值操作。

上述代码执行的具体步骤如下:

  1. 循环遍历“words”列表中每个单词。循环过程中,“enumerate(words)”函数用来同时获取单词列表“words”中每个单词的索引i和该单词w。这样可以方便地记录每个单词在列表中的位置。

  2. 对于每个遍历到的单词w,将它与对应的整数i一起作为键值对添加到字典变量“word_dict”中。这里“{w: i}”表示一个包含单个键值对的字典,表示单词w和对应的整数i的映射关系。

  3. 最终将所有遍历到的单词都添加到了字典“word_dict”中,并为每个单词赋予了一个唯一的整数ID。

这行代码的主要用途是在文本分析任务中,将单词映射到唯一的整数ID,便于模型处理和优化。这是因为许多模型需要将输入的单词表示成向量形式,而这通常需要通过查询包含单词及其向量表示的字典进行实现。在此过程中,将单词映射到唯一的整数ID可以避免语义相似的不同单词造成的混淆和误差。

word_vectors_matrix = torch.stack(list(word_vectors.values()))

这行代码的作用是将一个包含所有词向量的字典转换成一个tensor形式的矩阵。

具体而言,代码使用了pytorch库中的torch.stack函数和Python中的list结构。

首先,代码中的word_vectors是一个字典,其中每个键表示一个单词,而每个值则是对应单词的词向量,即一个一维tensor。

然后,代码使用Python内置函数list()将所有的词向量拼接成一个列表,此时得到一个列表,列表中的每个元素都是具有相同维数的张量;接着使用torch.stack()按照行的方式将它们组合为一个新张量。这就是代码的目的:

  1. 首先通过“list(word_vectors.values())”将所有词向量以列表的形式存储并传给torch.stack函数。

  2. torch.stack函数调用后会将所有输入的元素沿着新的维度将它们拼接起来,返回一个新的张量对象。

  3. 最终将所有单词的词向量堆叠成一个矩阵对象“word_vectors_matrix”。此时“word_vectors_matrix”矩阵的维度为(n, d),其中n是词典中单词数量,d是每个单词的词向量维度。

这种将词向量矩阵转换成tensor的方式可以方便进行大规模的计算和矩阵操作,像词向量相加或者平均池化,同时也可以便于将这个Tensor作为神经网络的输入。

embedding = Embedding.from_pretrained(word_vectors_matrix)

这行代码的作用是将预先训练好的词向量矩阵“word_vectors_matrix”传入到嵌入层(Embedding)中,并返回一个新的嵌入层对象“embedding”。

具体而言,Embedding.from_pretrained()函数是在PyTorch中用来生成一个预训练的嵌入层的方法。它使用了预训练的权重来初始化网络中的嵌入层,这里是使用预先训练好的词向量矩阵来初始化嵌入层。

通过指定参数“word_vectors_matrix”,Embedding.from_pretrained()函数会将所有单词的词向量矩阵作为输入,生成一个新的嵌入层对象。可以看作是一种单词向量表征方法,每个单词都映射到一个d维的向量上。嵌入层是神经网络中的一部分,用于将词汇表中的单词(由数字表示)转换为词向量,以便神经网络进行学习和预测。

嵌入层“embedding”中保存着一个用于查找任意词汇表中单词对应嵌入值的方法,通过对嵌入层调用该方法可以返回任意单词对应的预训练的向量。 这个向量可以代表一个词在N维向量空间内的位置,可以作为神经网络的输入,在自然语言处理任务中进行模型训练和推理。由于词向量是通过预训练得到的,并且已经捕捉到了文本数据集中单词之间的相关性,这可以加速神经网络的收敛,并提高预测性能。

word = "勇敢"
word_idx = word_dict.get(word, None)

这段代码是在一个程序中使用了一个字典变量word_dict,该字典中包含了一些词语及其在程序中所对应的数字编号。其中word = "勇敢"表示要查找的词语是“勇敢”,word_idx是用于存储查询结果的变量,get()方法可以用来获取指定key对应的value值。如果word_dict中存在“勇敢”这个词,那么该函数会返回这个词的编号并赋值给word_idx变量;如果word_dict中不存在这个词,则返回None。

word_vector = embedding(torch.LongTensor([word_idx]))

这段代码是用PyTorch实现的嵌入层对输入词语进行词向量编码的过程。其中word_idx表示输入词在词典中的索引,torch.LongTensor([word_idx])会将该索引值转化为一个LongTensor类型的变量作为输入,传递给embedding函数进行编码。embedding函数是PyTorch中的一个嵌入层函数,接收一个整数型的Tensor作为输入,将其转化成一个词向量矩阵输出。为加速运算,通常会采用GPU进行计算,因此这里使用了torch.LongTensor()来将word_idx转换为PyTorch张量的格式以便在GPU上运行。最终经过词向量编码的结果被存储在word_vector变量中。

word_vector = embedding.weight.mean(dim=0, keepdim=True)

这段代码是用PyTorch实现的计算嵌入层的权重矩阵embedding中所有词向量的平均值,然后将结果赋值给word_vector。其中,embedding.weight表示嵌入层的权重矩阵,该矩阵的大小为vocabulary_size * embedding_dim,vocabulary_size表示词典大小,embedding_dim表示词向量维度。mean(dim=0, keepdim=True)表示对embedding.weight按照第0维(也就是第一维)进行取平均值,即对所有词向量进行了平均操作。keepdim=True表示不改变张量的形状,保持和原始张量一样的形状。最后得到的平均值被存储在一个大小为1 * embedding_dim的张量中。因此,word_vector即为所有词向量的平均值,仍然是一个embedding_dim维的向量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/25189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚焦2023北京安博会,超高清安防应用将成潮流

(1)2023北京安博会 中国安全防范产品行业协会主办并承办的第十六届(2023)中国国际社会公共安全产品博览会(Security China 2023),将于2023年6月7~10日在北京首钢会展中心开幕。安博…

前端vscode插件bito

GPT-4和ChatGPT越来越火,前端人员是否也能在日常工作中尝试体验其带来的乐趣呢? 答案是可以的!安排!! 今天介绍一款vscode的插件 【bito】。 安装 安装后只需要自己注册一下,创建一个workspace就可以使用…

实验室信息系统源码,LIS源码

实验室信息系统源码,LIS源码 技术细节: SaaS架构的Client/Server应用 体系结构:Client/Server架构 客户端:WPFWindows Forms 服务端:C# .Net 数据库:Oracle 接口技术:RESTful API HttpW…

全面解析Linux指令和权限管理

目录 一.指令再讲解1.时间相关的指令2.find等搜索指令与grep指令3.打包和压缩相关的指令4.一些其他指令与热键二.Linux权限1.Linux的权限管理2.文件类型与权限设置3.目录的权限与粘滞位 一.指令再讲解 1.时间相关的指令 date指令: date 用法:date [OPTION]… [FOR…

如何在Linux中更改SSH端口?

SSH(Secure Shell)是一种安全的远程登录协议,它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下,SSH使用22端口进行通信。然而,为了增强系统的安全性,有时候我们需要更改SSH端口,…

linux 找回root密码(CentOS7.6)

linux 找回root密码(CentOS7.6) 首先,启动系统,进入开机界面,在界面中按“e”进入编辑界面。如图 2. 进入编辑界面,使用键盘上的上下键把光标往下移动,找到以““Linux16”开头内容所在的行数”,在行的最后…

C4D R26 渲染学习笔记 建模篇(2):手动建模

文章目录 前文回顾介绍篇建模篇 手动建模建模快捷键手动模型快捷键大全常用操作N系快捷键K系快捷键U系快捷键 结尾 前文回顾 介绍篇 C4D R26 渲染学习笔记(1):C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记(2)&am…

Dubbo高可用

1.zookeeper宕机与dubbo直连 1.1.现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。 原因: 监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但…

软考A计划-试题模拟含答案解析-卷十二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

AB Test数学原理及金融风控应用

1 什么是AB Test AB测试是一种常用的实验设计方法,用于比较两个或多个不同处理或策略的效果,以确定哪个处理或策略在某个指标上表现更好。在AB测试中,将随机选择一部分用户或样本,将其分为两个或多个组,每个组应用不同…

Java: IO流

1.定义 IO流:存储和读取数据的解决方案 用于读写文件中的数据(可以读写文件,或网络中的数据...) 2.IO流的分类 1.按着流的方向 1.输入流:读取 2.输出流:写出 2.按照操作文件类型 1.字节流:所有类型文件 体系&…

机器学习-5 朴素贝叶斯算法

朴素贝叶斯算法 算法概述数理统计学处理的信息古典学派和贝叶斯学派的争论贝叶斯定理朴素贝叶斯分类训练朴素贝叶斯:朴素假设案例:预测打网球拉普拉斯平滑技术小结 算法流程与步骤算法应用sklearn中的朴素贝叶斯朴素贝叶斯的使用算法实例 算法概述 数理…

【服务器】使用Nodejs搭建HTTP web服务器

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 [TOC] 转载自内网穿透…

一个完整的APP定制开发流程是怎样的?

随着移动互联网的发展,越来越多的 APP应用软件进入人们的生活,让我们的生活更便捷、更舒适。而随着互联网技术的进步,移动互联网应用软件开发行业也越来越成熟,为了适应市场需求,各种功能强大、性能良好的 APP应用软件…

C/C++ ---- 内存管理

目录 C/C内存分布 常见区域介绍 经典习题(读代码回答问题) 选择题 填空题 C语言内存管理方式 malloc/free calloc realloc C内存管理方式 new和delete操作内置类型 new和delete操作自定义类型 operator new和operator delete函数 new和dele…

C++11常用的一部分新特性

C11 统一的列表初始化{}初始化std::initializer_list 声明autodecltypenullptr STL中一些变化新容器已有容器的新接口 右值引用和移动语义左值引用和右值引用右值引用使用场景和意义右值引用引用左值及其一些更深入的使用场景分析完美转发 新的类功能默认…

opencv_c++学习(二十四)

一、积分图像 积分图像是对原图像进行积分操作的算法。如上图左所示,不同颜色代表不同区域。当我们想求取一个像素点的积分值时,我们需要求取该点左上方区域的数据之和,如P0的积分值是浅蓝色区域的数据之和。 P1的积分值为蓝色和橙色区域的数…

网页JS自动化脚本(八)使用网页专属数据库indexedDB进行数据收集

我们在网页上进行的活动,往往都需要进行收集一些简单的数据,但是因为浏览器的安全原因,浏览器基本上是无法与本地的操作系统直接产生数据交互的,这本来就是一个由于安全问题生产的无解问题,在浏览器里面是内置了几种数据库的,其中一种就是indexedDB,可以用来储存一些非常小的数…

C++进阶 —— 线程库(C++11新特性)

十,线程库 thread类的简单介绍 在C11之前涉及多线程问题,都是和平台相关的,如windows和Linux下各有自己的接口,这使代码的可移植性较差;C11中最重要的特性就是对线程进行支持,使得C在并行编程时不需要依赖…

Axure教程—水平方向多色图(中继器)

本文将教大家如何用AXURE制作动态水平方向多色图 一、效果介绍 如图: 预览地址:https://l83ucp.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87822666 二、功能介绍 简单填写中继器内容即可生成动态水平多色…