-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdataPreprocess.py
More file actions
96 lines (82 loc) · 3.44 KB
/
Copy pathdataPreprocess.py
File metadata and controls
96 lines (82 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# coding=utf-8
import os
import getConfig
import jieba
from zhon.hanzi import punctuation
import re
#结巴是国内的一个分词python库,分词效果非常不错。pip3 install jieba安装
#==================================
#要提前把语料放到train_data目录下以模型名称(training_model_name)命名的子目录
#==================================
gConfig = {}
# gConfig=getConfig.get_config()
gConfig=getConfig.get_config(config_file='config.ini')
training_model_name = gConfig['training_model_name']
print('training model:' + training_model_name)
# conv_path = gConfig['resource_data']
# 新建checkpoint目录
read_data_root_dir = gConfig['train_data']
# 找到.conv所在的目录
read_data_dir = read_data_root_dir + '/' + training_model_name
def find_file_name(f_dir):
f_list = os.listdir(f_dir)
# print f_list
for i in f_list:
# os.path.splitext():分离文件名与扩展名
if os.path.splitext(i)[1] == '.conv':
return i
corpus_name = find_file_name(read_data_dir)
conv_path = read_data_root_dir + '/' + training_model_name + '/' + str(corpus_name)
print('conv_path:' + conv_path)
# 检查语料路径
if not os.path.exists(conv_path):
print('conv_path not exists!')
exit()
#下面这段我们需要完成一件事,就是将训练集的数据识别读取并存入一个List中,大概分为以下几个步骤
#a、打开文件
#b、读取文件中的内容,并对文件的数据进行初步处理
#c、找出我们想要的数据存储下来
#知识点:open函数 for循环结构、数据类型(list的操作)、continue
convs = [] # 用于存储对话的列表
with open(conv_path,encoding='utf-8') as f:
one_conv = [] # 存储一次完整对话
for line in f:
line = line.strip('\n').replace('?', '')#去除换行符,并将原文件中已经分词的标记去掉,重新用结巴分词.
line=re.sub(r"[%s]+" %punctuation, "",line)
if line == '':
continue
if line[0] == gConfig['e']:
if one_conv:
convs.append(one_conv)
one_conv = []
elif line[0] == gConfig['m']:
one_conv.append(line.split(' ')[1])#将一次完整的对话存储下来
#接下来,我们需要对训练集的对话进行分类,分为问和答,或者叫上文、下文,这个主要是作为encoder和decoder的熟练数据
#我们一般分为以下几个步骤
#1、初始化变量,ask response为List
#2、按照语句的顺序来分为问句和答句,根据行数的奇偶性来判断
#3、在存储语句的时候对语句使用结巴分词,jieba.cut
# 把对话分成问与答两个部分
seq = []
count = 0
for conv in convs:
count = count + 1
if count % 10000 == 0:
print('data preprocess处理进度:{}'.format(count))
if len(conv) == 1:
continue
if len(conv) % 2 != 0: # 因为默认是一问一答的,所以需要进行数据的粗裁剪,对话行数要是偶数的
conv = conv[:-1]
for i in range(len(conv)):
if i % 2 == 0:
conv[i]=" ".join(jieba.cut(conv[i]))#使用jieba分词器进行分词
conv[i+1]=" ".join(jieba.cut(conv[i+1]))
seq.append(conv[i]+'\t'+conv[i+1])#因为i是从0开始的,因此偶数行为发问的语句,奇数行为回答的语句
seq_data_dir = read_data_dir + '/seq.data'
seq_train = open(seq_data_dir,'w')
print('正在写入...')
for i in range(len(seq)):
seq_train.write(seq[i]+'\n')
print('data preprocess完成!')
seq_train.close()