动手学深度学习之文本预处理_哈哈哈捧场王的博客-程序员宅基地

技术标签: python  深度学习  自然语言处理  机器学习&深度学习  

文本预处理

import collections
import re
from d2l import torch as d2l

将数据集读取到由文本行组成的列表中

d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',
                                '090b5e7e70c295757f55df93cb0a180b9691891a')  # load一本书

def read_time_machine():  
    """Load the time machine dataset into a list of text lines."""
    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(lines[0])
print(lines[10])
Downloading ../data/timemachine.txt from http://d2l-data.s3-accelerate.amazonaws.com/timemachine.txt...
the time machine by h g wells
twinkled and his usually pale face was flushed and animated the

每个文本序列被拆分成一个标记列表

# 这个函数的作用就是将一行转换为一个个token,这个token要么是一个字符串要么是一个词
def tokenize(lines, token='word'):  
    """将文本行拆分为单词或字符标记。"""
    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])
['the', 'time', 'machine', 'by', 'h', 'g', 'wells']
[]
[]
[]
[]
['i']
[]
[]
['the', 'time', 'traveller', 'for', 'so', 'it', 'will', 'be', 'convenient', 'to', 'speak', 'of', 'him']
['was', 'expounding', 'a', 'recondite', 'matter', 'to', 'us', 'his', 'grey', 'eyes', 'shone', 'and']
['twinkled', 'and', 'his', 'usually', 'pale', 'face', 'was', 'flushed', 'and', 'animated', 'the']

构建一个字典,通常也叫做词表(vocabulary),用来将字符串标记映射到从0开始的数字索引中

class Vocab:  
    """文本词表"""
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):  # 如果一个token在文本序列里面出现的次数少于min_freq词我们就将它丢掉
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        counter = count_corpus(tokens)
        self.token_freqs = sorted(counter.items(), key=lambda x: x[1],
                                  reverse=True)  # 如果我们有每个token出现的频率的话,我们就将它sort一下,从大排到小
        self.unk, uniq_tokens = 0, ['<unk>'] + reserved_tokens  # 这里有个unknow token这就是位置的token
        uniq_tokens += [
            token for token, freq in self.token_freqs
            if freq >= min_freq and token not in uniq_tokens]  # 意思就是将token次数大于等于min_freq的东西放到这里,小于的就丢掉
        self.idx_to_token, self.token_to_idx = [], dict()  # 给一个token返回一个index
        for token in uniq_tokens:
            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)  # uniq_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]  # 返回index

    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]  # 给一个下标返回一个token

def count_corpus(tokens):  # 计算每个token出现的次数
    """统计标记的频率。"""
    if len(tokens) == 0 or isinstance(tokens[0], list):
        tokens = [token for line in tokens for token in line]
    return collections.Counter(tokens)

构建词汇表

vocab = Vocab(tokens)  # 构造一个vacab
print(list(vocab.token_to_idx.items())[:10])
[('<unk>', 0), ('the', 1), ('i', 2), ('and', 3), ('of', 4), ('a', 5), ('to', 6), ('was', 7), ('in', 8), ('that', 9)]

将每一行文本转换成一个数字索引列表

for i in [0, 10]:
    print('words:', tokens[i])
    print('indices:', vocab[tokens[i]])
words: ['the', 'time', 'machine', 'by', 'h', 'g', 'wells']
indices: [1, 19, 50, 40, 2183, 2184, 400]
words: ['twinkled', 'and', 'his', 'usually', 'pale', 'face', 'was', 'flushed', 'and', 'animated', 'the']
indices: [2186, 3, 25, 1044, 362, 113, 7, 1421, 3, 1045, 1]

将所有内容打包到load_corpus_time_machine函数中

def load_corpus_time_machine(max_tokens=-1):  
    """返回时光机器数据集的标记索引列表和词汇表。"""
    lines = read_time_machine()
    tokens = tokenize(lines, 'char')
    vocab = Vocab(tokens)
    corpus = [vocab[token] for line in tokens for token in line]  # 将每一个行都丢进vacublary里面转换为数字下标
    if max_tokens > 0:
        corpus = corpus[:max_tokens]
    return corpus, vocab

corpus, vocab = load_corpus_time_machine()
len(corpus), len(vocab)
(170580, 28)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38689352/article/details/120056883

智能推荐

在swift 中使用UIAlertView崩溃的问题_jianyupang2924的博客-程序员宅基地

崩溃:        var alertView=UIAlertView(title:"title", message: "Message", delegate: self, cancelButtonTitle: "OK")        alertView.show()成功:        var alertView = UIAlertView()        aler

echart_一只特立独行的猫猫的博客-程序员宅基地

https://blog.csdn.net/xuaner8786/article/details/79241689

Android studio 系统源码调试_Jason-Jiao的博客-程序员宅基地_android studio调试源码

一、Android studio系统源码调试的时候先要对android studio目录下面的几个文件进行说明:android.iml,android.ipr,android.iws.1.android.iws 包含工作区的个人设置,比如打开过的文件,版本控制工具的配置,本地修改历史,运行和debug的配置等。2.android.ipr 一般保存了工程相关的设置,比如modules和m

大数据类工程师面试题集锦附指南:互联网公司篇!_小迪和夫人的博客-程序员宅基地

大数据工程师是近几年异常火爆的职位,市场需求旺盛,众多互联网公司都打出了高薪招聘的广告,本文整理了网络上部分技术人员分享的各大互联网公司大数据类(Hadoop、Spark等)面试题以及面试时需要注意的一些问题,希望对各位技术人员有所帮助。阿里巴巴  阿里巴巴的面试轮次基本是三次,技术方面分为简单的项目经验了解和个人技术水平考察。部分网友将面试官分成了两类:一类是技术型,不断加深问题难度以测...

android常用开源库volly下载_jsphnld的博客-程序员宅基地

 文章首发:安卓技术原创apkdoc1. 什么是Volley在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley发布了。Volley是Android平台上的网络通信库,能使网络通信更快,更简单...

简单的基于dubbo的调用_坤少_jkson的博客-程序员宅基地

1首先下载zookeeper-3.4.6,修改zoo.cfg下的配置信息,然后启动zookeeper2编写服务端package com.mor.server.dubbo.service;//方法接口public interface DemoServer { String sayHello(String str);}/** * */package com.mor.ser

随便推点

呼叫(主叫)信令流程_BradyF的博客-程序员宅基地

RRC连接建立过程:17:06:50.358 UL CCCH RRC Connection Request ↑17:06:51.515 DL CCCH RRC Connection Setup ↓17:06:52.000 UL DCCH RRC Connection Setup Complete ↑ UE通过RRC连接向RNC发送初始化直传消息,请求连接管理和移动性管理

springmvc使用hibernate-validator校验框架实现后端校验_全能爱跳大的博客-程序员宅基地_springmvc使用hibernate validator的items

一、springmvc校验springmvc使用JSR-303校验规范,JSR-303是javaEE6的规范。springmvc具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),hibernate-validator基于javabean的属性校验。二丶实现步骤① 添加jar包支持 本例使用hibernate-validator 4.3.0.Final版

pycharm设置鼠标悬停快速提示函数参数和使用的方法_智商25的憨憨的博客-程序员宅基地

1.2.即可,示例:另:若想跳转到另一个文件中详细显示函数参数:按住ctrl键再点击方法名即可。

idea获取svn_Idea上svn的使用_weixin_39929377的博客-程序员宅基地

1、svn安装TortoiseSVN的下载地址 : https://tortoisesvn.net/downloads.html在安装svn客户端的时候一定要勾选,否则在idea上集成svn的时候会找不到 svn.exe 而报错。如果安装时忘记勾选了的话,安装包重新运行,选择modify,然后勾选command line client tools项就行了。image.png2、svn配置,先安...

GBase 8a运维案例:一次操作系统用户安全加固导致的扩容失败_生命之源;的博客-程序员宅基地

GBase 8a集群上线项目扩容操作,最终用户出于安全考虑,都会做安全加固,结果就是一些命令表面看着很正常,可是一旦远程运行,或者多几次用户su切换,就会出问题。现象GBase 8a V86集群扩容操作后,报错,新节点服务无法正确启动。排查查案gcinstall.log日志get cluster task id fail,该错误,一般是因为集群LOCK状态,gcluster无法从gcware层拿到任务编号。查看 集群状态集群为LOCK状态,因为5个gcware里有i3个是CLOSE状态,正

【UE4从零开始 036】大气表达式_后山之人的博客-程序员宅基地

AtmosphericFogColor(大气雾颜色)AtmosphericFogColor(大气雾颜色) 材质表达式用来在全局空间中的任意位置,查询大气雾的当前颜色。如果没有输入全局空间位置,则使用相关像素的全局位置。当需要让材质逐渐融入远方的雾颜色时,这个非常有用。在以下示例中,使用 AtmosphericFogColor(大气雾颜色)节点来设置“底色”(Base Color),并且 Wor...

推荐文章

热门文章

相关标签