train_2.py 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. # DEPRECATED(Phase1): 本文件中的 PostgreSQL 硬编码连接(host=192.168.*,
  2. # password=postgres 等)将在后续 training/ Phase 迁移到 BiddingKG.dl.infra.db。
  3. # 迁移完成前可临时使用:from BiddingKG.dl.infra.db import get_connection;
  4. # conn = get_connection("<dbname>")
  5. # 详见 ARCHITECTURE.md 第 11 章 Phase 1 与 REFACTOR_LOG.md。
  6. import sys
  7. import os
  8. sys.path.append(os.path.abspath("../.."))
  9. # sys.path.append('/data/python_znj/znj/BIDI_ML_INFO_EXTRACTION/')
  10. import pandas as pd
  11. import re
  12. import psycopg2
  13. from keras.callbacks import ModelCheckpoint
  14. from keras import layers,models,optimizers,losses
  15. from keras.layers import *
  16. from BiddingKG.dl.common.Utils import *
  17. from BiddingKG.dl.common.models import *
  18. from sklearn.metrics import classification_report
  19. from sklearn.utils import shuffle,class_weight
  20. import matplotlib.pyplot as plt
  21. import random
  22. input_shape = (2,30,60)
  23. input_shape2 = (2,40,128)
  24. # output_shape = [4]
  25. time_label_dict = {
  26. 'time': 0,
  27. 'time_release': 1, #发布时间
  28. 'time_bidopen': 2, #开标时间
  29. 'time_bidclose': 3, #截标时间
  30. 'time_bidstart': 12, #投标(开始)时间、响应文件接收(开始)时间
  31. 'time_publicityStart': 4, #公示开始时间(公示时间、公示期)
  32. 'time_publicityEnd': 5, #公示截止时间
  33. 'time_getFileStart': 6, #文件获取开始时间(文件获取时间)
  34. 'time_getFileEnd': 7, #文件获取截止时间
  35. 'time_registrationStart': 8, #报名开始时间(报名时间)
  36. 'time_registrationEnd': 9, #报名截止时间
  37. 'time_earnestMoneyStart': 10, #保证金递交开始时间(保证金递交时间)
  38. 'time_earnestMoneyEnd': 11, #保证金递交截止时间
  39. 'time_commencement': 13, #开工日期
  40. 'time_completion': 14 #竣工日期
  41. }
  42. output_shape = [len(time_label_dict)]
  43. def get_data():
  44. data_load = pd.read_csv("newdata_30_prc.csv", index_col=0)
  45. id_set = set()
  46. for id in data_load['document_id']:
  47. id_set.add(id)
  48. conn = psycopg2.connect(dbname="iepy", user="postgres", password="postgres", host="192.168.2.103")
  49. sql = "SELECT A.human_identifier,A.sentences,A.tokens,A.offsets_to_text,B.value " \
  50. "FROM corpus_iedocument A,brat_bratannotation B " \
  51. "WHERE A.human_identifier = '%s' " \
  52. "AND A.human_identifier = B.document_id "
  53. db_data = []
  54. count = 0
  55. for id in list(id_set):
  56. count+=1
  57. print(count)
  58. cur1 = conn.cursor()
  59. cur1.execute(sql % (id))
  60. db_data.extend(cur1.fetchall())
  61. cur1.close()
  62. conn.close()
  63. columns = ['document_id','sentences','tokens','offsets_to_text','value']
  64. df = pd.DataFrame(db_data, columns=columns)
  65. df = df[df['value'].str.contains('time')]
  66. df = df.reset_index(drop=True)
  67. print(len(df))
  68. time_label = df['value'].str.split(expand=True)
  69. time_label.columns = ['_', 'label_type', 'begin_index', 'end_index', 'entity_text']
  70. time_label = time_label.drop('_', axis=1)
  71. df = pd.concat([df, time_label], axis=1)
  72. print(df.info())
  73. df['tokens'] = [token[2:-2].split("', '") for token in df['tokens']]
  74. df['sentences'] = [eval(sentence) for sentence in df['sentences']]
  75. # df['sentences'] = [sentence[1:-1].split(", ") for sentence in df['sentences']]
  76. # df['sentences'] = [[int(s) for s in sentence] for sentence in df['sentences']]
  77. df['offsets_to_text'] = [eval(offset) for offset in df['offsets_to_text']]
  78. # df['offsets_to_text'] = [offset[1:-1].split(", ") for offset in df['offsets_to_text']]
  79. # df['offsets_to_text'] = [[int(o) for o in offset] for offset in df['offsets_to_text']]
  80. save(df,'db_time_data.pk')
  81. def getModel():
  82. '''
  83. @summary: 时间分类模型
  84. '''
  85. L_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  86. R_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  87. L_lstm = layers.Bidirectional(layers.LSTM(40,return_sequences=True,dropout=0.1))(L_input)
  88. # L_lstm = layers.LSTM(32,return_sequences=True,dropout=0.2)(L_input)
  89. avg_l = layers.GlobalAveragePooling1D()(L_lstm)
  90. R_lstm = layers.Bidirectional(layers.LSTM(40,return_sequences=True,dropout=0.1))(R_input)
  91. # R_lstm = layers.LSTM(32, return_sequences=True, dropout=0.2)(R_input)
  92. avg_r = layers.GlobalAveragePooling1D()(R_lstm)
  93. concat = layers.merge([avg_l, avg_r], mode='concat')
  94. # lstm = layers.LSTM(24,return_sequences=False,dropout=0.2)(concat)
  95. output = layers.Dense(output_shape[0],activation="softmax")(concat)
  96. model = models.Model(inputs=[L_input,R_input], outputs=output)
  97. learn_rate = 0.0005
  98. model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  99. loss=losses.binary_crossentropy,
  100. metrics=[precision,recall,f1_score])
  101. model.summary()
  102. return model
  103. def getModel2():
  104. '''
  105. @summary: 时间分类模型
  106. '''
  107. L_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  108. L_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(L_input)
  109. R_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  110. R_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(R_input)
  111. L_input_drop = Dropout(0.3)(L_input)
  112. R_input_drop = Dropout(0.3)(R_input)
  113. # L_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(L_input)
  114. L_lstm = OurBidirectional(GRU(64, return_sequences=True))([L_input_drop,L_mask])
  115. L_att = Attention02()(L_lstm,mask=K.squeeze(L_mask,axis=-1))
  116. # R_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(R_input)
  117. R_lstm = OurBidirectional(GRU(64, return_sequences=True))([R_input_drop,R_mask])
  118. R_att = Attention02()(R_lstm,mask=K.squeeze(R_mask,axis=-1))
  119. L_R = layers.merge([L_lstm, R_lstm],concat_axis=1, mode='concat')
  120. L_R_mask = layers.merge([L_mask, R_mask],concat_axis=1, mode='concat')
  121. L_R_att = Attention02()(L_R,mask=K.squeeze(L_R_mask,axis=-1))
  122. L_att = layers.add([L_att,L_R_att])
  123. R_att = layers.add([R_att,L_R_att])
  124. concat = layers.merge([L_att, R_att], mode='concat')
  125. concat = Dropout(0.2)(concat)
  126. output = layers.Dense(output_shape[0],activation="softmax")(concat)
  127. model = models.Model(inputs=[L_input,R_input], outputs=output)
  128. learn_rate = 0.00005
  129. model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  130. loss=losses.binary_crossentropy,
  131. metrics=[precision,recall,f1_score])
  132. model.summary()
  133. return model
  134. # def getModel2():
  135. # '''
  136. # @summary: 时间分类模型
  137. # '''
  138. # L_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  139. # L_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(L_input)
  140. # R_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  141. # R_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(R_input)
  142. #
  143. # L_input_drop = Dropout(0.3)(L_input)
  144. # R_input_drop = Dropout(0.3)(R_input)
  145. # # L_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(L_input)
  146. # L_lstm = OurBidirectional(GRU(64, return_sequences=True))([L_input_drop,L_mask])
  147. # L_att = Attention02()(L_lstm,mask=K.squeeze(L_mask,axis=-1))
  148. # # R_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(R_input)
  149. # R_lstm = OurBidirectional(GRU(64, return_sequences=True))([R_input_drop,R_mask])
  150. # R_att = Attention02()(R_lstm,mask=K.squeeze(R_mask,axis=-1))
  151. # concat = layers.merge([L_att, R_att], mode='concat')
  152. #
  153. # concat = Dropout(0.2)(concat)
  154. # output = layers.Dense(output_shape[0],activation="softmax")(concat)
  155. #
  156. # model = models.Model(inputs=[L_input,R_input], outputs=output)
  157. #
  158. # learn_rate = 0.00005
  159. # model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  160. # loss=losses.binary_crossentropy,
  161. # metrics=[precision,recall,f1_score])
  162. # model.summary()
  163. # return model
  164. def getModel3():
  165. '''
  166. @summary: 时间分类模型
  167. '''
  168. L_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  169. L_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(L_input)
  170. R_input = layers.Input(shape=input_shape2[1:], dtype='float32')
  171. R_mask = Lambda(lambda x: K.cast(K.not_equal(K.sum(x,axis=-1,keepdims=True), 0), 'float32'))(R_input)
  172. L_input_drop = Dropout(0.3)(L_input)
  173. R_input_drop = Dropout(0.3)(R_input)
  174. # L_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(L_input)
  175. L_lstm = OurBidirectional(GRU(64, return_sequences=True))([L_input_drop,L_mask])
  176. # L_att = Attention02()(L_lstm,mask=K.squeeze(L_mask,axis=-1))
  177. # R_lstm = layers.Bidirectional(layers.GRU(40,return_sequences=True,dropout=0.1))(R_input)
  178. R_lstm = OurBidirectional(GRU(64, return_sequences=True))([R_input_drop,R_mask])
  179. concat = layers.merge([L_lstm,R_lstm], mode='concat',concat_axis=1)
  180. concat_mask = layers.merge([L_mask,R_mask], mode='concat',concat_axis=1)
  181. att = Attention02()(concat,mask=K.squeeze(concat_mask,axis=-1))
  182. # R_att = Attention02()(R_lstm,mask=K.squeeze(R_mask,axis=-1))
  183. # concat = layers.merge([L_att, R_att], mode='concat')
  184. att = Dropout(0.2)(att)
  185. output = layers.Dense(output_shape[0],activation="softmax")(att)
  186. model = models.Model(inputs=[L_input,R_input], outputs=output)
  187. learn_rate = 0.0001
  188. model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  189. loss=losses.binary_crossentropy,
  190. metrics=[precision,recall,f1_score])
  191. model.summary()
  192. return model
  193. class Attention(Layer):
  194. """多头注意力机制
  195. """
  196. def __init__(self, nb_head, size_per_head, **kwargs):
  197. self.nb_head = nb_head
  198. self.size_per_head = size_per_head
  199. self.out_dim = nb_head * size_per_head
  200. super(Attention, self).__init__(**kwargs)
  201. def build(self, input_shape):
  202. super(Attention, self).build(input_shape)
  203. q_in_dim = input_shape[0][-1]
  204. k_in_dim = input_shape[1][-1]
  205. v_in_dim = input_shape[2][-1]
  206. self.q_kernel = self.add_weight(name='q_kernel',
  207. shape=(q_in_dim, self.out_dim),
  208. initializer='glorot_normal')
  209. self.k_kernel = self.add_weight(name='k_kernel',
  210. shape=(k_in_dim, self.out_dim),
  211. initializer='glorot_normal')
  212. self.v_kernel = self.add_weight(name='w_kernel',
  213. shape=(v_in_dim, self.out_dim),
  214. initializer='glorot_normal')
  215. def mask(self, x, mask, mode='mul'):
  216. if mask is None:
  217. return x
  218. else:
  219. for _ in range(K.ndim(x) - K.ndim(mask)):
  220. mask = K.expand_dims(mask, K.ndim(mask))
  221. if mode == 'mul':
  222. return x * mask
  223. else:
  224. return x - (1 - mask) * 1e10
  225. def call(self, inputs):
  226. q, k, v = inputs[:3]
  227. v_mask, q_mask = None, None
  228. if len(inputs) > 3:
  229. v_mask = inputs[3]
  230. if len(inputs) > 4:
  231. q_mask = inputs[4]
  232. # 线性变换
  233. qw = K.dot(q, self.q_kernel)
  234. kw = K.dot(k, self.k_kernel)
  235. vw = K.dot(v, self.v_kernel)
  236. # 形状变换
  237. qw = K.reshape(qw, (-1, K.shape(qw)[1], self.nb_head, self.size_per_head))
  238. kw = K.reshape(kw, (-1, K.shape(kw)[1], self.nb_head, self.size_per_head))
  239. vw = K.reshape(vw, (-1, K.shape(vw)[1], self.nb_head, self.size_per_head))
  240. # 维度置换
  241. qw = K.permute_dimensions(qw, (0, 2, 1, 3))
  242. kw = K.permute_dimensions(kw, (0, 2, 1, 3))
  243. vw = K.permute_dimensions(vw, (0, 2, 1, 3))
  244. # Attention
  245. a = K.batch_dot(qw, kw, [3, 3]) / self.size_per_head**0.5
  246. a = K.permute_dimensions(a, (0, 3, 2, 1))
  247. a = self.mask(a, v_mask, 'add')
  248. a = K.permute_dimensions(a, (0, 3, 2, 1))
  249. a = K.softmax(a)
  250. # 完成输出
  251. o = K.batch_dot(a, vw, [3, 2])
  252. o = K.permute_dimensions(o, (0, 2, 1, 3))
  253. o = K.reshape(o, (-1, K.shape(o)[1], self.out_dim))
  254. o = self.mask(o, q_mask, 'mul')
  255. return o
  256. def compute_output_shape(self, input_shape):
  257. return (input_shape[0][0], input_shape[0][1], self.out_dim)
  258. class Attention02(Layer):
  259. def __init__(self, **kwargs):
  260. self.init = initializers.get('normal')
  261. self.supports_masking = True
  262. self.attention_dim = 50
  263. super(Attention02, self).__init__(**kwargs)
  264. def build(self, input_shape):
  265. assert len(input_shape) == 3
  266. self.W = K.variable(self.init((input_shape[-1], 1)))
  267. self.b = K.variable(self.init((self.attention_dim,)))
  268. self.u = K.variable(self.init((self.attention_dim, 1)))
  269. self.trainable_weights = [self.W, self.b, self.u]
  270. super(Attention02, self).build(input_shape)
  271. def compute_mask(self, inputs, mask=None):
  272. return mask
  273. def call(self, x, mask=None):
  274. uit = K.tanh(K.bias_add(K.dot(x, self.W), self.b))
  275. ait = K.dot(uit, self.u)
  276. ait = K.squeeze(ait, -1)
  277. ait = K.exp(ait)
  278. if mask is not None:
  279. ait = ait * K.cast(mask, K.floatx())
  280. # ait = ait * mask
  281. ait /= K.cast(K.sum(ait, axis=1, keepdims=True) + K.epsilon(), K.floatx())
  282. ait = K.expand_dims(ait)
  283. weighted_input = x * ait
  284. output = K.sum(weighted_input, axis=1)
  285. return output
  286. def compute_output_shape(self, input_shape):
  287. return (input_shape[0], input_shape[-1])
  288. class OurLayer(Layer):
  289. """定义新的Layer,增加reuse方法,允许在定义Layer时调用现成的层
  290. """
  291. def reuse(self, layer, *args, **kwargs):
  292. if not layer.built:
  293. if len(args) > 0:
  294. inputs = args[0]
  295. else:
  296. inputs = kwargs['inputs']
  297. if isinstance(inputs, list):
  298. input_shape = [K.int_shape(x) for x in inputs]
  299. else:
  300. input_shape = K.int_shape(inputs)
  301. layer.build(input_shape)
  302. outputs = layer.call(*args, **kwargs)
  303. for w in layer.trainable_weights:
  304. if w not in self._trainable_weights:
  305. self._trainable_weights.append(w)
  306. for w in layer.non_trainable_weights:
  307. if w not in self._non_trainable_weights:
  308. self._non_trainable_weights.append(w)
  309. for u in layer.updates:
  310. if not hasattr(self, '_updates'):
  311. self._updates = []
  312. if u not in self._updates:
  313. self._updates.append(u)
  314. return outputs
  315. class OurBidirectional(OurLayer):
  316. """自己封装双向RNN,允许传入mask,保证对齐
  317. """
  318. def __init__(self, layer, **args):
  319. super(OurBidirectional, self).__init__(**args)
  320. self.forward_layer = layer.__class__.from_config(layer.get_config())
  321. self.backward_layer = layer.__class__.from_config(layer.get_config())
  322. self.forward_layer.name = 'forward_' + self.forward_layer.name
  323. self.backward_layer.name = 'backward_' + self.backward_layer.name
  324. def reverse_sequence(self, x, mask):
  325. """这里的mask.shape是[batch_size, seq_len, 1]
  326. """
  327. seq_len = K.round(K.sum(mask, 1)[:, 0])
  328. seq_len = K.cast(seq_len, 'int32')
  329. return tf.reverse_sequence(x, seq_len, seq_dim=1)
  330. def call(self, inputs):
  331. x, mask = inputs
  332. x_forward = self.reuse(self.forward_layer, x)
  333. x_backward = self.reverse_sequence(x, mask)
  334. x_backward = self.reuse(self.backward_layer, x_backward)
  335. x_backward = self.reverse_sequence(x_backward, mask)
  336. x = K.concatenate([x_forward, x_backward], -1)
  337. if K.ndim(x) == 3:
  338. return x * mask
  339. else:
  340. return x
  341. def compute_output_shape(self, input_shape):
  342. return input_shape[0][:-1] + (self.forward_layer.units * 2,)
  343. def training():
  344. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30_prc.csv", index_col=0)
  345. data_load = data_load.reset_index(drop=True)
  346. test_data = data_load.sample(frac=0.2, random_state=8)
  347. train_data = data_load.drop(test_data.index, axis=0)
  348. train_data =train_data.reset_index(drop=True)
  349. train_x = []
  350. train_y = []
  351. for left, right, label in zip(train_data['context_left'], train_data['context_right'], train_data['re_label']):
  352. y = np.zeros(output_shape)
  353. y[label] = 1
  354. left = str(left)
  355. right = str(right)
  356. if left=='nan': left = ''
  357. if right=='nan': right = ''
  358. left = list(left)
  359. right = list(right)
  360. context = [left, right]
  361. x = embedding_word(context, shape=input_shape)
  362. train_x.append(x)
  363. train_y.append(y)
  364. test_x = []
  365. test_y = []
  366. for left, right, label in zip(test_data['context_left'], test_data['context_right'], test_data['re_label']):
  367. y = np.zeros(output_shape)
  368. y[label] = 1
  369. left = str(left)
  370. right = str(right)
  371. if left == 'nan': left = ''
  372. if right == 'nan': right = ''
  373. left = list(left)
  374. right = list(right)
  375. context = [left, right]
  376. x = embedding_word(context, shape=input_shape)
  377. test_x.append(x)
  378. test_y.append(y)
  379. train_y, test_y = (np.array(train_y), np.array(test_y))
  380. train_x, test_x = (np.array(train_x), np.array(test_x))
  381. train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  382. model = getModel()
  383. epochs = 150
  384. batch_size = 256
  385. checkpoint = ModelCheckpoint("model_label_time_classify.model.hdf5", monitor="val_loss", verbose=1,
  386. save_best_only=True, mode='min')
  387. # cw = class_weight.compute_class_weight('auto',np.unique(np.argmax(train_y,axis=1)),np.argmax(train_y,axis=1))
  388. # cw = dict(enumerate(cw))
  389. history = model.fit(
  390. x=[train_x[0], train_x[1]],
  391. y=train_y,
  392. validation_data=([test_x[0], test_x[1]], test_y),
  393. epochs=epochs,
  394. batch_size=batch_size,
  395. shuffle=True,
  396. callbacks=[checkpoint],
  397. class_weight='auto'
  398. )
  399. # plot_loss(history=history)
  400. load_model = models.load_model("model_label_time_classify.model.hdf5",
  401. custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  402. y_pre = load_model.predict([test_x[0], test_x[1]])
  403. # y_pre = load_model.predict(test_x[0])
  404. # 各类别预测评估
  405. res1 = classification_report(np.argmax(test_y, axis=1), np.argmax(y_pre, axis=1))
  406. print(res1)
  407. y_pre2 = load_model.predict([train_x[0], train_x[1]])
  408. # y_pre2 = load_model.predict(train_x[0])
  409. res2 = classification_report(np.argmax(train_y, axis=1), np.argmax(y_pre2, axis=1))
  410. print(res2)
  411. def train2():
  412. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\tokens_data.csv", index_col=0)
  413. data_load = data_load.reset_index(drop=True)
  414. data_load['context_left'] = [left[2:-2].split("', '") for left in data_load['context_left']]
  415. data_load['context_right'] = [right[2:-2].split("', '") for right in data_load['context_right']]
  416. test_data = data_load.sample(frac=0.2, random_state=8)
  417. train_data = data_load.drop(test_data.index, axis=0)
  418. train_data =train_data.reset_index(drop=True)
  419. train_x = []
  420. train_y = []
  421. for left, right, label in zip(train_data['context_left'], train_data['context_right'], train_data['label']):
  422. y = np.zeros(output_shape)
  423. y[label] = 1
  424. context = [left, right]
  425. x = embedding(context, shape=input_shape2)
  426. train_x.append(x)
  427. train_y.append(y)
  428. test_x = []
  429. test_y = []
  430. for left, right, label in zip(test_data['context_left'], test_data['context_right'], test_data['label']):
  431. y = np.zeros(output_shape)
  432. y[label] = 1
  433. context = [left, right]
  434. x = embedding(context, shape=input_shape2)
  435. test_x.append(x)
  436. test_y.append(y)
  437. train_y, test_y = (np.array(train_y), np.array(test_y))
  438. train_x, test_x = (np.array(train_x), np.array(test_x))
  439. train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  440. model = getModel()
  441. epochs = 150
  442. batch_size = 256
  443. checkpoint = ModelCheckpoint("model_label_time_classify.model.hdf5", monitor="val_loss", verbose=1,
  444. save_best_only=True, mode='min')
  445. # cw = class_weight.compute_class_weight('auto',np.unique(np.argmax(train_y,axis=1)),np.argmax(train_y,axis=1))
  446. # cw = dict(enumerate(cw))
  447. history = model.fit(
  448. x=[train_x[0], train_x[1]],
  449. y=train_y,
  450. validation_data=([test_x[0], test_x[1]], test_y),
  451. epochs=epochs,
  452. batch_size=batch_size,
  453. shuffle=True,
  454. callbacks=[checkpoint],
  455. class_weight='auto'
  456. )
  457. # plot_loss(history=history)
  458. load_model = models.load_model("model_label_time_classify.model.hdf5",
  459. custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  460. y_pre = load_model.predict([test_x[0], test_x[1]])
  461. # y_pre = load_model.predict(test_x[0])
  462. # 各类别预测评估
  463. res1 = classification_report(np.argmax(test_y, axis=1), np.argmax(y_pre, axis=1))
  464. print(res1)
  465. y_pre2 = load_model.predict([train_x[0], train_x[1]])
  466. # y_pre2 = load_model.predict(train_x[0])
  467. res2 = classification_report(np.argmax(train_y, axis=1), np.argmax(y_pre2, axis=1))
  468. print(res2)
  469. def train3():
  470. # data_load = pd.read_excel("tokens_tolabel_data1.xlsx", index_col=0)
  471. data_load = pd.read_excel("tokens_tolabel_data1_res12.xlsx", index_col=0)
  472. # data_load = pd.concat([data_load[data_load['re_label']==0],data_load])
  473. # data_load = data_load[data_load['pre_label_prob']>0.97]
  474. # data_load = data_load[data_load['is_same']==1]
  475. data_zero = pd.read_excel("tokens_label0_data1.xlsx")
  476. # data_old = pd.read_excel("tokens_data_02.xlsx")
  477. data_old = pd.read_excel("tokens_data_02_res6.xlsx")
  478. data_zero = data_zero[(data_zero['label']!=0)|(data_zero['is_same']==2)]
  479. # data_zero = pd.concat([data_zero,data_zero])
  480. # data_zero = pd.concat([data_zero[(data_zero['label']!=0)|(data_zero['is_same']==2)],data_zero.sample(n=3000)])
  481. # data_zero = data_zero.sample(n=80000)
  482. print("输入shape:",input_shape2)
  483. data_x = []
  484. data_y = []
  485. for left, right, label,_label in zip(data_load['context_left'], data_load['context_right'], data_load['re_label'], data_load['label']):
  486. if label==_label:
  487. y = np.zeros(output_shape)
  488. y[label] = 1
  489. left = eval(left)
  490. left = left[-40:]
  491. right = eval(right)
  492. right = right[:40]
  493. context = [left, right]
  494. # x = embedding(context, shape=input_shape2)
  495. data_x.append(context)
  496. data_y.append(y)
  497. data_load2 = data_load[data_load['re_label']==0]
  498. for left, right, label,_label in zip(data_load2['context_left'], data_load2['context_right'], data_load2['re_label'], data_load2['label']):
  499. if label==_label:
  500. y = np.zeros(output_shape)
  501. y[label] = 1
  502. left = eval(left)
  503. left = left[-40:]
  504. if len(left)>30:
  505. left = left[2:]
  506. elif len(left)>15:
  507. left = left[1:]
  508. right = eval(right)
  509. right = right[:40]
  510. if len(right)>15:
  511. right = right[:-1]
  512. context = [left, right]
  513. # x = embedding(context, shape=input_shape2)
  514. data_x.append(context)
  515. data_y.append(y)
  516. for left, right, label in zip(data_zero['context_left'], data_zero['context_right'], data_zero['label']):
  517. y = np.zeros(output_shape)
  518. y[label] = 1
  519. left = eval(left)
  520. left = left[-40:]
  521. right = eval(right)
  522. right = right[:40]
  523. context = [left, right]
  524. # x = embedding(context, shape=input_shape2)
  525. data_x.append(context)
  526. data_y.append(y)
  527. for left, right, label in zip(data_zero['context_left'], data_zero['context_right'], data_zero['label']):
  528. y = np.zeros(output_shape)
  529. y[label] = 1
  530. left = eval(left)
  531. left = left[-40:]
  532. if len(left) > 30:
  533. left = left[2:]
  534. elif len(left) > 15:
  535. left = left[1:]
  536. right = eval(right)
  537. right = right[:40]
  538. if len(right) > 15:
  539. right = right[:-1]
  540. context = [left, right]
  541. # x = embedding(context, shape=input_shape2)
  542. data_x.append(context)
  543. data_y.append(y)
  544. # for left, right, label in zip(data_old['context_left'], data_old['context_right'], data_old['label']):
  545. # y = np.zeros(output_shape)
  546. # y[label] = 1
  547. # left = eval(left)
  548. # left = left[-40:]
  549. # right = eval(right)
  550. # right = right[:40]
  551. # context = [left, right]
  552. # # x = embedding(context, shape=input_shape2)
  553. # data_x.append(context)
  554. # data_y.append(y)
  555. _data = [d for d in zip(data_x,data_y)]
  556. import random
  557. random.shuffle(_data)
  558. data_x = [i[0] for i in _data]
  559. data_y = [i[1] for i in _data]
  560. test_len = int(len(data_x) * 0.13)
  561. test_x = data_x[:test_len]
  562. test_y = data_y[:test_len]
  563. print("测试数据量:", len(test_x))
  564. train_x = data_x[test_len:]
  565. train_y = data_y[test_len:]
  566. for left, right, label in zip(data_old['context_left'], data_old['context_right'], data_old['label']):
  567. y = np.zeros(output_shape)
  568. y[label] = 1
  569. left = eval(left)
  570. left = left[-40:]
  571. right = eval(right)
  572. right = right[:40]
  573. context = [left, right]
  574. # x = embedding(context, shape=input_shape2)
  575. train_x.append(context)
  576. train_y.append(y)
  577. print("训练数据量:", len(train_x))
  578. # train_y, test_y = np.array(train_y), np.array(test_y)
  579. # train_x = np.array(train_x)
  580. # test_x = np.array(test_x)
  581. # test_x = np.transpose(test_x, (1, 0, 2, 3))
  582. # train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  583. training_generator = DataGenerator(train_x, train_y)
  584. # training_generator = DataGenerator(data_x, data_y)
  585. validation_generator = DataGenerator(test_x, test_y)
  586. # model = getModel3()
  587. model = getModel2()
  588. epochs = 100
  589. # batch_size = 256
  590. checkpoint = ModelCheckpoint("model_time_classify.weights",save_weights_only=True, monitor="val_loss", verbose=1,
  591. save_best_only=True, mode='min')
  592. # checkpoint = ModelCheckpoint("model_time_classify2.weights",save_weights_only=True, monitor="loss", verbose=1,
  593. # save_best_only=True, mode='min')
  594. history = model.fit_generator(
  595. generator=training_generator,
  596. validation_data=validation_generator,
  597. use_multiprocessing=True, workers=2,
  598. epochs=epochs,
  599. shuffle=True,
  600. callbacks=[checkpoint],
  601. class_weight='auto'
  602. )
  603. # plot_loss(history=history)
  604. # load_model = models.load_model("model_label_time_classify.model.hdf5",
  605. # custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  606. # y_pre = load_model.predict([test_x[0], test_x[1]])
  607. # # y_pre = load_model.predict(test_x[0])
  608. # # 各类别预测评估
  609. # res1 = classification_report(np.argmax(test_y, axis=1), np.argmax(y_pre, axis=1))
  610. # print(res1)
  611. # y_pre2 = load_model.predict([train_x[0], train_x[1]])
  612. # # y_pre2 = load_model.predict(train_x[0])
  613. # res2 = classification_report(np.argmax(train_y, axis=1), np.argmax(y_pre2, axis=1))
  614. # print(res2)
  615. def train4():
  616. # data_load = pd.read_excel("tokens_tolabel_data1.xlsx", index_col=0)
  617. data_load = pd.read_excel("tokens_tolabel_data1_res13New.xlsx", index_col=0)
  618. # data_load = pd.concat([data_load[data_load['re_label']==0],data_load])
  619. # data_load = data_load[data_load['pre_label_prob']>0.97]
  620. # data_load = data_load[data_load['is_same']==1]
  621. data_zero = pd.read_excel("time_entity5.xlsx")
  622. data_zero = data_zero[(data_zero['viewed']==1)|(data_zero['is_same']==2)]
  623. # data_old = pd.read_excel("tokens_data_02.xlsx")
  624. data_old = pd.read_excel("tokens_data_02_res7New.xlsx")
  625. data_delay1 = pd.read_excel("delayTime_entity1.xlsx")
  626. data_delay1 = data_delay1[data_delay1['label']!=0]
  627. data_delay2 = pd.read_excel("delayTime_entity2.xlsx")
  628. # data_zero = pd.concat([data_zero,data_zero])
  629. # data_zero = pd.concat([data_zero[(data_zero['label']!=0)|(data_zero['is_same']==2)],data_zero.sample(n=3000)])
  630. # data_zero = data_zero.sample(n=80000)
  631. print("输入shape:",input_shape2)
  632. data_x = []
  633. data_y = []
  634. import random
  635. for left, right, label,_label in zip(data_load['context_left'], data_load['context_right'], data_load['re_label'], data_load['label']):
  636. # if label==_label:
  637. y = np.zeros(output_shape)
  638. y[label] = 1
  639. left = eval(left)
  640. left = left[-40:]
  641. right = eval(right)
  642. right = right[:40]
  643. context = [left, right]
  644. # x = embedding(context, shape=input_shape2)
  645. data_x.append(context)
  646. data_y.append(y)
  647. # data_load2 = data_load[data_load['re_label']==0]
  648. # for left, right, label,_label in zip(data_load2['context_left'], data_load2['context_right'], data_load2['re_label'], data_load2['label']):
  649. # if label==_label:
  650. # y = np.zeros(output_shape)
  651. # y[label] = 1
  652. # left = eval(left)
  653. # left = left[-40:]
  654. # if len(left)>30:
  655. # left = left[2:]
  656. # elif len(left)>15:
  657. # left = left[1:]
  658. # right = eval(right)
  659. # right = right[:40]
  660. # if len(right)>15:
  661. # right = right[:-1]
  662. # context = [left, right]
  663. # # x = embedding(context, shape=input_shape2)
  664. # data_x.append(context)
  665. # data_y.append(y)
  666. for left, right, label in zip(data_zero['context_left'], data_zero['context_right'], data_zero['re_label']):
  667. y = np.zeros(output_shape)
  668. y[label] = 1
  669. left = eval(left)
  670. left = left[-40:]
  671. right = eval(right)
  672. right = right[:40]
  673. context = [left, right]
  674. # x = embedding(context, shape=input_shape2)
  675. data_x.append(context)
  676. data_y.append(y)
  677. for left, right, label in zip(data_delay1['context_left'], data_delay1['context_right'], data_delay1['label']):
  678. y = np.zeros(output_shape)
  679. y[label] = 1
  680. left = eval(left)
  681. left = left[-40:]
  682. right = eval(right)
  683. right = right[:40]
  684. context = [left, right]
  685. # x = embedding(context, shape=input_shape2)
  686. data_x.append(context)
  687. data_y.append(y)
  688. for left, right, label in zip(data_delay2['context_left'], data_delay2['context_right'], data_delay2['re_label']):
  689. y = np.zeros(output_shape)
  690. y[label] = 1
  691. left = eval(left)
  692. left = left[-40:]
  693. right = eval(right)
  694. right = right[:40]
  695. context = [left, right]
  696. # x = embedding(context, shape=input_shape2)
  697. data_x.append(context)
  698. data_y.append(y)
  699. # for left, right, label in zip(data_zero['context_left'], data_zero['context_right'], data_zero['label']):
  700. # y = np.zeros(output_shape)
  701. # y[label] = 1
  702. # left = eval(left)
  703. # left = left[-40:]
  704. # if len(left) > 30:
  705. # left = left[2:]
  706. # elif len(left) > 15:
  707. # left = left[1:]
  708. # right = eval(right)
  709. # right = right[:40]
  710. # if len(right) > 15:
  711. # right = right[:-1]
  712. # context = [left, right]
  713. # # x = embedding(context, shape=input_shape2)
  714. # data_x.append(context)
  715. # data_y.append(y)
  716. # for left, right, label in zip(data_old['context_left'], data_old['context_right'], data_old['label']):
  717. # y = np.zeros(output_shape)
  718. # y[label] = 1
  719. # left = eval(left)
  720. # left = left[-40:]
  721. # right = eval(right)
  722. # right = right[:40]
  723. # context = [left, right]
  724. # # x = embedding(context, shape=input_shape2)
  725. # data_x.append(context)
  726. # data_y.append(y)
  727. for left, right, label,pre_label,is_same in zip(data_old['context_left'], data_old['context_right'], data_old['label'],
  728. data_old['pre_label'],data_old['is_same']):
  729. if label==0:
  730. if is_same==1:
  731. pass
  732. else:
  733. if pre_label>3:
  734. label = pre_label
  735. else:
  736. continue
  737. y = np.zeros(output_shape)
  738. y[label] = 1
  739. left = eval(left)
  740. left = left[-40:]
  741. right = eval(right)
  742. right = right[:40]
  743. context = [left, right]
  744. # x = embedding(context, shape=input_shape2)
  745. data_x.append(context)
  746. data_y.append(y)
  747. _data = [d for d in zip(data_x,data_y)]
  748. random.shuffle(_data)
  749. data_x = [i[0] for i in _data]
  750. data_y = [i[1] for i in _data]
  751. test_len = int(len(data_x) * 0.11)
  752. test_x = data_x[:test_len]
  753. test_y = data_y[:test_len]
  754. print("测试数据量:", len(test_x))
  755. train_x = data_x[test_len:]
  756. train_y = data_y[test_len:]
  757. # for left, right, label,pre_label,is_same in zip(data_old['context_left'], data_old['context_right'], data_old['label'],
  758. # data_old['pre_label'],data_old['is_same']):
  759. # # if label==0:
  760. # # if random.random()>0.25:
  761. # # continue
  762. # if label==0:
  763. # if is_same==1:
  764. # pass
  765. # else:
  766. # if pre_label>3:
  767. # label = pre_label
  768. # else:
  769. # continue
  770. # y = np.zeros(output_shape)
  771. # y[label] = 1
  772. # left = eval(left)
  773. # left = left[-40:]
  774. # right = eval(right)
  775. # right = right[:40]
  776. # context = [left, right]
  777. # # x = embedding(context, shape=input_shape2)
  778. # train_x.append(context)
  779. # train_y.append(y)
  780. print("训练数据量:", len(train_x))
  781. # train_y, test_y = np.array(train_y), np.array(test_y)
  782. # train_x = np.array(train_x)
  783. # test_x = np.array(test_x)
  784. # test_x = np.transpose(test_x, (1, 0, 2, 3))
  785. # train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  786. training_generator = DataGenerator(train_x, train_y,is_train=True)
  787. # training_generator = DataGenerator(data_x, data_y)
  788. validation_generator = DataGenerator(test_x, test_y,is_train=False,shuffle=False)
  789. # model = getModel3()
  790. model = getModel2()
  791. epochs = 100
  792. # batch_size = 256
  793. checkpoint = ModelCheckpoint("model_time_classify.weights",save_weights_only=True, monitor="val_loss", verbose=1,
  794. save_best_only=True, mode='min')
  795. # checkpoint = ModelCheckpoint("model_time_classify2.weights",save_weights_only=True, monitor="loss", verbose=1,
  796. # save_best_only=True, mode='min')
  797. history = model.fit_generator(
  798. generator=training_generator,
  799. validation_data=validation_generator,
  800. use_multiprocessing=True, workers=2,
  801. epochs=epochs,
  802. shuffle=True,
  803. callbacks=[checkpoint],
  804. class_weight='auto'
  805. )
  806. from keras.utils import Sequence,to_categorical
  807. class DataGenerator(Sequence):
  808. 'Generates data for Keras'
  809. def __init__(self, texts, labels, is_train=True,batch_size=256,
  810. n_classes=len(time_label_dict), shuffle=True):
  811. 'Initialization'
  812. # self.dim = dim
  813. self.batch_size = batch_size
  814. self.labels = labels
  815. self.texts = texts
  816. self.n_classes = n_classes
  817. self.shuffle = shuffle
  818. self.is_train = is_train
  819. self.on_epoch_end()
  820. def __len__(self):
  821. 'Denotes the number of batches per epoch'
  822. _len = len(self.texts) // self.batch_size
  823. if len(self.texts) % self.batch_size != 0:
  824. _len += 1
  825. return _len
  826. def __getitem__(self, index):
  827. 'Generate one batch of data'
  828. # Generate indexes of the batch
  829. indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
  830. # Find list of IDs
  831. list_texts = [self.texts[k] for k in indexes]
  832. _label = [self.labels[k] for k in indexes]
  833. # Generate data
  834. X, y = self.__data_generation(list_texts,_label)
  835. return X, y
  836. def on_epoch_end(self):
  837. 'Updates indexes after each epoch'
  838. self.indexes = np.arange(len(self.texts))
  839. if self.shuffle == True:
  840. np.random.shuffle(self.indexes)
  841. def __data_generation(self, list_texts,_label):
  842. 'Generates data containing batch_size samples'
  843. # Initialization
  844. # X = np.empty((self.batch_size, *self.dim))
  845. # y = np.empty((self.batch_size), dtype=int)
  846. # batch_len = len(list_texts)
  847. # x = np.empty((batch_len, *self.dim))
  848. x = []
  849. # y = np.empty((batch_len), dtype=int)
  850. # Generate data
  851. for i, context in enumerate(list_texts):
  852. # Store sample
  853. if self.is_train:
  854. left = context[0]
  855. if len(left) > 30:
  856. if random.random() > 0.5:
  857. left = left[2:]
  858. elif len(left) > 15:
  859. if random.random() > 0.5:
  860. left = left[1:]
  861. right = context[1]
  862. if len(right) > 30:
  863. if random.random() > 0.5:
  864. right = right[:-2]
  865. elif len(right) > 15:
  866. if random.random() > 0.5:
  867. right = right[:-1]
  868. context = [left, right]
  869. words_matrix = embedding_mywords(context, shape=input_shape2)
  870. # Store class
  871. # y[i] = _label[i]
  872. x.append(words_matrix)
  873. x = np.array(x)
  874. x = np.transpose(x, (1, 0, 2, 3))
  875. return [x[0],x[1]], np.array(_label)
  876. def predict2():
  877. model1 = models.load_model("model_label_time_classify.model.hdf5",custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  878. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\tokens_data.csv", index_col=0)
  879. data_load['context_left'] = [left[2:-2].split("', '") for left in data_load['context_left']]
  880. data_load['context_right'] = [right[2:-2].split("', '") for right in data_load['context_right']]
  881. test_x = []
  882. test_y = []
  883. for left, right, label in zip(data_load['context_left'], data_load['context_right'], data_load['label']):
  884. y = np.zeros(output_shape)
  885. y[label] = 1
  886. context = [left, right]
  887. x = embedding(context, shape=input_shape2)
  888. test_x.append(x)
  889. test_y.append(y)
  890. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  891. pre_y = model1.predict([test_x[0],test_x[1]])
  892. data_load['pre'] = [np.argmax(item) for item in pre_y]
  893. error_data = data_load[data_load['label']!=data_load['pre']]
  894. # print(error_data.info())
  895. error_data.to_csv("C:\\Users\\admin\\Desktop\\error4-30.csv")
  896. def predict3():
  897. data = pd.read_csv("new_tokens_data1.csv", chunksize=5000)
  898. model1 = models.load_model("model_label_time_classify.model.hdf5",custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  899. new_data = pd.DataFrame()
  900. idx = 0
  901. for _data in data:
  902. test_x = []
  903. test_y = []
  904. for left, right, label in zip(_data['context_left'], _data['context_right'], _data['label']):
  905. left = eval(left)
  906. left = left[-10:]
  907. right = eval(right)
  908. right = right[:10]
  909. label = int(label)
  910. y = np.zeros(output_shape)
  911. y[label] = 1
  912. context = [left, right]
  913. x = embedding(context, shape=input_shape2)
  914. test_x.append(x)
  915. test_y.append(y)
  916. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  917. pre_y = model1.predict([test_x[0], test_x[1]])
  918. _data['pre'] = [np.argmax(item) for item in pre_y]
  919. _data['is_same'] = [1 if int(_label)==_pre else 0 for _label,_pre in zip(_data['label'],_data['pre'])]
  920. # data['label'] = label
  921. new_data = pd.concat([new_data, _data])
  922. idx += 5000
  923. print(idx)
  924. # data.to_csv("new_tokens_data1.csv")
  925. new_data.to_excel("new_tokens_data1_res.xlsx")
  926. def predict4():
  927. data = pd.read_csv("tokens_data_02_res6New.csv", chunksize=3000)
  928. # data = pd.read_excel("C:\\Users\\Administrator\\Desktop\\time_entity4.xlsx")
  929. # data.to_csv("C:\\Users\\Administrator\\Desktop\\time_entity4.csv")
  930. # data = pd.read_csv("C:\\Users\\Administrator\\Desktop\\time_entity4.csv", chunksize=3000)
  931. model1 = getModel2()
  932. model1.load_weights("model_time_classify.weights")
  933. new_data = pd.DataFrame()
  934. idx = 0
  935. for _data in data:
  936. test_x = []
  937. test_y = []
  938. for left, right, label in zip(_data['context_left'], _data['context_right'], _data['re_label']):
  939. left = eval(left)
  940. left = left[-40:]
  941. right = eval(right)
  942. right = right[:40]
  943. label = int(label)
  944. y = np.zeros(output_shape)
  945. y[label] = 1
  946. context = [left, right]
  947. x = embedding_mywords(context, shape=input_shape2)
  948. test_x.append(x)
  949. test_y.append(y)
  950. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  951. pre_y = model1.predict([test_x[0], test_x[1]])
  952. _data['pre_label'] = [np.argmax(item) for item in pre_y]
  953. _data['pre_label_prob'] = [max(item) for item in pre_y]
  954. _data['is_same'] = [1 if int(_label)==_pre else 0 for _label,_pre in zip(_data['label'],_data['pre_label'])]
  955. # _data['is_same'] = [1 if int(_re)==int(_pre) and int(_re)==int(_label) else 0 for _label,_re,_pre in zip(_data['label'],_data['re_label'],_data['pre_label'])]
  956. # data['label'] = label
  957. new_data = pd.concat([new_data, _data])
  958. idx += 3000
  959. print(idx)
  960. # new_data.to_csv("tokens_data_02_res7New.csv")
  961. new_data.to_excel("tokens_data_02_res7New.xlsx")
  962. # new_data.to_excel("C:\\Users\\Administrator\\Desktop\\tokens_data_02_res7New.xlsx")
  963. def predict():
  964. model1 = models.load_model("model_label_time_classify.model.hdf5",custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  965. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30_prc.csv", index_col=0)
  966. test_x = []
  967. test_y = []
  968. for left, right, label in zip(data_load['context_left'], data_load['context_right'], data_load['re_label']):
  969. y = np.zeros(output_shape)
  970. y[label] = 1
  971. left = str(left)
  972. right = str(right)
  973. if left == 'nan': left = ''
  974. if right == 'nan': right = ''
  975. left = list(left)
  976. right = list(right)
  977. context = [left, right]
  978. x = embedding_word(context, shape=input_shape)
  979. test_x.append(x)
  980. test_y.append(y)
  981. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  982. pre_y = model1.predict([test_x[0],test_x[1]])
  983. data_load['pre'] = [np.argmax(item) for item in pre_y]
  984. error_data = data_load[data_load['re_label']!=data_load['pre']]
  985. # print(error_data.info())
  986. error_data.to_csv("C:\\Users\\admin\\Desktop\\error4-30.csv")
  987. def data_process():
  988. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30.csv", index_col=0)
  989. re_left = re.compile("。[^。]*?$")
  990. re_right = re.compile("^[^。]*?。")
  991. left_list = []
  992. right_list = []
  993. for left, right in zip(data_load['context_left'], data_load['context_right']):
  994. left = str(left)
  995. right = str(right)
  996. if right=='nan':
  997. right = ''
  998. # print(1)
  999. if re.search("。",left):
  1000. left = re_left.search(left)
  1001. left = left.group()[1:]
  1002. if re.search("。",right):
  1003. right = re_right.search(right)
  1004. right = right.group()
  1005. left_list.append(left)
  1006. right_list.append(right)
  1007. data_load['context_left'] = left_list
  1008. data_load['context_right'] = right_list
  1009. data_load.to_csv("C:\\Users\\admin\\Desktop\\newdata_30_prc.csv")
  1010. def data_process2():
  1011. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30_prc.csv", index_col=0)
  1012. left_list = []
  1013. right_list = []
  1014. for left, right in zip(data_load['context_left'], data_load['context_right']):
  1015. left = str(left)
  1016. right = str(right)
  1017. if right=='nan':
  1018. right = ''
  1019. if left=='nan':
  1020. left = ''
  1021. left = left[max(len(left)-20,0):]
  1022. right = right[:20]
  1023. left_list.append(left)
  1024. right_list.append(right)
  1025. data_load['context_left'] = left_list
  1026. data_load['context_right'] = right_list
  1027. data_load.to_csv("C:\\Users\\admin\\Desktop\\newdata_20_prc.csv")
  1028. def data_process3():
  1029. data = load('db_time_data.pk')
  1030. data = data.drop('value', axis=1)
  1031. token_begin = []
  1032. token_end = []
  1033. context_left = []
  1034. context_right = []
  1035. data2 = pd.read_csv("newdata_30_prc2.csv")
  1036. label = []
  1037. # data=data[:20]
  1038. for id,sentences,tokens,offset,begin,end,entity_text in zip(data['document_id'],data['sentences'],data['tokens'],data['offsets_to_text'],
  1039. data['begin_index'],data['end_index'],data['entity_text']):
  1040. _label = data2[(data2['document_id']==int(id)) & (data2['begin_index']==int(begin))][:1]
  1041. if not _label.empty:
  1042. _label = int(_label['re_label'])
  1043. else:
  1044. _label=0
  1045. label.append(_label)
  1046. begin = int(begin)
  1047. end = int(end)
  1048. entity_tbegin = 0
  1049. entity_tend = 0
  1050. find_begin = False
  1051. for t in range(len(offset)):
  1052. if not find_begin:
  1053. if offset[t]==begin:
  1054. entity_tbegin = t
  1055. find_begin = True
  1056. if offset[t]>begin:
  1057. entity_tbegin = t-1
  1058. find_begin = True
  1059. if offset[t] >= end:
  1060. entity_tend = t
  1061. break
  1062. token_begin.append(entity_tbegin)
  1063. token_end.append(entity_tend)
  1064. s = spanWindow(tokens=tokens,begin_index=entity_tbegin,end_index=entity_tend-1,size=40)
  1065. s1 = s[0]
  1066. _temp1 = []
  1067. for i in range(len(s1)):
  1068. if s1[i]=="。":
  1069. _temp1.append(i)
  1070. if _temp1:
  1071. s1 = s1[_temp1[-1]+1:]
  1072. s2 = s[1]
  1073. _temp2 = []
  1074. for i in range(len(s2)):
  1075. if s2[i] == "。":
  1076. _temp2.append(i)
  1077. break
  1078. if _temp2:
  1079. s2 = s2[:_temp2[0]+1]
  1080. # print(s2)
  1081. context_left.append(s1)
  1082. context_right.append(s2)
  1083. print(id)
  1084. # print(_label)
  1085. # print(entity_text)
  1086. # print(tokens[entity_tbegin:entity_tend])
  1087. data['token_begin'] = token_begin
  1088. data['token_end'] = token_end
  1089. data['context_left'] = context_left
  1090. data['context_right'] = context_right
  1091. data['label'] = label
  1092. data = data.drop(['tokens','offsets_to_text','sentences'],axis=1)
  1093. # data.to_csv("tokens_data_02.csv")
  1094. data.to_excel("tokens_data_02.xlsx")
  1095. def plot_loss(history):
  1096. plt.plot(history.history['loss'])
  1097. plt.plot(history.history['val_loss'])
  1098. plt.title('Model loss')
  1099. plt.ylabel('Loss')
  1100. plt.xlabel('Epoch')
  1101. plt.legend(['Train', 'Test'], loc='upper left')
  1102. plt.show()
  1103. def embedding_mywords(datas,shape):
  1104. '''
  1105. @summary:查找词汇对应的词向量
  1106. @param:
  1107. datas:词汇的list
  1108. shape:结果的shape
  1109. @return: array,返回对应shape的词嵌入
  1110. '''
  1111. model_w2v = getModel_w2v()
  1112. embed = np.zeros(shape)
  1113. length = shape[1]
  1114. out_index = 0
  1115. #print(datas)
  1116. for data in datas:
  1117. index = 0
  1118. for item in data:
  1119. item_not_space = re.sub("\s*","",item)
  1120. if index>=length:
  1121. break
  1122. if item_not_space in model_w2v.vocab:
  1123. embed[out_index][index] = model_w2v[item_not_space]
  1124. index += 1
  1125. else:
  1126. embed[out_index][index] = model_w2v['unk']
  1127. index += 1
  1128. out_index += 1
  1129. return embed
  1130. def save_model():
  1131. graph = tf.Graph()
  1132. with graph.as_default() as graph:
  1133. with tf.Session(graph=graph).as_default() as sess:
  1134. test_model = getModel2()
  1135. test_model.load_weights("model_time_classify.weights")
  1136. tf.saved_model.simple_save(sess,
  1137. "models/timesplit_model2/",
  1138. inputs={"input0": test_model.input[0],
  1139. "input1":test_model.input[1]
  1140. },
  1141. outputs={"outputs": test_model.output})
  1142. if __name__ == '__main__':
  1143. # get_data()
  1144. # getModel()
  1145. # getModel2()
  1146. # getModel3()
  1147. # training()
  1148. # train2()
  1149. # train3()
  1150. # train4()
  1151. # data_process()
  1152. # data_process2()
  1153. # data_process3()
  1154. # predict()
  1155. # predict2()
  1156. # predict3()
  1157. # predict4()
  1158. save_model()
  1159. pass