d2l 文本预处理textDataset

这一节极其重要,重要到本来是d2l的内容我也要归到pyhon封面,这里面class的操作很多,让我娓娓道来!

目录

1.要实现的函数

2.读取数据集

3.词元化

4.Vocab类

4.1count_corpus(tokens)

4.2class中的各种self

4.2.1 _token_freqs是经过sorted排序后的list

4.2.2 token_to_idx是{token:idx}的字典

4.2.3两大索引to_tokens与原getitem

4.2.4 idx_to_token是所有token按出现次数多到少排列的list

4.2.5其它

5.该函数最终返回的东西:


1.要实现的函数

  整文都是围绕以下这个函数来展开的,因为后续就直接用了。包括返回的Vocab类:

def load_corpus_time_machine(max_tokens=-1): #@save
    """返回时光机器数据集的词元索引列表和词表"""
    lines = read_time_machine()
    tokens = tokenize(lines, 'char')
    vocab = Vocab(tokens)
    # 因为时光机器数据集中的每个⽂本⾏不⼀定是⼀个句⼦或⼀个段落,
    # 所以将所有⽂本⾏展平到⼀个列表中
    corpus = [vocab[token] for line in tokens for token in line]
    if max_tokens > 0:
        corpus = corpus[:max_tokens]
    return corpus, vocab

corpus, vocab = d2l.load_corpus_time_machine()
len(corpus), len(vocab)

'''
(170580, 28)
'''

2.读取数据集

 re.sub('[^A-Za-z]+',' ', line).strip().lower()
  re.sub表示将字符串中除了A-Z和a-z之外的所有字符用空格替换
  .strip()表示去掉每一行首尾的换行符、空格、缩进等。注意只有首尾!!
  .lower()表示结果转换为小写

def read_time_machine(): #@save
    """将时间机器数据集加载到⽂本⾏的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        lines = f.readlines()
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]
lines = read_time_machine()
print(f'# ⽂本总⾏数: {len(lines)}')
print(lines[0])
print(lines[10])

'''
# ⽂本总⾏数: 3221
the time machine by h g wells
twinkled and his usually pale face was flushed and animated the
'''

3.词元化

  输入的是原txt中,每一行为元素组成的list(['1','2',...])

 将每个文本序列拆分成词元列表,看下处理代码:

def tokenize(lines, token='word'): #@save
    """将⽂本⾏拆分为单词或字符词元"""
    if token == 'word':
        return [line.split() for line in lines]
    elif token == 'char':
        return [list(line) for line in lines]
    else:
        print('错误:未知词元类型:' + token)
        
        
tokens = tokenize(lines)
for i in range(11):
    print(tokens[i])

看一下最终得到的词元列表是什么:

   以word,输入的是文本所有的行列表,得到的是二维列表,每一行为元素,该元素中包含该行中的每个单词为元素。

  其中注意在char中,有一个list(line)操作:

   对一个字符串使用list('zifuchuan')的时候,会把里面每个字母拆开返回,因为字符串是可迭代对象。

4.Vocab类

先上代码,再逐个讲解:

class Vocab:
    """Vocabulary for text."""
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
        """Defined in :numref:`sec_text_preprocessing`"""
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        # Sort according to frequencies
        counter = count_corpus(tokens)
        self._token_freqs = sorted(counter.items(), key=lambda x: x[1],
                                   reverse=True)
        # The index for the unknown token is 0
        self.idx_to_token = ['<unk>'] + reserved_tokens
        self.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}
        for token, freq in self._token_freqs:
            if freq < min_freq:
                break
            if token not in self.token_to_idx:
                self.idx_to_token.append(token)
                self.token_to_idx[token] = len(self.idx_to_token) - 1

    def __len__(self):
        return len(self.idx_to_token)

    def __getitem__(self, tokens):
        if not isinstance(tokens, (list, tuple)):
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]

    def to_tokens(self, indices):
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        return [self.idx_to_token[index] for index in indices]

    @property
    def unk(self):  # Index for the unknown token
        return 0

    @property
    def token_freqs(self):  # Index for the unknown token
        return self._token_freqs


def count_corpus(tokens):  # @save
    """统计词元的频率"""
    # 这⾥的tokens是1D列表或2D列表
    if len(tokens) == 0 or isinstance(tokens[0], list):
        # 将词元列表展平成⼀个列表
        tokens = [token for line in tokens for token in line]
    return collections.Counter(tokens)

4.1count_corpus(tokens)

这里面tokens魔法函数:tokens = [token for line in tokens for token in line],等价于如下命令:

 在外面套一个list相当于先创建一个空list,然后依次将返回的最终元素append到这个空list中

  其中第一个for loop读取2Dlist中的每个元素,即为每一行;第二个for读取的是每一行中的每一个字符,此时这个token表示的是2Dlist中每个元素list里的每一个字符元素,再通过append添加到新创的list中

  对于之后的Counter用处:
  举例来说,如果 tokens = ['apple', 'banana', 'apple', 'orange'],则 collections.Counter(tokens) 的结果为 Counter({'apple': 2, 'banana': 1, 'orange': 1}),表示列表中有 2 个 'apple'、1 个 'banana' 和 1 个 'orange'。在自然语言处理中,collections.Counter() 经常被用于统计单词的出现次数。

  也就是传入所有词的列表(拉成了一维),然后返回一个dict,key为上个list的元素名,对应value为该key的出现次数。

4.2class中的各种self

4.2.1 _token_freqs是经过sorted排序后的list

注意传入sorted是要传入dict,所以源码中对counter进行了.item()处理:

在此可得: .items()是将字典返回一个包含所有(key-value)元组为元素的列表,可用于sorted

vocab.token_freqs

'''
[(' ', 29927),
 ('e', 17838),
 ('t', 13515),
 ('a', 11704),
 ('i', 10138),
 ...]
'''

4.2.2 token_to_idx是{token:idx}的字典

vocab.token_to_idx

'''
{'<unk>': 0,
 ' ': 1,
 'e': 2,
 't': 3,
 'a': 4,
 ...]
'''

对应4.2.1说的.item()处理:

items()是将字典返回一个包含所有(key-value)元组为元素的列表

4.2.3两大索引to_tokens与原getitem

to_tokens是传入idx返回token

vocab.to_tokens((0,1,2,3))

'''
['<unk>', ' ', 'e', 't']
'''

 getitem是传入token返回idx

vocab[('a','b','d')]

'''
[4, 21, 11]
'''

4.2.4 idx_to_token是所有token按出现次数多到少排列的list

vocab.idx_to_token[:10]

'''
['<unk>', ' ', 'e', 't', 'a', 'i', 'n', 'o', 's', 'h']
'''

4.2.5其它

list里面套两个元素的元组,用两个元素遍历,则会返回元组里面的两个元素!!

5.该函数最终返回的东西:

  返回的是词元索引(将原txt按顺序依次返回索引对应原文内容的idx),还有语料库,可以用to_tokens返回对应索引的token。

 

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

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

相关文章

KIOPTRIX: LEVEL 4通关详解

环境配置 vulnhub上下载的文件没有vmx 去3的文件里偷一个 记事本打开把所有Kioptrix3_vmware改成Kioptrix4_vmware 然后网卡地址随便改一下 打开后会提示找不到虚拟机,手动选一下就行了 信息收集 漏洞发现 web一上去就是一个登录框 扫路径发现database.sql 但是密码是错的…

Amazon SageMaker简直就是机器学习平台的天花板

一、前言 最近参与了亚马逊云科技【云上探索实验】活动&#xff0c;通过Amazon SageMaker基于Stable Diffusion模型&#xff0c;非常简单快速搭建的第一个AIGC&#xff0c;一开始以为非常复杂&#xff0c;不懂动手操作&#xff0c;但实际上操作非常简单&#xff0c;没有想象中…

【嵌入式Linux】Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver

GPIO子系统 0.暴露给应用层 应用 $ echo 79 > /sys/class/gpio/export //导出79号gpio 引脚&#xff0c;使得可在应用层访问 $ echo out > /sys/class/gpio/gpio79/direction //设置 为输出 $ echo 1 > /sys/class/gpio/gpio79/value //输出高电平 开灯 $ echo 0…

Spark对正常日志文件清洗并分析

目录 日志文件准备&#xff1a; 一.日志数据清洗&#xff1a; 第一步&#xff1a;数据清洗需求分析&#xff1a; 二.代码实现 2.1 代码和其详解 2.2创建jdbcUtils来连接Mysql数据库 2.3 运行后结果展示&#xff1a; 三、留存用户分析 3.1需求概览 3.2.代码实现 3…

T 级数据量迁移!知名云巨头如何从 Jira 切换至 ONES?

2021 年&#xff0c;Atlassian 旗下 Jira&Confluence 等系列产品 Server 版&#xff08;本地私有化部署版&#xff09;全面停售&#xff0c;并将在 2024 年停止维护&#xff0c;Server 版客户必须迁移至 Cloud&#xff08;云&#xff09;或 Data Center&#xff08;数据中心…

全网最详细,Jmeter性能测试-性能基础详解,控制器不同选择(四)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 逻辑控制器 提前说…

一篇文章让你搞懂TypeScript中的??和?:和?.和!.是什么意思

TypeScript中的??和?:和?.和!.是什么意思&#xff1f;知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货???:?.!.知识回调&#xff08;不懂就看这儿&#xff01;&#xff09; 知识专栏专栏链接TypeScript知识专栏https://blog.csdn.net/xsl_…

Scrapy爬虫框架(概念)

Scrapy 入门教程 | 菜鸟教程 (runoob.com) Scrapy是一个快速功能强大的网络爬虫框架 Scrapy的安装 通过 pip 安装 Scrapy 框架: pip install Scrapy 安装后小测&#xff1a; 执行 scrapy ‐h Scrapy不是一个函数功能库&#xff0c;而是一个爬虫框架。 Scrapy架构图(绿线是…

CentOS7 虚拟机 双网卡绑定

一、网卡绑定模式 模式类型特点mode0round-robin&#xff08;平衡轮询策略&#xff09;基于per packet方式&#xff0c;轮询往每条链路发送报文。提供负载均衡和容错的能力&#xff0c;当有链路出问题&#xff0c;会把流量切换到正常的链路上。交换机端需要配置聚合口。mode1a…

【论文笔记】CRN: Camera Radar Net for Accurate, Robust, Efficient 3D Perception

原文链接&#xff1a;https://arxiv.org/abs/2304.00670 1. 引言 本文提出两阶段融合方法CRN&#xff0c;能使用相机和雷达生成语义丰富且位置精确的BEV特征。具体来说&#xff0c;首先将图像透视特征转换到BEV下&#xff0c;该步骤依赖雷达&#xff0c;称为雷达辅助的视图变换…

C#基础复习

语句 目录 语句 switch&#xff1a; 跳转语句 标签语句 标签&#xff1a; 标签语句的作用域 goto语句 using 语句 资源的包装使用 using 语句示例&#xff1a; 多个资源和嵌套 语句是描述某个类型或让程序执行某个动作的源代码指令 块在语法上算作一个单条嵌入语句。任何语…

电脑无法正常关机?点了关机又会自动重启

“真木马”相信不少朋友遇到过电脑关机自动重启现象&#xff0c;一点关机&#xff0c;但随后电脑有会进入重启状态&#xff0c;就是一直不会停&#xff0c;属实是很难崩。 目录 一、问题症状 二、问题原因 三、解决方案 方法一&#xff1a; 1.关闭系统发生错误时电脑自动…

企业数字化转型全是坑?这几篇数字化转型成功案例,减少70%损失

这篇给大家整理了200企业数字化转型案例合集&#xff0c;涵盖了制造、建筑、教育、零售、互联网等10行业的大中小型企业数字化转型思路&#xff0c;希望对大家有所帮助。 案例全部整合在这篇文章中&#xff0c;点击即可查看>>数字化干货资料合集&#xff01; 01 首先&…

C++编程法则365条一天一条(359)认识各种初始化术语

文章目录Default initialization默认初始化Copy initialization拷贝初始化Aggregate initialization聚合初始化Direct initialization直接初始化list_initialization列表初始化value_initialization值初始化参考&#xff1a; https://en.cppreference.com/w/cpp/language/copy_…

项目打包发布流程

---》》》项目打包发布 1.编译并构建项目 2.部署 npm i npm run build scp2&#xff1a;需要写代码 ---》》》 后续有空更新&#xff1a;赋几个链接&#xff1a; Jenkins官网 nullhttps://www.jenkins.io/zh/一文详解Jenkins的安装与配置Jenkins是一个基于Java开发的开源…

ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing错误

一、问题 重新安装hbase后&#xff0c;在hbase shell中查看所有命名空间时&#xff0c;出现了ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing错误。 二、方法 1、root用户下&#xff0c;关闭hbase stop-hbase.sh 2、执行以下命令删除HDFS下的hb…

深度学习环境配置超详细教程【Anaconda+PyTorch(GPU版)+CUDA+cuDNN】

深度学习环境配置 入门深度学习&#xff0c;首先要做的事情就是要搭建深度学习的环境。不管你是Windows用户&#xff0c;Mac用户还是Ubuntu用户&#xff0c;只要电脑配置允许&#xff0c;都可以做深度学习&#xff0c;毕竟Windows、Mac和Ubuntu系统都可以进行深度学习环境的搭…

惊呆了,2小时我就学会了Charles抓包的详细教程

目录 一、什么是Charles 二、下载Charles 三、设置Charles代理 四、配置设备代理 五、抓包操作 六、常见问题及解决方法 抓包不到某些应用程序 Charles抓包后网站出现异常 七、总结 一、什么是Charles Charles是一个跨平台的HTTP代理服务工具&#xff0c;可以用来查看…

软件测试工作主要做什么

随着信息技术的发展和普及&#xff0c;人们对软件的使用越来越普及。但是在软件的使用过程中&#xff0c;软件的效果却不尽如人意。为了确保软件的质量&#xff0c;整个软件业界已经逐渐意识到测试的重要性&#xff0c;也有越来越多的小伙伴加入了软件测试这个行业中来。软件测…

从FPGA说起的深度学习(六)-任务并行性

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…