学习这篇博客:
https://blog.csdn.net/xiaosa_kun/article/details/84868322
分步代码
1. 读取数据
import pickle
with open('train_content_list.pickle', 'rb') as file:
train_content_list = pickle.load(file)
with open('train_label_list.pickle', 'rb') as file:
train_label_list = pickle.load(file)
with open('test_content_list.pickle', 'rb') as file:
test_content_list = pickle.load(file)
with open('test_label_list.pickle', 'rb') as file:
test_label_list = pickle.load(file)
with open() as f的用法
rb: 以二进制格式打开一个文件用于只读
with open(r'filename.txt') as f:
data_user=pd.read_csv(f) #文件的读操作
with open('data.txt', 'w') as f:
f.write('hello world') #文件的写操作
pickle.dump和pickle.load
Python中的Pickle模块实现了基本的数据序列与反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
为什么需要序列化和反序列化这一操作呢?
1.便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中的Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式。
2.便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把這个对象转换为字节序列,在能在网络上传输;接收方则需要把字节序列在恢复为对象。
——dump()方法
pickle.dump(obj, file, [,protocol])
——load()方法
pickle.load(file)
注释:反序列化对象,将文件中的数据解析为一个python对象。file中有read()接口和readline()接口
2. 制作词汇表
from collections import Counter
def getVocabularyList(content_list, vocabulary_size):
allContent_str = ''.join(content_list)
counter = Counter(allContent_str)
vocabulary_list = [k[0] for k in counter.most_common(vocabulary_size)]
return ['PAD'] + vocabulary_list
def makeVocabularyFile(content_list, vocabulary_size):
vocabulary_list = getVocabularyList(content_list, vocabulary_size)
with open('vocabulary.txt', 'w', encoding='utf8') as file:
for vocabulary in vocabulary_list:
file.write(vocabulary + '\n')
makeVocabularyFile(train_content_list, 2000)
1、from collections import Counter
collections模块自Python 2.4版本开始被引入,包含了dict、set、list、tuple以外的一些特殊的容器类型,其中,
Counter类:为hashable对象计数,是字典的子类。Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。
2、 allContent_str = ‘’.join(content_list)
join()函数
语法: ‘sep’.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
3、counter = Counter(allContent_str)
counter作用就是在一个数组内,遍历所有元素,将元素出现的次数记下来
https://blog.csdn.net/qq_24753293/article/details/78334140
4、vocabulary_list = [k[0] for k in counter.most_common(vocabulary_size)]
Counter(a).most_common(2)可以打印出数组中出现次数最多的元素。参数2表示的含义是:输出几个出现次数最多的元素。
循环结构(for-in)
说明:也是循环结构的一种,经常用于遍历字符串、列表,元组,字典等
格式:
for x in y:
循环体
执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束
3、读取词汇表
with open('vocabulary.txt', encoding='utf8') as file:
vocabulary_list = [k.strip() for k in file.readlines()]
s.strip(rm)
s为字符串,rm为要删除的字符序列,当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ')
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。如果碰到结束符 EOF 则返回空字符串。
4、`数据准备
word2id_dict = dict([(b, a) for a, b in enumerate(vocabulary_list)])
content2idList = lambda content : [word2id_dict[word] for word in content if word in word2id_dict]
train_idlist_list = [content2idList(content) for content in train_content_list]
vocab_size = 5000 if len(vocabulary_list) > 5000 else len(vocabulary_list)
vocab_size
contentLength_list = [len(k) for k in train_content_list]
seq_length = max(contentLength_list)
seq_length
for a, b in enumerate(vocabulary_list)])
dict是python中的一个可变的数据类型,用{}表示,dict的key必须是不可变的数据类型,而value的数据类型可以任意
格式:{key:value,key:value,key:value}
dict() 函数用于创建一个字典。返回一个字典。
python的for循环会定义好几个参数,for a,b in,比如这种 [(1,2),(3,4),(5,6)], 那么a,b就分别返回1,2然后3,4然后5,6
Python使用lambda来创建匿名函数。lambda参数列表可以包含多个参数,如 lambda x, y: x + y
Python len() 方法返回对象(字符、列表、元组等)长度或项目个数。
embedding_dim = 64 # 词向量维度
num_classes = 4 # 类别数
num_filters = 256 # 卷积核数目
kernel_size = 5 # 卷积核尺
hidden_dim = 128 # 全连接层神经元
dropout_keep_prob = 0.5 # dropout保留比例
learning_rate = 1e-3 # 学习率
batch_size = 32 # 每批训练大小