d2l 文本预处理textDataset

news2024/11/16 5:59:21

这一节极其重要,重要到本来是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。

 

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

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

相关文章

CS5260设计电路|替代RTD2169设计方案|Typec转VGA方案应用设计

CS5260,RTD2169,AG9300都可实现Type-C TO VGA转换器设计,适用于笔记本电脑、主板、台式机、适配器和对接系统等多个细分市场和显示器应用程序&#xff0c; CS5260设计电路如下&#xff1a; 2. CS5260功能特性&#xff1a; USB-C型规格1.2 VESA显示端口tm (DP) v1.4兼容接收机…

nvm安装及使用

nvm是一个node的版本管理工具。 nvm-windows下载 1、安装 首先要卸载电脑上已经有的node版本&#xff0c;注意需要卸载干净&#xff0c;再安装nvm 一路 next 安装就可以了。 安装成功后&#xff0c;以管理员身份运行&#xff08;很重要&#xff01;&#xff01;&#xff01;&…

MIPI 打怪升级之DCS篇

目录1 Overview2 Display Architectures2.1 The Type 1 Display Architecture3 Power Level3.1 Type 1 Display Architecture Power Change Sequences3.2 Type 2 Display Architecture Power Change Sequences3.3 Type 3 Display Architecture Power Change Sequences4 Gamma C…

unity的学习,准备搞一款mmo小游戏,服务器和客户端从零学

如代码所示&#xff0c;简单了解一下。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test : MonoBehaviour { void Awake(){Debug.Log("awake hello world!");}// 当脚本可用时&#xff0c;也就是打勾的时候可以…

线程同步-信号量-互斥量-条件变量

文章目录线程同步信号量互斥量条件变量线程同步 线程同步其实实现的是线程排队。防止线程同步访问共享资源造成冲突。多个线程访问共享资源的代码有可能是同一份代码&#xff0c;也有可能是不同的代码&#xff1b;无论是否执行同一份代码&#xff0c;只要这些线程的代码访问同…

Java避免死锁的几个常见方法(有测试代码和分析过程)

目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 &#xff1a;jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源&#xff0c;尽量保证每个锁…

Geoserver启动时提示:The GEOSERVER_HOME variable is not defined

场景 GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)&#xff1a; GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)_霸道流氓气质的博客-CSDN博客 在下载解压之后点击启动bat时提示: The GEOSERVER_HOME environment variable is not defin…

row_number 和 cte 使用实例:背包问题

row_number 和 cte 使用实例&#xff1a;背包问题背包问题01背包解决同一行数据需要引用两次的问题对 for xml 的结果进行引用时的处理完全背包多重背包小结背包问题 最近老顾从新把算法捡了起来&#xff0c;碰到了各种各样以前没见过的&#xff0c;工作中没遇到的问题&#x…

leetcode:快乐数(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字…

坚鹏:《银行业数字化转型指导意见》政策解读及银行数字化转型

中国银保监会《关于银行业保险业数字化转型的指导意见》政策解读及银行数字化转型课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解中国银保监会《关于银行业保险业数字化转型的指导意见》相关政策 不清楚中国银保监会《关于银行业保险业数字化转型…

使用AI进行“文本纠错”

AI在现实中的应用有很多&#xff0c;你有没有想过&#xff0c;它还可以进行文本纠错呢&#xff1f;传统的校对既耗时又枯燥&#xff0c;通过“AI纠错”&#xff0c;不仅能更快完成&#xff0c;还能提高准确度。那么AI“文本纠错”背后的原理是什么呢&#xff1f;和我一起看看吧…

Python综合案例-小费数据集的数据分析(详细思路+源码解析)

目录 1. 请导入相应模块并获取数据。导入待处理数据tips.xls&#xff0c;并显示前5行。 2、分析数据 3.增加一列“人均消费” 4查询抽烟男性中人均消费大于5的数据 5.分析小费金额和消费总额的关系&#xff0c;小费金额与消费总额是否存在正相关关系。画图观察。 6分析男女顾…

chatGPT写文章攻略-用chatGPT写网文

chatGPT可以写中文吗 ChatGPT可以写中文。在过去的几年中&#xff0c;许多深度学习机器翻译模型已经开始探索中英文翻译、去噪声、语音识别等任务&#xff0c;并且在这些任务中ChatGPT具有最先进的表现。 目前&#xff0c;例如GPT-3和GPT-2都可以用来生成中文文本。为此&…

以太坊上海升级,DeFi 3.0的序章

引言 距离以太坊Shapella升级&#xff08;也曾被称为上海升级&#xff09;仅剩一天的时间&#xff01;自2015年以太坊上线以来&#xff0c;它已成为世界排名第二的加密虚拟资产&#xff0c;以太坊诞生于行业的意义在于它能够让开发者构建智能合约和去中心化应用&#xff08;DAp…

Jumpserver与Freeipa集成(以及其他配置)

背景&#xff1a; jumpserver的安装参照&#xff1a;jumpserver的简单安装使用&#xff0c;Freeipa的安装参照&#xff1a;Freeipa的简单搭建配置。准备将Freeipa与Jumpserver集成。其实Freeipa搭建后linux客户端如果安装了Freeipa client。也能完成用户的授权权限管理了&…

肖 sir_就业课__005项目数据

项目数据 一、项目周期 &#xff08;1&#xff09;新项目&#xff1a;从无到有&#xff0c;从项目的开始到上线的时间 时间长&#xff1a;3个月、6个月、1年、2年 &#xff08;2&#xff09;老项目&#xff1a;迭代项目 迭代周期&#xff1a;1个月、2个月、3个月迭代、 &#…

现在是香港推动Web3的“正确时机” 将采取监管与发展并重策略

香港财政司司长陈茂波在香港特区政府网站发表司长随笔《发展Web3—守正创新 稳慎前行》&#xff0c;提出为了让Web3稳慎走好创新发展的道路&#xff0c;政府将采取“适当监管”和“推动发展”两者并重的策略&#xff0c;确保虚拟资产行业可持续和负责任发展。 此前&#xff0c;…

java_集合

1.集合 集合分为单列集合&#xff08;collection&#xff09;和双列集合&#xff08;map&#xff09;. 单列就是每个位置只有一个值&#xff0c;双列则是每个位置都是一对键值对&#xff0c;类似于python的字典。 2.collection 其中&#xff0c;collection又可以分为List…

全国大学生智能汽车竞赛——安装Ubuntu操作系统(双系统)

1.1 电脑分区 1.1.1 分区原因 由于我们想要在电脑上同时安装Windows和Ubuntu系统&#xff0c;所以就要在window使用的内存中划分出来一段用来给Ubuntu系统使用&#xff0c;相当于一个应用程序一样 1.1.2 分区步骤 1.右击此电脑&#xff0c;点击管理&#xff0c;然后双击左侧…

【刷题笔记】--dp--376. 摆动序列122. 买卖股票的最佳时机 II

感觉自己dp还不是很会&#xff08;/(ㄒoㄒ)/~~ 写dp题的步骤&#xff1a;①通过定义子问题&#xff0c;确定dp[ ] or dp[ ][ ] 表示的含义 ②写出子问题的递归关系 ③确定初始条件 题目&#xff1a; 思路&#xff1a; ①确定dp的含义&#xff1a;dp[i]表示 到i位置&#x…