4-4 Representing text Exercise

本文所用资料下载

一. Representing text
Let’s load Jane Austen’s Pride and Prejudice.

在这里插入图片描述

We first split our text into a list of lines and pick an arbitrary line to focus on:

with open('D:jane-austen/1342-0.txt', encoding='utf8') as f:
    text = f.read()
lines = text.split('\n')
line = lines[200]
line

在这里插入图片描述

Let’s create a tensor that can hold the total number of one-hot-encoded characters for the whole line:

import torch
letter_t = torch.zeros(len(line), 128) # 128 hardcoded due to the limits of ASCII
letter_t.shape

在这里插入图片描述

# 遍历经过转换为小写并剥去首尾空白的字符串line中的每个字符
# enumerate函数用于在每次迭代中获取索引i和字符letter
for i, letter in enumerate(line.lower().strip()):
	# 检查小写字母的ASCII值是否小于128。如果是,ASCII值就赋给letter_index,否则设置为0。
	# 这是为了处理ASCII值在0-127范围之外的字符
    letter_index = ord(letter) if ord(letter) < 128 else 0
    # 与字符的ASCII值对应的元素设置为1,其他元素设置为0
    letter_t[i][letter_index] = 1

循环结束时,letter_t将包含一个矩阵,其中每一行对应输入字符串中的一个字符,列表示ASCII值(最大到127),在与字符的ASCII值对应的列中为1,在其他地方为0。

We’ll define clean_words, which takes text and returns it in lowercase and stripped of punctuation. When we call it on our “Impossible, Mr. Bennet” line, we get the following:

def clean_words(input_str):
    punctuation = '.,;:"!?”“_-'
    # replace将换行符替换为空格,split()将字符串拆分成单词列表
    word_list = input_str.lower().replace('\n',' ').split()
    # 去除单词开头和结尾的标点字符
    word_list = [word.strip(punctuation) for word in word_list]
    return word_list
words_in_line = clean_words(line)
line, words_in_line

在这里插入图片描述

Next, let’s build a mapping of words to indexes in our encoding:

# set将清理后的单词列表转换为集合来去除重复单词,sort进行排序
word_list = sorted(set(clean_words(text)))
# 使用enumerate函数遍历word_list中的每个单词word和对应的索引i(将单词映射到它在排序后的单词列表中的索引位置),然后创建一个名为word2index_dict的字典,其中键是单词word,值是索引i
word2index_dict = {word: i for (i, word) in enumerate(word_list)}
len(word2index_dict), word2index_dict['impossible']

在这里插入图片描述

Let’s now focus on our sentence: we break it up into words and one-hot encode it—that is, we populate a tensor with one one-hot-encoded vector per word.

# 行数是 words_in_line 中的单词数量,列数是整个文本中出现的不同单词数量
word_t = torch.zeros(len(words_in_line), len(word2index_dict))
for i, word in enumerate(words_in_line):
	word_index = word2index_dict[word]
	word_t[i][word_index] = 1
	# {:2}表示若不足2个字符,左侧填充空格补齐
	print('{:2} {:4} {}'.format(i, word_index, word))
print(word_t.shape)

在这里插入图片描述

字符级别编码和单词级别编码各有利弊。字符级别编码涉及表示更少的类别(单个字符),而单词级别编码需要表示更多的类别(单词),并且需要处理词汇表之外的词汇。字符级别编码具有更少的类别集,但可能无法捕捉单词的全部含义。另一方面,单词级别编码传达更多的语义信息,但涉及管理更大的词汇量。

在这里插入图片描述

因此提出了一种中间方法 byte pair encoding method。它从字典中的个别字母开始,逐步将频繁出现的字节对添加到字典中,直到达到一定的大小。这种方法结合了字符和单词级别编码的一些优点。

在这里插入图片描述
One-hot encoding在有限数量的类别数据上有效,但在像自然语言中这样的大词汇量情况下,变得不实用,因为词语几乎是无限的,因此我们提出了vectors of floating-point numbers。一个包含100个浮点数的向量确实可以表示大量的词,将单个单词映射到这个100维空间中,从而促进后续学习,这叫做embedding。我们可以简单地迭代词汇表,并为每个单词生成一组100个随机浮点数。

We can generate a 2D space where axes map to nouns—fruit (0.0-0.33), flower (0.33-0.66), and dog (0.66-1.0 —and adjectives—red (0.0-0.2), orange (0.2-0.4), yellow (0.4-0.6), white (0.6-0.8), and brown (0.8-1.0). Our goal is to take actual fruit, flowers, and dogs and lay them out in the embedding.

当我们开始嵌入单词时,我们可以将苹果映射到水果和红色象限中的一个数字。向日葵可以得到花,黄色和棕色,然后雏菊可以得到花,白色和黄色。

Now our embeddings look like figure 4.7.

在这里插入图片描述

结果嵌入的一个有趣的方面是,相似的单词不仅聚集在一起,而且与其他单词有一致的空间关系。例如,如果我 取苹果的嵌入向量,然后开始加减其他单词的向量,我们可以开始进行类似于苹果-红-甜+黄+酸的类比,最后得 一个非常类似于柠檬的向量。

词汇表中的一个词到一个向量的映射不是固定的,而是取决于周围的句子。然而,它们经常被使用,就像我们在 里提到的简单的经典嵌入一样。

一旦生成了词嵌入,它们可以作为各种下游NLP(自然语言处理)任务的输入,如情感分析、机器翻译、文本生成等。现代的嵌入模型如BERT和GPT-2比基本词嵌入更复杂,融合了复杂的神经架构,更有效地捕捉上下文和含义。词嵌入是NLP中的一个关键概念,使机器能够理解和处理词语之间的语义关系,从而在各种语言相关的任务中实现更好的性能。

二. exercise
答案仅供参考

  1. Take several pictures of red, blue, and green items with your phone or other digital camera (or download some from the internet, if a camera isn’t available).
    (1)Load each image, and convert it to a tensor.
    (2)For each image tensor, use the .mean() method to get a sense of how bright
    the image is.
    (3)Take the mean of each channel of your images. Can you identify the red,
    green, and blue items from only the channel averages?

解:以一张图片为例

在这里插入图片描述

(1)

import imageio.v2 as imageio
img_arr=imageio.imread('D:/3e/1.jpg')  # 使用imageio模块加载图像
import torch
img = torch.from_numpy(img_arr) # 转化为tensor
out = img.permute(2, 0, 1)  # H × W × C 转为 C × H × W

(2)

out=out.float()  # mean只能处理浮点型 
out_mean=out.mean()
#  out_mean输出tensor(100.8920)

图像张量的平均值可以获得亮度的估计值,out_mean越大说明图片亮度越大

(3)

i1=out[0,:,:].mean()
i2=out[1,:,:].mean()
i3=out[2,:,:].mean()
i1,i2,i3

在这里插入图片描述
三个通道分别对应红绿蓝的均值,可以看到i1的均值最大,即图片偏红色

  1. Select a relatively large file containing Python source code.
    (1)Build an index of all the words in the source file (feel free to make your tokenization as simple or as complex as you like; we suggest starting with replacing r"[^a-zA-Z0-9_]+" with spaces).
    (2)Compare your index with the one we made for Pride and Prejudice. Which is larger?
    (3)Create the one-hot encoding for the source code file.
    (4)What information is lost with this encoding? How does that information compare to what’s lost in the Pride and Prejudice encoding?

解:
(1)

r"[^a-zA-Z0-9_]+"
r 在字符串前面表示"原始字符串",它不会对反斜杠进行转义处理,如
在这里插入图片描述> out:
在这里插入图片描述
^表示非
+表示前面的表达式可以连续出现一次或多次,它指示前面的模式可以匹配一个或多个相同的字符或子字符串。

在这里插入图片描述

with open('D:/model.py',encoding='utf8') as f:
    text=f.read()

在这里插入图片描述

以换行符切分,每块一行

lines=text.split('\n')

在这里插入图片描述

一共89行

在这里插入图片描述

将非字母数字下划线替换为空格,并按空格进行切分

def clean_words(input_str):
    word_list=input_str.replace(r'[^a-zA-Z0-9_]+',' ').split()
    return word_list
words_in_line = clean_words(text)
words_in_line

在这里插入图片描述

完成映射

# set将清理后的单词列表转换为集合来去除重复单词,sort进行排序
word_list = sorted(set(words_in_line))
# 使用enumerate函数遍历word_list中的每个单词word和对应的索引i
word_list_dict = {word: i for (i, word) in enumerate(word_list)}

在这里插入图片描述

(2)比Pride and Prejudice小
在这里插入图片描述
(3)

import torch
letter_t = torch.zeros(len(words_in_line), len(word_list)) # 行是单词数,列是去重后的单词数
for i, letter in enumerate(words_in_line):
    wordindex=word_list_dict[letter]
    letter_t[i][wordindex] = 1

在这里插入图片描述

(4)我们去除的非数字字母下划线的数据丢失了,python代码中有更多的非标点符号(例如“.”),因此会丢失更多的数据。

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

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

相关文章

简单了解文件上传漏洞(md版)

简单了解文件上传漏洞 一、什么是文件上传漏洞二、常见功能点三、成功的前提四、文件上传的校验方式五、Pass-1六、Pass-2七、蚁剑结合msf获取目标权限 一、什么是文件上传漏洞 在文件上传的功能处&#xff0c;如果服务端未对上传的文件进行严格的验证和过滤&#xff0c;导致攻…

登录校验-Filter-详解

目录 执行流程 拦截路径 过滤器链 小结 执行流程 过滤器Filter拦截到请求之后&#xff0c;首先执行方放行之前的逻辑&#xff0c;然后执行放行操作&#xff08;doFilter&#xff09;&#xff0c;然后会访问对应的Web资源&#xff08;对应的Controller类&#xff09;&#…

【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

文章目录 一、函数返回值不能是 " 局部变量 " 的引用或指针1、函数返回值常用用法2、分析函数 " 普通返回值 " 做左值的情况3、分析函数 " 引用返回值 " 做左值的情况 函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 &quo…

Acrobat Pro DC软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Acrobat Pro DC是Adobe公司开发的一款PDF编辑软件&#xff0c;简称为DC&#xff0c;是Acrobat系列软件中的一款&#xff0c;是行业内的标准工具&#xff0c;被广泛应用于文档处理、电子合同、PDF表单等领域。 Acrobat Pro DC软…

【SpringBoot】第一篇:redis使用

背景&#xff1a; 本文是教初学者如何正确使用和接入redis。 一、引入依赖 <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><depen…

适配器模式实现stack和queue

适配器模式实现stack和queue 什么是适配器模式&#xff1f;STL标准库中stack和queue的底层结构stack的模拟实现queue的模拟实现 什么是适配器模式&#xff1f; 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff…

基于广义神经网络的网络入侵检测Matlab代码

1.案例背景 1.1 FCM 聚类算法 聚类方法是数据挖掘中经常使用的方法,它将物理的或抽象的对象分为几个种群,每个种群内部个体间具有较高的相似性,不同群体内部间个体相似性较低。模糊c均值聚类算法(Fuzzy C- Mean, FCM)是用隶属度确定每个元素属于某个类别程度的一种聚类算法&am…

Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

一、简介 Rspack CLI 官方文档。 rspack.config.js 官方文档。 二、创建 vue 项目 创建项目&#xff08;文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式&#xff0c;根据需求进行选择&#xff09; # npm 方式 $ npm create rspacklatest# yarn 方式 $ yarn create…

AI 绘画Stable Diffusion 研究(十四)SD 图生图+剪映制作人物说话视频

大家好&#xff0c;我是风雨无阻。 前一篇&#xff0c;我们详细介绍了使用 SadTlaker制作数字人视频案例&#xff0c;感兴趣的朋友请前往查看:AI 绘画Stable Diffusion 研究&#xff08;十三&#xff09;SD数字人制作工具SadTlaker使用教程。 对于没有安装 SadTlaker 插件的朋友…

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中&#xff0c;全部都是单线的程序&#xff0c;也就是从头到尾…

leetcode 767. Reorganize String(重组字符串)

重新排列字符串s中的字母&#xff0c;使得任意两个相邻的字母都不相同。 思路&#xff1a; 让相邻字母不同&#xff0c;能想到的办法是先把相同的字母排列&#xff0c; 然后在相同字母的缝隙中插入另一种字母。 比如"aab", 先把"a a"排出来&#xff0c;再…

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 本文总结了v23.1中针对DevExpress报表和BI Das…

UI位置与布局

UI位置与布局 引言 发现UGUI的RectTransform定位还是很复杂的&#xff0c;感觉有必要详细了解一下 RectTransform 继承自Transform。他的local position由其他几个变量控制。建议不要直接设置position 目的是为了实现UI自动布局。这套方法将绝对定位&#xff0c;相对定位&a…

vue和react学哪一个比较有助于以后发展?

前言 首先声明vue和react这两个框架都是很优秀的前端框架&#xff0c;使用的人群下载量上数量也是相当的庞大&#xff0c;这篇文章没有贬低或者攻击任何一个框架的意思&#xff0c;只在于根据答主的问题来对这两个框架做出对比&#xff0c;以方便大家更加清晰的了解到当下vue和…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

分析系统 - 使用Python爬虫

在竞争激烈的市场环境中&#xff0c;了解和分析竞争对手的销售策略和市场表现对于企业的成功至关重要。本文将介绍如何利用Python爬虫建立低成本的销售竞争对手分析系统&#xff0c;探索其方法、工具和好处&#xff0c;并同时解决可能出现的问题。 销售竞争对手分析的目标是获取…

React基础入门之虚拟Dom

React官方文档&#xff1a;https://react.docschina.org/ 说明 重要提示&#xff1a;本系列文章基础篇总结自尚硅谷课程&#xff0c;且采用类式写法&#xff01;&#xff01;最新的函数式组件写法见高级篇。 本系列文档旨在帮助vue同学更快速的学习react&#xff0c;如果你很…

Android 13 - Media框架(6)- NuPlayer

上一节我们通过 NuPlayerDriver 了解了 NuPlayer 的使用方式&#xff0c;这一节我们一起来学习 NuPlayer 的部分实现细节。 ps&#xff1a;之前用 NuPlayer 播放本地视频很多都无法播放&#xff0c;所以觉得它不太行&#xff0c;这两天重新阅读发现它的功能其实很全面&#xff…

【80天学习完《深入理解计算机系统》】第十天 3.3 条件码寄存器【CF ZF SF OF】【set】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

第四方支付平台和聚合支付有什么区别?

第四方支付平台和聚合支付有什么区别&#xff1f; 聚合支付和第四方支付平台是移动支付领域的两种常见支付方式。它们在实际应用中有许多相似之处&#xff0c;给人们的生活带来了便利。然而&#xff0c;这两种支付方式也有本质的区别。我将从不同的角度对它们进行比较和分析。 …