中文文字预处理流程

  • 文本处理

    • 读取+去除特殊符号
    • 按照字段长度排序
  • 辅助数据结构生成

    • 生成 {字符:出现次数} 字典
    • 生成按出现次数排序好的字符list
    • 生成 {字符:序号} 字典
    • 生成序号list

文本预处理生成字典是需要去重的,一般的思路是使用set数据结构来达成,不过这里使用的是collection.Counter,可以去重还能计数

这里的文本以全唐诗为例,一般一行为1首,目的是去掉作者,生成为“[诗主体]”的格式作为RNN输入,为了保证等长,引入字符“_”在后续处理中为长度不够的诗句补齐长度

之后生成对应的向量格式,首先做好{字符:序号} 字典并根据它生成“[序号诗]”作为向量化输入的准备

import numpy as np
import tensorflow as tf
from collections import Counter poetry_file = 'poetry.txt' poetrys = []
with open(poetry_file, 'r', encoding='utf-8') as f:
for line in f:
try:
title, content = line.strip().split(':')
content = content.replace(' ','') # 去空格,实际上没用到
if '_' in content or '(' in content or '(' in content or '《' in content or '[' in content:
continue
if len(content) < 5 or len(content) > 79:
continue
content = '[' + content + ']'
poetrys.append(content)
except Exception as e:
pass # 依照每个元素的长度排序
poetrys = sorted(poetrys, key=lambda poetry: len(poetry))
print('唐诗数量:', len(poetrys)) # 统计字出现次数
all_words = []
for poetry in poetrys:
all_words += [word for word in poetry]
counter = Counter(all_words)
print(counter.items())
# item会把字典中的每一项变成一个2元素元组,字典变成大list
count_pairs = sorted(counter.items(), key=lambda x:-x[1])
# 利用zip提取,因为是原生数据结构,在切片上远不如numpy的结构灵活
words, _ = zip(*count_pairs)
print(words) words = words[:len(words)] + (' ',) # 后面要用' '来补齐诗句长度
print(words)
# 转换为字典
word_num_map = dict(zip(words, range(len(words))))
# 把诗词转换为向量
to_num = lambda word: word_num_map.get(word, len(words))
poetry_vector = [list(map(to_num, poetry)) for poetry in poetrys]

生成RNN的batch数据,并生成标签,在这里使用了上面提到的'_'对诗句进行补齐(原因是RNN输入长度是固定的),

batch_size = 1
n_chunk = len(poetry_vector) // batch_size
x_batches = []
y_batches = []
for i in range(n_chunk):
start_index = i*batch_size
end_index = start_index + batch_size
batches = poetry_vector[start_index:end_index]
length = max(map(len, batches)) # 记录下最长的诗句的长度
xdata = np.full((batch_size, length), word_num_map[' '], np.int32)
for row in range(batch_size):
xdata[row,:len(batches[row])] = batches[row]
ydata = np.copy(xdata)
ydata[:,:-1] = xdata[:,1:]
"""
xdata ydata
[6,2,4,6,9] [2,4,6,9,9]
[1,4,2,8,5] [4,2,8,5,5]
"""
x_batches.append(xdata) # (n_chunk, batch, length)
y_batches.append(ydata)

由于本篇仅仅介绍预处理,所以下面列出向量化函数,这步处理之后的batch就可以作为RNN网络的输入了,

input_data = tf.placeholder(tf.int32, [batch_size, None])
output_targets = tf.placeholder(tf.int32, [batch_size, None]) embedding = tf.get_variable("embedding",[len(words),128])
inputs = tf.nn.embedding_lookup(embedding,input_data) sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(inputs,feed_dict={input_data: x_batches[0]}).shape)

解释一下 tf.nn.embedding_lookup,在之前cs231n的作业中做过类似的实现,就是把[batch [data]]映射为[batch [data [vactor]]],所以它需要提前生成一个映射用矩阵{总的字符数*RNN输入尺寸}。

『TensotFlow』RNN中文文本_下

『TensotFlow』RNN中文文本_上的更多相关文章

  1. 『TensotFlow』RNN中文文本_下_暨研究生开学感想

    承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...

  2. 『TensotFlow』RNN/LSTM古诗生成

    往期RNN相关工程实践文章 『TensotFlow』基础RNN网络分类问题 『TensotFlow』RNN中文文本_上 『TensotFlow』基础RNN网络回归问题 『TensotFlow』RNN中 ...

  3. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  4. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  5. 『TensorFlow』第七弹_保存&载入会话_霸王回马

    首更: 由于TensorFlow的奇怪形式,所以载入保存的是sess,把会话中当前激活的变量保存下来,所以必须保证(其他网络也要求这个)保存网络和载入网络的结构一致,且变量名称必须一致,这是caffe ...

  6. 『cs231n』RNN之理解LSTM网络

    概述 LSTM是RNN的增强版,1.RNN能完成的工作LSTM也都能胜任且有更好的效果:2.LSTM解决了RNN梯度消失或爆炸的问题,进而可以具有比RNN更为长时的记忆能力.LSTM网络比较复杂,而恰 ...

  7. 『MXNet』第八弹_数据处理API_上

    一.Gluon数据加载 下面的两个dataset处理类一般会成对出现,两个都可做预处理,但是由于后面还可能用到原始图片,.ImageFolderDataset不加预处理的话可以满足,所以建议在.Dat ...

  8. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  9. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上

    总结一下相关概念: torch.Tensor - 一个近似多维数组的数据结构 autograd.Variable - 改变Tensor并且记录下来操作的历史记录.和Tensor拥有相同的API,以及b ...

随机推荐

  1. 【配置】log4j.properties 详解与配置步骤

    一.Log4j基本使用方法 Log4j由三个重要的组件构成:[日志信息的优先级],[日志信息的输出目的地],[日志信息的输出格式]. 日志信息的优先级从高到低有ERROR.WARN. INFO.DEB ...

  2. 【第十七章】 springboot + devtools(热部署)

    技术介绍 devtools:是boot的一个热部署工具,当我们修改了classpath下的文件(包括类文件.属性文件.页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现 ...

  3. 论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification

    CNN-RNN: A Unified Framework for Multi-label Image Classification Updated on 2018-08-07 22:30:41 Pap ...

  4. Bytom矿池接入协议指南

    矿机配置 https://gist.github.com/HAOYUatHZ/a47400bde4a138825faef415387b532c 固件升级 https://service.bitmain ...

  5. Javascript 高级程序设计(第3版) - 第01章

    2017-05-10 js简介 一个叫“不难登”的人发明的.js的流行是因为 ajax 的关系. js分为三个部分: 核心: ECMAScript 文档对象模型: DOM 浏览器对象模型: BOM 核 ...

  6. Mysql视图、触发器、事务、储存过程、函数

    一.视图 什么是视图 视图是有一张表或多张表的查询结果构成的一张虚拟表 为什么使用视图 当我们在使用多表查询时 我们的sql语句可能会非常的复杂,如果每次都编写一遍sql'的话无疑是一件麻烦的事情,这 ...

  7. Python 汉诺塔游戏

    #n 多少个盘子 def hanoi(n,x,y,z): : print(x,'→',z) else: hanoi(n-, x, z,y) #将前n-1个盘子从X移动到y上 print(x,'→',z ...

  8. React生命周期执行顺序详解

    文章内容转载于https://www.cnblogs.com/faith3/p/9216165.html 一.组件生命周期的执行次数是什么样子的??? 只执行一次: constructor.compo ...

  9. FreeCodeCamp---advanced Algorithm Scripting解法

    Exact Change 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) ...

  10. mongdb学习笔记

    1.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的 2.支持动态查询 3.使用高效的二进制数据存储,包括大型对象(如视频等) 4.文件存储格 ...