keras针对几种常见的输入深度学习模型和输入数据形态,提供了几个易于使用的工具来处理数据,
其中包括针对序列模型的数据预处理,文字输入的数据处理,图片输入的数据处理。
所有的函数都存在在keras.preprocessing这个库里面,分别包含text,sequence,image三个字库。
文字预处理:一般需要把原始文字拆解成单字,单词,或者词组,然后将这些拆解后的要素进行索引,标记化拱机器学习算法使用。
这种预处理叫做标注(Tokenize)。
一般的步骤包括几下的步骤:
1:文字拆分
2:建立索引
3:序列补齐(Padding)
4:转换为矩阵
所有跟文字相关的预处理函数都在keras.preprocessing.text子库里。
需要注意的是,这是为英文设计的,如果想要处理中文,建议使用结巴分词提供的切分函数cut进行文字切分。
第一步:文字拆分
需要用的函数:text_to_word_sequence(将一段文字根据定义的分隔符切分成字符串或单词)
返回一个单词列表,但是会先处理一下比如将过滤表中的字符过滤掉,或者将所有字符转换为小写字母。
lower:是否转换为小写
filters:预定义切分字符
text_to_word_sequence(txt,lower=False,filters=",:")
结巴单词是专门针对中文的切分工具,是居于python 的中文分词组件,可以通过pip install jiaba 安装。
根据介绍,采用了如下的算法进行中文切词:
1:基于前缀单词实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DGA)
2:采用动态规划查找最大概率路径,找出基于词频的最大切分组合
3:对于未登陆词,采用了基于汉字能力的HMM模型,使用Viterbi算法
对于中文分词,结巴分词提供了jieba.cut 和jieba.cut_for_search函数,其中cut是最常用的,返回一个可迭代的生成器对象,可以用for循环来获取分割后的单词。他们各自对应一个返回列表的函数,分别是lcut和lcut_for_search,其用法相同,只是返回数据类型不同。
他们接受三个参数:分别是要切割的unicode字符串,分词是否采用细颗粒度模式和是否使用hmm模型。
建立索引:
完成分词后,得到的单词不能直接用于建模,还需要将他们转换成数学序号,才能进行后续处理。
方法很简单,对于切分的单词,排序后编号就好。
直接上代码:
out1.sort(reverse=True)
dict(list(zip(out1,np.arange(len(out1)))))
首先是对原有的字符串进行反向排序,第二句又是那个动作,首先用zip命令,将每个单词与序号进行配对,然后通过list命令,将配对的数据改为列表,最后应用字典命令将其改为字典。
建立索引也可以使用onehot编码法。
onehot函数有两个参数:一个是待索引的字符串列表,一个是最大索引值n。这个函数是将输入的字符串列表按照规则将其分配给0,。。。,,n-1共n个索引值其中之一。
xin=[0,1,2,3,4,5,6]
tout=taxt_to_word_seqience(str(xin))
xout=one_hot(str(xin),7)
序列补齐:
最终索引之后的文字信息会被按照索引编号放入多位矩阵中用来建模。这个多维矩阵的行宽对应与所有拆分后的单字或者单词。,但是在将索引放入矩阵之前,需要先进行序列补全的工作。这是因为将一段话拆分成单一的词之后,失去其重要的上下文的联系关系,因此将上下文的一组词放进一起能保持原来的上下文关系,提高建模质量。
序列补齐分为两种情况:
第一种:是自然的文本序列,这个时候的每句话的长短不一,需要进行补全为同一长度。
第二种:是将一个由K个具备一定顺序的单词串拆分成小块的连续子串,每个子串只有M(m 使用标注类批量处理文本文件。 图片数据的输入: keras为图片数据的输入提供了一个很好的接口,即keras.preprocessing.image.ImageDataGenerator类。 这个类生成了一个数据生成器(Generator)对象,议案循环批量产生对应于图像信息的多维矩阵。