Keras文本处理
任务
1.只用带标签的数据和标签 不要关键字 用LSTM分一次类 tokennizer
2.Word2vec
3.用标签 + 关键字 用1、2准确度高的方法做 cnn lstm双输入,智能合约放lstm,关键字放CNN
4.把dataset没有标签的分配标签和关键字,重复上面三个
5.选出文件最大的前几个,执行4
结果: 召回率 准确率 F1 迭代次数 2或5代
Word2Vec
Tokenizer
[Keras中文文档——关于文本预处理](https://keras-cn.readthedocs.io/en/latest/preprocessing/text/#_1 ↩︎)
Tokenizer是一个用于向量化文本,或将文本转换为序列(即单个字词以及对应下标构成的列表,从1算起)的类。是用来文本预处理的第一步:分词。结合简单形象的例子会更加好理解些。
1.语法
官方语法如下:
1 | keras.preprocessing.text.Tokenizer(num_words=None, |
1.1 构造参数
- num_words: 默认是None,处理所有字词。
但是如果设置成**一个整数**,那么最后返回的是最常见的、出现**频率最高的num_words个字词**。
- filters:过滤一些特殊字符,默认上文的写法就可以了。
- lower:全部转为小写
- split:字符串,单词的分隔符,如空格
- char_level: 如果为 True, 每个字符将被视为一个标记
1.2 返回值
字符串列表
1.3 类方法
下面是相关的类方法,部分示例在下一节中均有描述应用。
方法 | 参数 | 返回值 | 备注 |
---|---|---|---|
fit_on_texts(texts) | texts:要用以训练的文本列表 | ||
texts_to_sequences(texts) | texts:待转为序列的文本列表 | 序列的列表,列表中每个序列对应于一段输入文本 | |
texts_to_sequences_generator(texts) | texts:待转为序列的文本列表 | 每次调用返回对应于一段输入文本的序列 | 本函数是texts_to_sequences 的生成器函数版 |
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:待向量化的序列列表 mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’ | 形如(len(sequences), nb_words) 的numpy array |
1.4 属性
- word_counts:字典,将单词(字符串)映射为它们在训练期间出现的次数。仅在调用fit_on_texts之后设置。
- word_docs: 字典,将单词(字符串)映射为它们在训练期间所出现的文档或文本的数量。仅在调用fit_on_texts之后设置。
- word_index: 字典,将单词(字符串)映射为它们的排名或者索引。仅在调用fit_on_texts之后设置。
- document_count: 整数。分词器被训练的文档(文本或者序列)数量。仅在调用fit_on_texts或fit_on_sequences之后设置。
2.简单示例
1 | >>>from keras.preprocessing.text import Tokenizer |
3.常用示例
还以上面的tokenizer对象为基础,经常会使用texts_to_sequences()
方法 和 序列预处理方法 keras.preprocessing.sequence.pad_sequences
一起使用。
Code.3.1 常用示例
1 | >>>tokenizer.texts_to_sequences(["下 雨 我 加班"]) |
有关pad_sequences用法见python函数——序列预处理pad_sequences()序列填充
序列预处理pad_sequences()序列填充
为了实现的简便,keras只能接受长度相同的序列输入。因此如果目前序列长度参差不齐,这时需要使用pad_sequences()。该函数是将序列转化为经过填充以后的一个长度相同的新序列。
语法
1
2
3
4
5
6 keras.preprocessing.sequence.pad_sequences(sequences,
maxlen=None,
dtype='int32',
padding='pre',
truncating='pre',
value=0.)参数
- sequences:浮点数或整数构成的两层嵌套列表
- maxlen:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0.
- dtype:返回的numpy array的数据类型
- padding:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补`
- truncating:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断
- value:浮点数,此值将在填充时代替默认的填充值0
返回值
返回的是个2维张量,长度为maxlen
实例
1
2
3
4
5
6
7 >>>list_1 = [[2,3,4]]
>>>keras.preprocessing.sequence.pad_sequences(list_1, maxlen=10)
array([[0, 0, 0, 0, 0, 0, 0, 2, 3, 4]], dtype=int32)
>>>list_2 = [[1,2,3,4,5]]
>>>keras.preprocessing.sequence.pad_sequences(list_2, maxlen=10)
array([[0, 0, 0, 0, 0, 1, 2, 3, 4, 5]], dtype=int32)
过程总结:
1. 下载数据集(或者从文件中加载),读取到一个变量/数组中
2. 使用Tokenizer,将数组fit进去,生成一个字典
3. 再使用token.texts_to_sequences,将数据放进去生成序列(数字列表)
4. 然后可以使用pad_sequences对生成的序列进行长度控制,让他们长度一致
5. 建立模型,模型中第一个是Embedding词嵌入层,将数字列表转换为向量
6. 然后中间就开始搭建神经网络,训练,评测即可。
具体:
Tokenizer函数
1 | # tokennizer |
这时候就将文本转换为数字列表了。因为神经网络里面只能输入数字。
搭建模型,训练数据
划分为训练集和测试集
1 | # 训练模型,并保存 |
搭建模型和训练的代码放一个函数里了:
搭建模型
1 |
|
训练模型
1 | metrics = Metrics() |
存储模型
1 | yaml_string = model.to_yaml() |
其中Metrics是一个回调类,用来输出f1,召回率,准确率:
1 | class Metrics(Callback): |