当前位置: 首页 > news >正文

『TensotFlow』RNN中文文本_上

中文文字预处理流程

  • 文本处理
    • 读取+去除特殊符号
    • 按照字段长度排序
  • 辅助数据结构生成
    • 生成 {字符:出现次数} 字典
    • 生成按出现次数排序好的字符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中文文本_下

相关文章:

  • 高并发网络编程之epoll详解(转载)
  • AdTime:DMC多层面助力企业咨询
  • JSP页面出现乱码
  • Linux 破坏性修复
  • String,StringBuffer ,StringBuilder的区别
  • Android CoordinatorLayout(六) 加入下拉功能
  • 谈谈《Dotnet core结合jquery的前后端加密解密密码密文传输的实现》一文中后端解密失败的原因...
  • 数组单调和
  • 人工智能革命之下你会失业还是变得富有?
  • Angular2开发踩坑系列-生产环境编译
  • HTML5新特性
  • Servlet、Filter
  • Linux学习—退出vi编辑模式
  • storm(二) 事务机制
  • 《PHP和MySQL Web 开发》 第12章 MySQL高级管理
  • 【comparator, comparable】小总结
  • 【RocksDB】TransactionDB源码分析
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • in typeof instanceof ===这些运算符有什么作用
  • php面试题 汇集2
  • React as a UI Runtime(五、列表)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • tweak 支持第三方库
  • Vue.js 移动端适配之 vw 解决方案
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 第十八天-企业应用架构模式-基本模式
  • 机器学习 vs. 深度学习
  • 数组大概知多少
  • 一个完整Java Web项目背后的密码
  • 用简单代码看卷积组块发展
  • 数据库巡检项
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #{} 和 ${}区别
  • #includecmath
  • #Linux(帮助手册)
  • #pragma once
  • $.ajax中的eval及dataType
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (笔试题)合法字符串
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (五)关系数据库标准语言SQL
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)树状数组
  • .NET 8.0 中有哪些新的变化?
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core 中间件验签
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout