1.让我们开始吧!Keras文本预处理
2019-01-09 本文已影响0人
海猫HaiMao
以处理一个kaggle上的数据集为例子
import numpy as np
import pandas as pd
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
def load_and_prec():
# 利用pandas读入数据
train_df = pd.read_csv("./input/train.csv")
test_df = pd.read_csv("./input/test.csv")
print("Train shape : ", train_df.shape)
print("Test shape : ", test_df.shape)
# 填充缺失数据
train_X = train_df["question_text"].fillna("_##_").values
test_X = test_df["question_text"].fillna("_##_").values
# 利用keras的对Tokenizer句子进行分词
tokenizer = Tokenizer(num_words=max_features) #构造Tokenizer
tokenizer.fit_on_texts(list(train_X)) #传入要用以训练的文本列表
train_X = tokenizer.texts_to_sequences(train_X) #将文本列表train_X转化为序列列表
test_X = tokenizer.texts_to_sequences(test_X)
# 将train_X转化为大小为(len(train_X), maxlen)的 2D numpy array。
train_X = pad_sequences(train_X, maxlen=maxlen)
test_X = pad_sequences(test_X, maxlen=maxlen)
# 得到目标值(y轴)
train_y = train_df['target'].values
# 打乱数据
np.random.seed(2018)
trn_idx = np.random.permutation(len(train_X))
train_X = train_X[trn_idx]
train_y = train_y[trn_idx]
return train_X, test_X, train_y, tokenizer.word_index
涉及到的keras工具
1.分词器Tokenizer
Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。
from keras.preprocessing.text import Tokenizer #需要引入的包
keras.preprocessing.text.Tokenizer(num_words=None,
filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~ ',
lower=True,
split=' ',
char_level=False,
oov_token=None,
document_count=0)
构造参数
- num_words: 需要保留的最大词数,基于词频。只有最常出现的 num_words 词会被保留。
- filters: 一个字符串,其中每个元素是一个将从文本中过滤掉的字符。默认值是所有标点符号,加上制表符和换行符,减去 ' 字符。
- lower: 布尔值。是否将文本转换为小写。
- split: 字符串。按该字符串切割文本。
- char_level: 如果为 True,则每个字符都将被视为标记。
- oov_token: 如果给出,它将被添加到 word_index 中,并用于在 text_to_sequence 调用期间替换词汇表外的单词。
默认情况下,删除所有标点符号,将文本转换为空格分隔的单词序列(单词可能包含 ' 字符)。 这些序列然后被分割成标记列表。然后它们将被索引或向量化。
0 是不会被分配给任何单词的保留索引的哦。
类方法
- fit_on_texts(texts)
texts:要用以训练的文本列表 - texts_to_sequences(texts)
texts:待转为序列的文本列表
返回值:序列的列表,列表中每个序列对应于一段输入文本 - texts_to_sequences_generator(texts)
本函数是texts_to_sequences的生成器函数版
texts:待转为序列的文本列表
返回值:每次调用返回对应于一段输入文本的序列 - texts_to_matrix(texts, mode):
texts:待向量化的文本列表
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’
返回值:形如(len(texts), nb_words)的numpy array - fit_on_sequences(sequences):
sequences:要用以训练的序列列表 - sequences_to_matrix(sequences):
sequences:待向量化的序列列表
2.填充序列pad_sequences
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32',padding='pre', truncating='pre', value=0)
将长为nb_samples
的序列(标量序列)转化为形如 (nb_samples,nb_timesteps)
2D numpy array。如果提供了参数maxlen,nb_timesteps=maxlen
,否则其值为最长序列的长度。其他短于该长度的序列都会在后部填充0以达到该长度。长于nb_timesteps
的序列将会被截断,以使其匹配目标长度。padding和截断发生的位置分别取决于padding
和truncating
.
参数
- sequences:浮点数或整数构成的两层嵌套列表
- maxlen:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0.
- dtype:返回的numpy array的数据类型
- padding:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补
- truncating:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断
- value:浮点数,此值将在填充时代替默认的填充值0
返回值
返回形如(nb_samples,nb_timesteps)
的2D张量