从0开始深度学习(29)——文本预处理

序列数据中,最常见的例子就是文本数据,例如,一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。 本节中,我们将解析文本的常见预处理步骤。

0 文本预处理步骤

  1. 将文本作为字符串加载到内存中。
  2. 将字符串拆分为词元(如单词和字符)。
  3. 建立一个词表,将拆分的词元映射到数字索引。
  4. 将文本转换为数字索引序列,方便模型操作。

0.1 下载数据集

from d2l import torch as d2l# 下载文本数据集
#@save
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt','090b5e7e70c295757f55df93cb0a180b9691891a')
file_path = d2l.download('time_machine')
print(f'下载的文件路径: {file_path}')

运行结果
文本存储在代码的上一层文件夹目录中
在这里插入图片描述在这里插入图片描述

1 读取数据

这里只做演示,所以为了方便处理,我们忽略标点符号和字母大写:

import re # 正则表达式def read_txt():with open(file_path,'r') as f:lines=f.readlines()processed_lines = []for line in lines:# 替换所有非字母字符为单个空格cleaned_line = re.sub('[^A-Za-z]+', ' ', line)# 移除每行字符串两端的空白字符stripped_line = cleaned_line.strip()# 将每行字符串转换为小写lower_line = stripped_line.lower()# 将处理后的行添加到结果列表中processed_lines.append(lower_line)return processed_lineslines = read_txt()
print(f'# 文本总行数: {len(lines)}')
print(lines[0])
print(lines[10])

运行结果
在这里插入图片描述

2 词元化

词元(token)是文本的基本单位,我们这里把文本行拆分为单词或字符词元

def tokenize(lines,token='word'):# 如果toekn要求是word,则按空格划分为单词if  token=='word':word_lines=[]for line in lines:word_lines.append(line.split())# line.split() 默认按空格分割字符串,并返回一个单词列表。return word_lines# 如果toekn要求是char,则按使用list变为字符列表elif token=='char':char_lines=[]for line in lines:char_lines.append(list(line))# list(line) 将字符串拆分为字符列表。return char_lineselse:print('unkonw:',token)tokens = tokenize(lines, token='word')
for i in range(11):print(tokens[i])

运行结果
在这里插入图片描述

3 词表

词元的类型是字符串,而模型需要的输入是数字,构建一个字典,即词表(vocabulary), 用来将字符串类型的词元映射到从 0 0 0 开始的数字索引中。

先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计, 得到的统计结果称之为语料(corpus),然后根据每个唯一词元的出现频率,为其分配一个数字索引。 很少出现的词元通常被移除,这可以降低复杂性。

另外,语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元“”。 我们可以选择增加一个列表,用于保存那些被保留的词元, 例如:填充词元(“”); 序列开始词元(“”); 序列结束词元(“”)。下面是用于构建和管理文本数据的词汇表的代码:

import collectionsdef count_corpus(tokens):  #@save"""统计词元的频率"""if len(tokens) == 0 or isinstance(tokens[0], list):# 将词元列表展平成一个列表tokens = [token for line in tokens for token in line]return collections.Counter(tokens)# 统计词元的频率class Vocab:def __init__(self,tokens=None,min_freq=0,reserved_toekns=None):if tokens is None:tokens=[]if reserved_toekns is None:reserved_tokens=[]# 按频率从高到低排序counter=count_corpus(tokens)self._token_freqs=sorted(counter.items(),key=lambda x: x[1],reverse=True)self.idx_to_token=['<unk>'] + reserved_tokensself.token_to_idx = {}for idx, token in enumerate(self.idx_to_token):# 将词元及其索引添加到字典中self.token_to_idx[token] = idxfor token, freq in self._token_freqs:if freq < min_freq:breakif token not in self.token_to_idx:self.idx_to_token.append(token)self.token_to_idx[token] = len(self.idx_to_token) - 1@propertydef unk(self):  # 未知词元的索引为0'''返回未知词元的索引 0'''return 0@propertydef token_freqs(self):'''返回按频率排序的词元列表'''return self._token_freqsdef __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]vocab = Vocab(tokens)
print(list(vocab.token_to_idx.items())[:10])
for i in [0, 10]:print('文本:', tokens[i])print('索引:', vocab[tokens[i]])

运行结果
在这里插入图片描述
在这里插入图片描述

4 整合功能

我们将所有功能打包到load_corpus_time_machine函数中, 该函数返回corpus(词元索引列表)和vocab(时光机器语料库的词表),我们在这里所做的改变是:

  1. 为了简化后面章节中的训练,我们使用字符(而不是单词)实现文本词元化;
  2. 时光机器数据集中的每个文本行不一定是一个句子或一个段落,还可能是一个单词,因此返回的corpus仅处理为单个列表,而不是使用多词元列表构成的一个列表。
def load_corpus_time_machine(max_tokens=-1):  #@save"""返回时光机器数据集的词元索引列表和词表"""lines = read_txt()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, vocabcorpus, vocab = load_corpus_time_machine()
len(corpus), len(vocab)
# 打印词汇表的一些信息
print("词汇表大小:", len(vocab))
print("词汇表前10个词元及其索引:")
for token, idx in list(vocab.token_to_idx.items())[:31]:print(f"{token}: {idx}")

运行结果
在这里插入图片描述
索引表vocab
在这里插入图片描述
原字符转化为索引后的列表corpus
在这里插入图片描述

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

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

相关文章

JDBC学习笔记--JdbcUtil工具类

目录 &#xff08;一&#xff09;为什么要使用JdbcUtil工具类 &#xff08;二&#xff09;创建一个prorperties文件 1.在文件目录或src目录下&#xff0c;选择新建FIle 2.创建properties文件 3.编写配置文件 Java基础&#xff1a;反射 4.获取资源的方式 第一种 第二种…

DNS域名解析

1、DNS简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端…

点云从入门到精通技术详解100篇-基于结构光测量的三维人脸重建及识别(下)

目录 4.4 实验结果与分析 5 基于多特征组合阈值技术的三维人脸识别 5.1 引言 5.2 基于多特征组合阈值技术的部分遮挡三维人脸识别 5.2.1 三维人脸预处理 5.2.2 三维人脸表征 5.2.3 混合平均脸生成 5.2.4 基于多特征组合式遮挡去除法 5.2.5 神经网络架构 5.2…

A025-基于SpringBoot的售楼管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用

摘要&#xff1a;本文剖析了私域流量圈层在新消费时代呈现出的独特温度与信任优势&#xff0c;阐述了从传统销售到新消费转型中用户心理的变化。同时&#xff0c;强调了内容对于私域流量的关键作用&#xff0c;并分析开源 AI 智能名片、2 1 链动模式、S2B2C 商城小程序在私域流…

LeetCode 540.有序数组中的单一元素

思路一&#xff1a;hash&#xff0c;键存入元素&#xff0c;值存入次数&#xff0c;然后遍历&#xff0c;不是最优解 思路二&#xff1a;二分查找 假设数组为 [1, 1, 2, 2, 3, 4, 4]&#xff0c;其中唯一出现一次的元素是 3。在一个有序数组中&#xff0c;如果没有唯一的元素&…

ssm082基于java斗车交易系统设计与实现+vue(论文+源码)_kaic

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

linux命令curl

curl 是一个用于从命令行传输数据的强大工具&#xff0c;支持多种协议&#xff08;如 HTTP、HTTPS、FTP 等&#xff09;。它常用于测试 API、下载文件、提交表单、模拟浏览器请求等操作。 基本语法 curl [选项] [URL]常用选项 以下是一些常用的 curl 命令选项及其功能&#…

【GoWeb示例】通过示例学习 Go 的 Web 编程

文章目录 你好世界HTTP 服务器路由&#xff08;使用 gorilla/mux&#xff09;连接到 MySQL 数据库MySQL 数据库简单操作模板静态资源和文件操作表单处理中间件&#xff08;基础&#xff09;中间件&#xff08;高级&#xff09;会话JSONWebsockets密码哈希 你好世界 Go语言创建…

基于Multisim的烟雾报警电路设计与仿真

设计任务和要求&#xff1a; &#xff08; 1 &#xff09;需要有低浓度、中浓度和高浓度 3 个浓度范围。 &#xff08; 2 &#xff09;需要用电压比较器设置不同浓度的阈值。 &#xff08; 3 &#xff09;用蜂鸣器和二极管指示灯&#xff08; 3 个浓度范围的指示灯用 3 …

旅行是过于梦幻的镜月【西域之旅】

旅行的意义就是几个定格的“瞬间” 短暂的相遇 恰如涉水而过 每条河终究是 奔向属于它的海看到一句话&#xff1a;一个人的行走范围&#xff0c;就是他的世界。 快节奏的社会里&#xff0c;旅行也许不值得被歌颂&#xff0c;但它却实实在在拓宽一个人的世界。 当我没灵感时&…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题&#xff0c;记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

架构篇(04理解架构的演进)

目录 学习前言 一、架构演进 1. 初始阶段的网站架构 2. 应用服务和数据服务分离 3. 使用缓存改善网站性能 4. 使用应用服务器集群改善网站的并发处理能力 5. 数据库读写分离 6. 使用反向代理和CDN加上网站相应 7. 使用分布式文件系统和分布式数据库系统 8. 使用NoSQL和…

zabbix前台界面配置

点击下一步 如上异常错误解决方法代码如下&#xff0c;安装缺失的软包&#xff0c;并修改php.ini对应参数的值即可 yum install php-mbstring php-bcmath php-gd php72w-xml -y yum install gd gd-devel -y 修改配置文件 sed -i /post_max_size/s/8/16/g;/max_ex…

数据库去O搞了个寂寞!甲骨文股价翻倍,市值突破5200亿美金!

随着川建国同志的当选&#xff0c;到账最近几天美股科技股都有不小的涨幅&#xff0c;涨幅最高的当tesla莫属&#xff0c;然而据传甲骨文老板也是川普的金主&#xff01; 或许正因为如此&#xff0c;甲骨文股价也创新高了&#xff0c;最近几天涨了10%&#xff0c;市值突破5200…

[强网杯 2019]随便注 1

[强网杯 2019]随便注 1 审题 观察题目&#xff0c;判断可能是SQL注入&#xff0c;或者Linux命令执行&#xff0c;结合题目就是注入了 知识点 堆叠注入&#xff0c;handler命令执行&#xff0c;更改表名,预编译 知识点解析 堆叠注入 简单来说&#xff0c;堆叠注入就是按…

三菱QD77MS定位模块紧急停止功能

“紧急停止功能” 是通过简单运动模块的外部输入连接用连接器上连接的紧急停止输入&#xff0c;对同服放大器的全部轴进行批量停止的功能。(初始值为“0:有效”。)通过“[r.82]紧急停止有效/无效设置”可以选择紧急停止输入的有效/无效。 [1]控制内容 将“[r82]紧急停止有效/无…

计算机组成原理(指令格式)

(1)指令:是用来表示控制信息的一组二进制代码 (2)指令由操作码和地址码组成&#xff0c;操作码表示操作的性质和功能&#xff0c;地址码用来存放操作数的地址。地址码不为1。 (3)程序计数器(PC):专门存放当前要执行的指令地址。 (4)累加器AC:是一种寄存器&#xff0c;用来存储…

时序预测 | 改进图卷积+informer时间序列预测,pytorch架构

时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构 目录 时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构预测效果基本介绍参考资料 预测效果 基本介绍 改进图卷积informer时间序列预测代码 CTR-GC卷积,informer&#xff0c;CTR-GC 图卷积…

docker desktop es windows解决vm.max_map_count [65530] is too low 问题

如果你使用windows上的docker desktop 搭建es相关的应用&#xff0c;大概率会遇到vm.vm.max_map_count [65530] is too low这个错误&#xff0c;本篇文章分享下怎么解决这个问题&#xff0c;主要分享长期解决的方法&#xff0c;重启机器之后也能生效的方法。 这个错误的详细信息…