预训练词向量的使用

news2024/9/28 10:15:58

目录

1.代码实现

2.知识点:


 

两个网站可以下载预训练词向量

  • GloVe网站:GloVe: Global Vectors for Word Representation
  • fastText网站:https://fasttext.cc

1.代码实现

import os
import torch
from torch import nn
import dltools
class TokenEmbedding:    #没写括号,就是继承python默认的Object类
    def __init__(self, file_path):
        self.idx_to_token, self.idx_to_vec= self._load_embedding(file_path)
        self.unknown_idx = 0
        #创建 词与索引 对应的词典
        self.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}
        
    
    #加载预训练好的词向量
    def _load_embedding(self, file_path):
        #创建列表,分别存放词与词向量对应的索引
        idx_to_token, idx_to_vec = ['<unk>'], []  #在存放词索引的列表中先加一个未知字符<unk>
        with open(file_path, 'r', encoding='utf-8') as f:
            #对于数据量非常大的文件读取,把其当做迭代器,一行行遍历输出,避免一下子把整个文件加载进来
            for line in f:
                #strip()移除字符串头尾指定的字符 ( 默认为空白符 ) 空格 ( ' ' ) 、制表符 ( \t ) 、换行符 (\r\ ) 统称为空白符
                #rstrip()只对右边进行移除空白符操作
                elems = line.rstrip().split(' ')  #输出的elems就是一个列表
                token, elems = elems[0], [float(elem) for elem in elems[1:]]
                #跳过fasttext的第一行    fasttext的第一行只有两个元素(一个token, 一个elem) 
                if len(elems) > 1:
                    idx_to_token.append(token)
                    idx_to_vec.append(elems)
        
        #在idx_to_vec中为<unk>添加一个全是0的词向量   #idx_to_vec是一个二维列表
        idx_to_vec = [[0] * len(idx_to_vec[0])] + idx_to_vec
        return idx_to_token, torch.tensor(idx_to_vec)
    
    def __getitem__(self, tokens):
        """根据输入的tokens返回对应的词向量"""
        #根据tokens获取对应的词索引 
        #dict[token]索引字典中没有的元素会报错, dict.get(token, 0) 索引字典中没有的元素会返回0
        indices = [self.token_to_idx.get(token, self.unknown_idx) for token in tokens]
        #根据索引indices来获取对应的词向量
        vecs = self.idx_to_vec[torch.tensor(indices)]
        return vecs
    
    def __len__(self): 
        """返回tokens的数量长度"""
        return len(self.idx_to_token)
glove_6b50d = TokenEmbedding(r'E:/ALOT/10_deep_learning/data/glove.6B/glove.6B.50d.txt')
len(glove_6b50d)
400001
glove_6b50d.token_to_idx['beautiful']
3367
glove_6b50d.idx_to_token[3367]   #idx_to_token是列表,可以根据索引来获取值

 'beautiful'

#计算余弦相似度来衡量词的相似度
def knn(W, x, k):
    cos = torch.mv(W,x.reshape(-1, )) / (torch.sqrt(torch.sum(W * W, axis=1) + 1e-9) * torch.sqrt((x * x).sum()))
    #筛选cos前10位
    _, topk = torch.topk(cos, k=k)
    return topk, [cos[int(i)] for i in topk] 
def get_similar_tokens(query_token, k, embed):
    #获取topk, cos
    #embed.idx_to_vec 已经做了embed的词向量
    #embed[[query_token]]获取查询词的词向量
    topk, cos = knn(embed.idx_to_vec, embed[[query_token]], k+1)
    for i, c in zip(topk[1:], cos[1:]):   #排除查询词query_token它本身
        print(f'{embed.idx_to_token[int(i)]} : cosine相似度={float(c):.3f}')
#查询“chip芯片”的相似词
get_similar_tokens('chip', 3, glove_6b50d)
chips : cosine相似度=0.856
intel : cosine相似度=0.749
electronics : cosine相似度=0.749
#词类比
#例如: man - woman :  son - daughter
#上面相当于
#-->daughter = woman - man  + son
def get_analogy(token_a, token_b, token_c, embed):
    #分别获取token_a, token_b, token_c的词向量
    vecs = embed[[token_a, token_b, token_c]]
    x = vecs[1] - vecs[0] + vecs[2]
    topk, cos = knn(embed.idx_to_vec, x, 1)
    return embed.idx_to_token[int(topk[0])]
get_analogy('man', 'woman', 'son', glove_6b50d)

'daughter' 

#加载fastText词向量
fasttext_16b300d = TokenEmbedding(r'E:/ALOT/10_deep_learning/data/wiki-news-300d-1M.vec')
len(fasttext_16b300d)
999995
fasttext_16b300d.token_to_idx['boy']

 2033

fasttext_16b300d.idx_to_token[2033]

 'boy'

fasttext_16b300d.idx_to_vec[2033].shape


fasttext_16b300d.idx_to_vec[2033].reshape(-1,).shape

 两个形状输出都是:

torch.Size([300])
get_similar_tokens('boy', 2, fasttext_16b300d)

 

girl : cosine相似度=0.862
boys : cosine相似度=0.772 
get_analogy('man', 'woman', 'son', fasttext_16b300d)  #词类比效果比较差

 'son'

2.知识点:

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑异步区域调频资源互济的电能、惯性与一次调频联合优化出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Web后端开发原理!!!什么是自动配置???什么是起动依赖???

引言&#xff1a; 当然&#xff0c;在我们学习的过程中&#xff0c;得知其然&#xff0c;还得知其所以然。So理解了其原理&#xff0c;更能让我们对其开发的理解&#xff0c;遇到问题&#xff0c;也更能快速找到解决办法&#xff01;&#xff01;&#xff01; 1. SprngBoot-配…

网站建设中,营销型网站与普通网站有什么区别

营销型网站与普通网站在建站目的、交互设计以及结构优化等方面存在区别。以下是具体分析&#xff1a; 建站目的 营销型网站&#xff1a;以销售和转化为主要目标&#xff0c;通过专业的市场分析和策划来吸引潜在客户&#xff0c;并促使其采取购买行动。普通网站&#xff1a;通常…

Golang | Leetcode Golang题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }

Python in Excel作图分析实战!

Excel 中的 Python 现已正式发布&#xff0c;适用于 Microsoft 365 商业版和企业版的 Windows 用户。去年 8 月&#xff0c;微软与 Anaconda 合作&#xff0c;通过集成 Python 为 Excel 引入了一个令人兴奋的新增功能&#xff0c;从而可以将 Python 和 Excel 分析无缝结合到同一…

OLMo - 训练和使用AI2 模型

文章目录 一、关于 OLMo安装 二、模型概览Checkpoints 三、推理关于微调检查点的推理量化 四、Reproducibility训练检查训练数据 五、微调六、评估 一、关于 OLMo OLMo: Open Language Model OLMo是一个用于训练和使用AI2最先进的开放语言模型的存储库。它由科学家为科学家构建…

java初识

目录 1.命名规范 2.数据类型 3.数据类型转换&#xff08;就是见识一下&#xff09; 4.java里面的输入输出 4.1判断是不是偶数 4.2判断是不是闰年 4.3其他的输入输出 4.4顺序的问题 5.分支语句补充 5.IDEA里面的调试 6.continue的一个案例 1.命名规范 这个命名规范就…

【Mysql】Mysql数据库基本操作-------DDL(中)

1、对表结构的常用操作----创建表 创建表格式&#xff1a; creat table (if not exists ) (可以省略&#xff09; 表名( 字段一 类型[&#xff08;宽度&#xff09;] [约束条件] [comment 字段说明], 字段二 类型[&#xff08;宽度&#xff09;] [约束条件] […

翻译:Recent Event Camera Innovations: A Survey

摘要 基于事件的视觉受到人类视觉系统的启发&#xff0c;提供了变革性的功能&#xff0c;例如低延迟、高动态范围和降低功耗。本文对事件相机进行了全面的调查&#xff0c;并追溯了事件相机的发展历程。它介绍了事件相机的基本原理&#xff0c;将其与传统的帧相机进行了比较&am…

Github 2024-09-28Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Starlark项目1Python项目1TypeScript项目1Pake: 利用 Rust 轻松构建轻量级多端桌面应用 创建周期:491 天开发语言:Rust协议类型:M…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…

LeetCode[中等] 78.子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 思路 迭代法 每次遍历nums中的新的数&#xff0c;将其加到之前所有得到的set中&#xff0c…

多个树模型特征贡献度与可视化

背景 在机器学习中&#xff0c;特征的重要性是了解模型如何做出预测的关键指标之一&#xff0c;在树模型中&#xff0c;特征重要性通常通过特征的分裂节点来衡量&#xff0c;通过观察特征在模型中的贡献&#xff0c;可以对数据集中的重要特征有更深入的理解&#xff0c;之前的…

F28335 的 EPWM 外设

1 PWM 简介 2 F28335的ePWM介绍 2.1 时基模块TB &#xff08;1&#xff09;时基模块的功能 &#xff08;2&#xff09;时基模块的关键信号和寄存器 给出时基模块内部结构图来了解里面的关键信号和寄存器&#xff0c;时基模块内部结构图如下所示&#xff1a; &#xff08;3…

十一假期地区人流量出行大数据分析:技术驱动下的深度洞察

随着国庆黄金周的临近&#xff0c;旅游市场再次迎来了一年一度的出行高峰。在这个数字化时代&#xff0c;如何利用大数据、第三方接口等先进技术进行数据采集与分析&#xff0c;以更精准地预测人流量、优化资源配置、提升旅游体验&#xff0c;成为了行业内外关注的焦点。 一、…

播放器 SDK

腾讯云视立方播放器 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的子产品 SDK 之一&#xff0c;基于腾讯云强大的后台能力与 AI 技术&#xff0c;提供视频点播和直播播放能力的强大播放载体。结合腾讯云点播或云直播使用&#xff0c;可以快速体验流畅稳定的播放…

Debian安装mysql遇到的问题解决及yum源配置

文章目录 一、安装mysql遇到的问题解决二、Debain系统mysql8.0的安装以及远程连接三、彻底卸载软件四、Python 操作 mysql五、debian软件源source.list文件格式说明1. 第一部分2. 第二部分3. 第三部分4. 第四部分5. 关于源的混用问题6. 按需修改自己的sources.list7. 更新软件包…

部标主动安全(ADAS+DMS)对接说明

1.前言 上一篇介绍了部标&#xff08;JT/T1078&#xff09;流媒体对接说明&#xff0c;这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#x…

相机的内参 外参

相机的内参和外参是计算机视觉和摄影测量中的重要概念。以下是对它们的详细说明&#xff1a; 内参&#xff08;Intrinsic Parameters&#xff09; 内参定义了相机的内部特性&#xff0c;主要包括焦距、主点坐标以及畸变系数。内参矩阵 K 形式如下&#xff1a; 外参&#xf…

C++-list使用学习

###list&#xff08;链表&#xff09;是C里面的一种容器&#xff0c;底层是双向的&#xff1b; 这就决定了它的迭代器使用的场景和能够使用的算法&#xff1b;双向&#xff08;例如list&#xff09;不能像随机&#xff08;例如vector&#xff09;那样用迭代器任意加上几去使用&…