modelFactory.py 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. '''
  2. Created on 2019年5月16日
  3. @author: User
  4. '''
  5. import os
  6. import sys
  7. sys.path.append(os.path.abspath("../.."))
  8. from keras import models
  9. from keras import layers
  10. # from keras_contrib.layers import CRF
  11. from keras.preprocessing.sequence import pad_sequences
  12. from keras import optimizers,losses,metrics
  13. from BiddingKG.dl.common.Utils import *
  14. import tensorflow as tf
  15. import json
  16. class Model_role_classify():
  17. def __init__(self,lazyLoad=getLazyLoad()):
  18. #self.model_role_file = os.path.abspath("../role/models/model_role.model.hdf5")
  19. self.model_role_file = os.path.dirname(__file__)+"/../role/log/new_biLSTM-ep012-loss0.028-val_loss0.040-f10.954.h5"
  20. self.model_role = None
  21. self.graph = tf.get_default_graph()
  22. if not lazyLoad:
  23. self.getModel()
  24. def getModel(self):
  25. if self.model_role is None:
  26. self.model_role = models.load_model(self.model_role_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  27. return self.model_role
  28. def encode(self,tokens,begin_index,end_index,**kwargs):
  29. return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=10),shape=(2,10,128))
  30. def predict(self,x):
  31. x = np.transpose(np.array(x),(1,0,2,3))
  32. with self.graph.as_default():
  33. return self.getModel().predict([x[0],x[1]])
  34. class Model_role_classify_word():
  35. def __init__(self,lazyLoad=getLazyLoad(),config=None):
  36. if USE_PAI_EAS:
  37. lazyLoad = True
  38. #self.model_role_file = os.path.abspath("../role/log/ep071-loss0.107-val_loss0.122-f10.956.h5")
  39. # self.model_role_file = os.path.dirname(__file__)+"/../role/models/ep038-loss0.140-val_loss0.149-f10.947.h5"
  40. #self.model_role_file = os.path.abspath("../role/log/textcnn_ep017-loss0.088-val_loss0.125-f10.955.h5")
  41. self.model_role = None
  42. self.sess_role = tf.Session(graph=tf.Graph(),config=config)
  43. if not lazyLoad:
  44. self.getModel()
  45. def getModel(self):
  46. if self.model_role is None:
  47. with self.sess_role.as_default() as sess:
  48. with self.sess_role.graph.as_default():
  49. meta_graph_def = tf.saved_model.loader.load(sess=self.sess_role, tags=["serve"], export_dir=os.path.dirname(__file__)+"/role_savedmodel")
  50. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  51. signature_def = meta_graph_def.signature_def
  52. input0 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  53. input1 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  54. # input2 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input2"].name)
  55. output = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  56. self.model_role = [[input0,input1],output] #,input2
  57. return self.model_role
  58. '''
  59. def load_weights(self):
  60. model = self.getModel()
  61. model.load_weights(self.model_role_file)
  62. '''
  63. def encode(self,tokens,begin_index,end_index,entity_text,**kwargs):
  64. _span = spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=20,center_include=False,word_flag=True,text=entity_text) #size=12 center_include=True
  65. # print(_span)
  66. _encode_span = encodeInput(_span, word_len=20, word_flag=True,userFool=False) # word_len=20
  67. # print(_encode_span)
  68. return _encode_span
  69. def fix_digit_eng(self, text):
  70. '''
  71. 处理数字及英文编号等
  72. :param text:
  73. :return:
  74. '''
  75. text = re.sub('第[一二三1-3]([条项章轮次场期批]|中学|医院|分公司|附属)|第三方(服务机构)?|(中标|成交|中选)(候选|结果)?(单位|人)?公[示告]', 'xxx', text) # 修复 642200681 第二轮推荐中选供应商:第一中选候选人: 预测错为第二名
  76. text = re.sub('第01(中标|成交)?候选人', '第一中标候选人', text)
  77. text = re.sub('(标[段的包项]?|品目)【?[一二三1-3]】?', '标段', text)
  78. text = re.sub('(第?[一二三1-3]|\d+)(标段?|[分子]?(标?包|标))', ' ', text) # 修复 503121188 供应商名称:2分标:广西恒广建筑工程有限公司 预测错第二候选; 701962050 供应商名称:02包 武汉欣威制冷空调工程有限公司
  79. text = re.sub('[a-zA-Z][a-zA-Z0-9=&_—-]{3,}', 'abc', text)
  80. text = re.sub('[【(\[][0-9]{2,}[\])】]|\d+([::.-]\d+)+', 'd', text)
  81. text = re.sub('[一二三四五六七八九十]{2,}|[四五六七八九十]+', 'd', text)
  82. text = re.sub('\d{2,}(\.\d+)?|\d\.\d+|[04-9]|/\d+', 'd', text) # 693713326 全自动/50/3,供应商名称:阿荣旗人民检察院,预测错第三候选
  83. text = re.sub('序[号號]:\d+', '序号:d', text)
  84. text = re.sub('第?[一二三四五六七八九十\d]+,?[次年包]|[一二三四五六七八九十\d]+、|([^\w]|^)序:?\d+', ' d', text) # ,序:1,单位名称:
  85. text = re.sub('(中标|成交|中选|入围)(工程|项目)', '工程', text) # 修复易错分为中标人
  86. text = re.sub('约定|(盖章|签名):?', ' ', text) # 修复 233233636 错分为中标人 国有产权网上竞价有关约定 辽阳市公共资源交易中心 ,标 修复 273505905 乡镇签名:盖章: 次村产权交易服务中心 预测为中标
  87. text = re.sub('中介机构', '投标机构', text) # 251058999 错分为中标人 序号:2,中介机构名称:
  88. text = re.sub('(采购|招标)人名称、地址和联系方式:|采购方,指|(采购|招标)承办单位:', '采购人:', text) # 275065998 修复 224703143 采购的中标人;采购方,指 预测为中标 750041352 招标承办单位:芜湖安得智联科技有限公司湖南分公司
  89. if re.search('(最终)?排名:', text) and re.search('(最终)?排名:第?[123一二三]', text)==None:
  90. text = re.sub('(最终)?排名:', ' ', text)
  91. text = re.sub('交易单位', '发布单位', text)
  92. text = re.sub('[,:]各种数据:', ':', text) # 20240620优化 478331984 山东省交通运输厅站源提取不到 各种数据:中标单位,各种数据:济南金曰公路工程有限公司,
  93. text = re.sub('电子签章', '', text) # 20240924 修复 529923459 电子签名:投标人名称(电子签章:西君兰信息科技有限公司,2024年9月7日 预测为中标
  94. text = re.sub('采购方式', 'xxxx', text) # 修复 499096797 招标人预测错误
  95. text = re.sub('中标人\d名称', '中标人名称', text) # 修复 499096797 中标人预测错误
  96. text = re.sub('\|候选人|比选申请人', '、候选人', text) # 修复 626660259 排名:1|候选人:库尔勒海南广电工程有限责任公司
  97. text = re.sub('(中标|成交|中选|中拍|排名:1,)(出版社|回收商|医院|(招投?标)?代理(机构|公司))', '成交供应商', text) # 修复 642076501 成交出版社:科学出版社成都有限责任公司, 657862378 确定中标医院为:驻马店市第二人民医院。
  98. text = re.sub('((品牌|签名|盖章))?:|(主)|[【(]?(联合体)?牵头(方|人|单位)[)】]?|[【(]?联合体[)】]?', ' ', text) # 修复 642283019 成交人(品牌: 预测为5 ;修复 702782357 第一中标候选人(主)广东省建设工程质量安全检测总站有限公司
  99. text = re.sub('竞价(比选)单位', '竞价单位', text) # 修复 598259105 预测为招标
  100. text = re.sub('第一备选人', '第二候选人', text) # 修复 693681470排名错误
  101. text = re.sub('第二备选人', '第三候选人', text)
  102. text = re.sub('公示日期|代理机构备选库', 'xxxx', text) # 修复 679154280 通辽市住房和城乡建设局,公示日期2025年9月11日 错分中标 674197943 珠海市金湾区红旗镇卫生院招标代理机构备选库公开遴选项目 错分代理
  103. text = re.sub('比选申请人|应答人|参与机构名称|投标公司信息|竞争性磋商公司', '投标人', text) # 修复 700724372 排名:1,比选申请人预测5; 700052214 候选人排名:1,应答人名称:海南厨玛特智能厨房设备有限公司,应答报价(元):39800;701894552 参加项目竞争性磋商公司有:预测错招标
  104. text = re.sub('(,|^)[一二三123][、.,]', ',d、', text) # 修复 688267598 二、供应商名称:预测错第二候选;2.供应商名称:复旦大学
  105. text = re.sub(r'候选人(\d+)名称', r'第\1候选人', text) # 修复 695298070 二、候选内容,候选人1名称:
  106. text = re.sub(r'(编号|名称):(\d+),', r'\1:d,', text) # 修复 692125069 包组名称:3,供应商名称:中国人民健康保险股份有限公司辽宁分公司
  107. text = re.sub('顺延至?第[二三23]名', ' ', text)
  108. text = re.sub('(中标|成交)人:[^,:]{2,12}:', '入选供应商:', text) # 修复 697781181 中标人:次氯酸钠:
  109. text = re.sub('(?<!排名|排序|名次)第[一二三1-3]单位', 'xxx', text) # 修复 689290626 推荐排名第一单位 安徽康鼎建设有限公司 错误替换,其他的要替换
  110. text = re.sub('中原|出函机构', 'xx', text) # 修复 750901787 中原林场、中原镇企业均为 中原镇人民政府 下属单位,预测错中标 出函机构: 浦发银行
  111. # print('实体前文:', text)
  112. return text.replace('(', '(').replace(')', ')').replace('單', '单').replace('稱','称').replace('標', '标').replace('採購', '采购').replace('機構', '机构').replace('應', '应')
  113. def encode_word(self, sentence_text, begin_index, end_index, size=20, **kwargs):
  114. '''
  115. 上下文数字化,使用字偏移
  116. :param sentence_text: 句子文本
  117. :param begin_index: 实体字开始位置
  118. :param end_index: 实体字结束位置
  119. :param size: 字偏移量
  120. :param kwargs:
  121. :return:
  122. '''
  123. _span = get_context(sentence_text, begin_index, end_index,size=size, center_include=False) # size=12 center_include=True
  124. # print(_span)
  125. _span = [self.fix_digit_eng(text) for text in _span]
  126. if len(_span) > 1 and _span[0].find(';') > -1: # 修复 638733137 ,排名第一;中标候选人(上海元山建设有限公司) 分句问题导致预测错误
  127. _span[0] = _span[0][_span[0].find(';'):]
  128. _encode_span = encodeInput(_span, word_len=30, word_flag=True, userFool=False) # word_len=20
  129. # print(_encode_span)
  130. return _encode_span
  131. def predict(self,x):
  132. x = np.transpose(np.array(x),(1,0,2))
  133. model_role = self.getModel()
  134. assert len(x)==len(model_role[0])
  135. feed_dict = {}
  136. for _x,_t in zip(x,model_role[0]):
  137. feed_dict[_t] = _x
  138. list_result = limitRun(self.sess_role,[model_role[1]],feed_dict)[0]
  139. return list_result
  140. #return self.sess_role.run(model_role[1],feed_dict=feed_dict)
  141. class Model_money_classify():
  142. def __init__(self,lazyLoad=getLazyLoad(),config=None):
  143. if USE_PAI_EAS:
  144. lazyLoad = True
  145. self.model_money_file = os.path.dirname(__file__)+"/../money/models/model_money_word.h5"
  146. self.model_money = None
  147. self.sess_money = tf.Session(graph=tf.Graph(),config=config)
  148. if not lazyLoad:
  149. self.getModel()
  150. def getModel(self):
  151. if self.model_money is None:
  152. with self.sess_money.as_default() as sess:
  153. with sess.graph.as_default():
  154. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/money_savedmodel")
  155. # meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/money_savedmodel_bilstmonly")
  156. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  157. signature_def = meta_graph_def.signature_def
  158. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  159. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  160. input2 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input2"].name)
  161. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  162. self.model_money = [[input0,input1,input2],output]
  163. return self.model_money
  164. '''
  165. if self.model_money is None:
  166. self.model_money = models.load_model(self.model_money_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  167. return self.model_money
  168. '''
  169. '''
  170. def load_weights(self):
  171. model = self.getModel()
  172. model.load_weights(self.model_money_file)
  173. '''
  174. def encode(self,tokens,begin_index,end_index,**kwargs):
  175. _span = spanWindow(tokens=tokens, begin_index=begin_index, end_index=end_index, size=10, center_include=True, word_flag=True)
  176. _span[0] = _span[0].replace('拦标价格人民币含税金额', '拦标价') # 20250918 修复 674891060 (二)拦标价格人民币含税金额1877.8081万元 预测错 1
  177. # print(_span)
  178. return encodeInput(_span, word_len=30, word_flag=True,userFool=False)
  179. return embedding_word(_span,shape=(3,100,60))
  180. def predict(self,x):
  181. # print("shape",np.shape(x))
  182. x = np.transpose(np.array(x),(1,0,2))
  183. model_money = self.getModel()
  184. assert len(x)==len(model_money[0])
  185. feed_dict = {}
  186. for _x,_t in zip(x,model_money[0]):
  187. feed_dict[_t] = _x
  188. list_result = limitRun(self.sess_money,[model_money[1]],feed_dict)[0]
  189. #return self.sess_money.run(model_money[1],feed_dict=feed_dict)
  190. return list_result
  191. '''
  192. with self.graph.as_default():
  193. return self.getModel().predict([x[0],x[1],x[2]])
  194. '''
  195. from itertools import groupby
  196. from BiddingKG.dl.relation_extraction.model import get_words_matrix
  197. class Model_relation_extraction():
  198. def __init__(self,lazyLoad=getLazyLoad()):
  199. if USE_PAI_EAS:
  200. lazyLoad = True
  201. self.subject_model_file = os.path.dirname(__file__)+"/../relation_extraction/models2/subject_model"
  202. self.object_model_file = os.path.dirname(__file__)+"/../relation_extraction/models2/object_model"
  203. self.model_subject = None
  204. self.model_object = None
  205. self.sess_subject = tf.Session(graph=tf.Graph())
  206. self.sess_object = tf.Session(graph=tf.Graph())
  207. if not lazyLoad:
  208. self.getModel1()
  209. self.getModel2()
  210. self.entity_type_dict = {
  211. 'org': '<company/org>',
  212. 'company': '<company/org>',
  213. 'location': '<location>',
  214. 'phone': '<phone>',
  215. 'person': '<contact_person>'
  216. }
  217. self.id2predicate = {
  218. 0: "rel_person", # 公司——联系人
  219. 1: "rel_phone", # 联系人——电话
  220. 2: "rel_address" # 公司——地址
  221. }
  222. self.words_size = 128
  223. # subject_model
  224. def getModel1(self):
  225. if self.model_subject is None:
  226. with self.sess_subject.as_default() as sess:
  227. with sess.graph.as_default():
  228. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=self.subject_model_file)
  229. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  230. signature_def = meta_graph_def.signature_def
  231. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  232. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  233. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  234. self.model_subject = [[input0,input1],output]
  235. return self.model_subject
  236. # object_model
  237. def getModel2(self):
  238. if self.model_object is None:
  239. with self.sess_object.as_default() as sess:
  240. with sess.graph.as_default():
  241. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=self.object_model_file)
  242. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  243. signature_def = meta_graph_def.signature_def
  244. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  245. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  246. input2 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input2"].name)
  247. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  248. self.model_object = [[input0,input1,input2],output]
  249. return self.model_object
  250. def encode(self,entity_list,list_sentence):
  251. list_sentence = sorted(list_sentence, key=lambda x: x.sentence_index)
  252. entity_list = sorted(entity_list, key=lambda x: (x.sentence_index, x.begin_index))
  253. pre_data = []
  254. text_data = []
  255. last_sentence_index = -1
  256. for key, group in groupby(entity_list, key=lambda x: x.sentence_index):
  257. if key - last_sentence_index > 1:
  258. for i in range(last_sentence_index + 1, key):
  259. pre_data.extend(list_sentence[i].tokens)
  260. text_data.extend([0] * len(list_sentence[i].tokens))
  261. group = list(group)
  262. for i in range(len(group)):
  263. ent = group[i]
  264. _tokens = list_sentence[key].tokens
  265. if i == len(group) - 1:
  266. if i == 0:
  267. pre_data.extend(_tokens[:ent.begin_index])
  268. text_data.extend([0] * len(_tokens[:ent.begin_index]))
  269. pre_data.append(self.entity_type_dict[ent.entity_type])
  270. text_data.append(ent)
  271. pre_data.extend(_tokens[ent.end_index + 1:])
  272. text_data.extend([0] * len(_tokens[ent.end_index + 1:]))
  273. break
  274. else:
  275. pre_data.append(self.entity_type_dict[ent.entity_type])
  276. text_data.append(ent)
  277. pre_data.extend(_tokens[ent.end_index + 1:])
  278. text_data.extend([0] * len(_tokens[ent.end_index + 1:]))
  279. break
  280. if i == 0:
  281. pre_data.extend(_tokens[:ent.begin_index])
  282. text_data.extend([0] * len(_tokens[:ent.begin_index]))
  283. pre_data.append(self.entity_type_dict[ent.entity_type])
  284. text_data.append(ent)
  285. pre_data.extend(_tokens[ent.end_index + 1:group[i + 1].begin_index])
  286. text_data.extend([0] * len(_tokens[ent.end_index + 1:group[i + 1].begin_index]))
  287. else:
  288. pre_data.append(self.entity_type_dict[ent.entity_type])
  289. text_data.append(ent)
  290. pre_data.extend(_tokens[ent.end_index + 1:group[i + 1].begin_index])
  291. text_data.extend([0] * len(_tokens[ent.end_index + 1:group[i + 1].begin_index]))
  292. last_sentence_index = key
  293. return text_data, pre_data
  294. def check_data(self, words):
  295. # 检查数据是否包含可预测的subject和object
  296. # 没有需要预测的链接属性,直接return
  297. company_relation = 0
  298. person_relation = 0
  299. if '<company/org>' in words:
  300. company_relation += 1
  301. if '<contact_person>' in words:
  302. person_relation += 1
  303. if company_relation:
  304. company_relation += 1
  305. # 暂时不考虑地址location实体
  306. # if '<location>' in words and company_relation:
  307. # company_relation += 1
  308. if '<phone>' in words and company_relation:
  309. person_relation += 1
  310. if company_relation < 2 and person_relation < 2:
  311. return False
  312. return True
  313. def predict_by_api(self,text_in,words,sentence_vetor):
  314. status_code = 0
  315. # save([words,sentence_vetor.tolist()],"C:/Users/Administrator/Desktop/test_data.pk")
  316. try:
  317. requests_result = requests.post(API_URL + "/predict_relation", json={"sentence_vetor": sentence_vetor.tolist(), "words": words},
  318. verify=True)
  319. status_code = requests_result.status_code
  320. triple_index_list = json.loads(requests_result.text)['triple_list']
  321. # print("triple_list:",json.loads(requests_result.text)['triple_list'])
  322. print("cost_time:",json.loads(requests_result.text)['cost_time'])
  323. triple_list = [(text_in[triple[0]], triple[1], text_in[triple[2]]) for triple in triple_index_list]
  324. return triple_list,status_code
  325. except Exception as e:
  326. print(e)
  327. return [],status_code
  328. def predict(self,text_in, words, rate=0.5):
  329. _t2 = np.zeros((len(words), self.words_size))
  330. for i in range(len(words)):
  331. _t2[i] = np.array(get_words_matrix(words[i]))
  332. # a = time.time()
  333. # triple_list, status_code = self.predict_by_api(text_in, words,_t2)
  334. # print('time',time.time()-a)
  335. # print("status_code",status_code)
  336. # if status_code==200:
  337. # return triple_list
  338. # else:
  339. # 使用模型预测
  340. triple_list = []
  341. # print("tokens:",words)
  342. # _t2 = [self.words2id.get(c, 1) for c in words]
  343. _t2 = np.array([_t2])
  344. _t3 = [1 for _ in words]
  345. _t3 = np.array([_t3])
  346. # _k1 = self.model_subject.predict([_t2, _t3])
  347. _k1 = limitRun(self.sess_subject,[self.model_subject[1]],feed_dict={self.model_subject[0][0]:_t2,
  348. self.model_subject[0][1]:_t3})[0]
  349. _k1 = _k1[0, :, 0]
  350. _k1 = np.where(_k1 > rate)[0]
  351. # print('k1',_k1)
  352. _subjects = []
  353. for i in _k1:
  354. _subject = text_in[i]
  355. _subjects.append((_subject, i, i))
  356. if _subjects:
  357. _t2 = np.repeat(_t2, len(_subjects), 0)
  358. _t3 = np.repeat(_t3, len(_subjects), 0)
  359. _k1, _ = np.array([_s[1:] for _s in _subjects]).T.reshape((2, -1, 1))
  360. # _o1 = self.model_object.predict([_t2, _t3, _k1])
  361. _o1 = limitRun(self.sess_object, [self.model_object[1]], feed_dict={self.model_object[0][0]: _t2,
  362. self.model_object[0][1]: _t3,
  363. self.model_object[0][2]: _k1})[0]
  364. for i, _subject in enumerate(_subjects):
  365. _oo1 = np.where(_o1[i] > 0.5)
  366. # print('_oo1', _oo1)
  367. for _ooo1, _c1 in zip(*_oo1):
  368. _object = text_in[_ooo1]
  369. _predicate = self.id2predicate[_c1]
  370. triple_list.append((_subject[0], _predicate, _object))
  371. # print([(t[0].entity_text,t[1],t[2].entity_text) for t in triple_list])
  372. return triple_list
  373. else:
  374. return []
  375. class Model_person_classify():
  376. def __init__(self,lazyLoad=getLazyLoad(),config=None):
  377. if USE_PAI_EAS:
  378. lazyLoad = True
  379. self.model_person_file = os.path.dirname(__file__)+"/../person/models/model_person.model.hdf5"
  380. self.model_person = None
  381. self.sess_person = tf.Session(graph=tf.Graph(),config=config)
  382. if not lazyLoad:
  383. self.getModel()
  384. def getModel(self):
  385. if self.model_person is None:
  386. with self.sess_person.as_default() as sess:
  387. with sess.graph.as_default():
  388. # meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/person_savedmodel_new")
  389. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/person_savedmodel_new_znj")
  390. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  391. signature_def = meta_graph_def.signature_def
  392. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  393. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  394. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  395. self.model_person = [[input0,input1],output]
  396. return self.model_person
  397. '''
  398. if self.model_person is None:
  399. self.model_person = models.load_model(self.model_person_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  400. return self.model_person
  401. '''
  402. '''
  403. def load_weights(self):
  404. model = self.getModel()
  405. model.load_weights(self.model_person_file)
  406. '''
  407. def encode(self,tokens,begin_index,end_index,**kwargs):
  408. # return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=10),shape=(2,10,128))
  409. return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=20),shape=(2,20,128))
  410. def predict(self,x):
  411. x = np.transpose(np.array(x),(1,0,2,3))
  412. model_person = self.getModel()
  413. assert len(x)==len(model_person[0])
  414. feed_dict = {}
  415. for _x,_t in zip(x,model_person[0]):
  416. feed_dict[_t] = _x
  417. list_result = limitRun(self.sess_person,[model_person[1]],feed_dict)[0]
  418. return list_result
  419. #return self.sess_person.run(model_person[1],feed_dict=feed_dict)
  420. '''
  421. with self.graph.as_default():
  422. return self.getModel().predict([x[0],x[1]])
  423. '''
  424. class Model_form_line():
  425. def __init__(self,lazyLoad=getLazyLoad()):
  426. self.model_file = os.path.dirname(__file__)+"/../form/model/model_form.model - 副本.hdf5"
  427. self.model_form = None
  428. self.graph = tf.get_default_graph()
  429. if not lazyLoad:
  430. self.getModel()
  431. def getModel(self):
  432. if self.model_form is None:
  433. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  434. return self.model_form
  435. def encode(self,data,shape=(100,60),expand=False,**kwargs):
  436. embedding = np.zeros(shape)
  437. word_model = getModel_word()
  438. for i in range(len(data)):
  439. if i>=shape[0]:
  440. break
  441. if data[i] in word_model.vocab:
  442. embedding[i] = word_model[data[i]]
  443. if expand:
  444. embedding = np.expand_dims(embedding,0)
  445. return embedding
  446. def predict(self,x):
  447. with self.graph.as_default():
  448. return self.getModel().predict(x)
  449. class Model_form_item():
  450. def __init__(self,lazyLoad=getLazyLoad(),config=None):
  451. self.model_file = os.path.dirname(__file__)+"/../form/log/ep039-loss0.038-val_loss0.064-f10.9783.h5"
  452. self.model_form = None
  453. self.sess_form = tf.Session(graph=tf.Graph(),config=config)
  454. if not lazyLoad:
  455. self.getModel()
  456. def getModel(self):
  457. if self.model_form is None:
  458. with self.sess_form.as_default() as sess:
  459. with sess.graph.as_default():
  460. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir="%s/form_savedmodel"%(os.path.dirname(__file__)))
  461. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  462. signature_def = meta_graph_def.signature_def
  463. inputs = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["inputs"].name)
  464. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  465. self.model_form = [[inputs],output]
  466. return self.model_form
  467. '''
  468. if self.model_form is None:
  469. with self.graph.as_defalt():
  470. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  471. return self.model_form
  472. '''
  473. def encode(self,data,**kwargs):
  474. return encodeInput([data], word_len=50, word_flag=True,userFool=False)[0]
  475. return encodeInput_form(data)
  476. def predict(self,x):
  477. if USE_API:
  478. requests_result = requests.post(API_URL+"/predict_form_item",json={"inputs":x.tolist()}, verify=True)
  479. list_result = json.loads(requests_result.text)['result']
  480. else:
  481. model_form = self.getModel()
  482. list_result = limitRun(self.sess_form,[model_form[1]],feed_dict={model_form[0][0]:x})[0]
  483. return list_result
  484. # return self.sess_form.run(model_form[1],feed_dict={model_form[0][0]:x})
  485. '''
  486. with self.graph.as_default():
  487. return self.getModel().predict(x)
  488. '''
  489. class Model_form_context():
  490. def __init__(self,lazyLoad=getLazyLoad(),config=None):
  491. self.model_form = None
  492. self.sess_form = tf.Session(graph=tf.Graph(),config=config)
  493. if not lazyLoad:
  494. self.getModel()
  495. def getModel(self):
  496. if self.model_form is None:
  497. with self.sess_form.as_default() as sess:
  498. with sess.graph.as_default():
  499. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir="%s/form_context_savedmodel"%(os.path.dirname(__file__)))
  500. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  501. signature_def = meta_graph_def.signature_def
  502. inputs = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["inputs"].name)
  503. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  504. self.model_form = [[inputs],output]
  505. return self.model_form
  506. '''
  507. if self.model_form is None:
  508. with self.graph.as_defalt():
  509. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  510. return self.model_form
  511. '''
  512. def encode_table(self,inner_table,size=30):
  513. def encode_item(_table,i,j):
  514. _x = [_table[j-1][i-1],_table[j-1][i],_table[j-1][i+1],
  515. _table[j][i-1],_table[j][i],_table[j][i+1],
  516. _table[j+1][i-1],_table[j+1][i],_table[j+1][i+1]]
  517. e_x = [encodeInput_form(_temp[0],MAX_LEN=30) for _temp in _x]
  518. _label = _table[j][i][1]
  519. # print(_x)
  520. # print(_x[4],_label)
  521. return e_x,_label,_x
  522. def copytable(inner_table):
  523. table = []
  524. for line in inner_table:
  525. list_line = []
  526. for item in line:
  527. list_line.append([item[0][:size],item[1]])
  528. table.append(list_line)
  529. return table
  530. table = copytable(inner_table)
  531. padding = ["#"*30,0]
  532. width = len(table[0])
  533. height = len(table)
  534. table.insert(0,[padding for i in range(width)])
  535. table.append([padding for i in range(width)])
  536. for item in table:
  537. item.insert(0,padding.copy())
  538. item.append(padding.copy())
  539. data_x = []
  540. data_y = []
  541. data_text = []
  542. data_position = []
  543. for _i in range(1,width+1):
  544. for _j in range(1,height+1):
  545. _x,_y,_text = encode_item(table,_i,_j)
  546. data_x.append(_x)
  547. _label = [0,0]
  548. _label[_y] = 1
  549. data_y.append(_label)
  550. data_text.append(_text)
  551. data_position.append([_i-1,_j-1])
  552. # input = table[_j][_i][0]
  553. # item_y = [0,0]
  554. # item_y[table[_j][_i][1]] = 1
  555. # data_x.append(encodeInput([input], word_len=50, word_flag=True,userFool=False)[0])
  556. # data_y.append(item_y)
  557. return data_x,data_y,data_text,data_position
  558. def encode(self,inner_table,**kwargs):
  559. data_x,_,_,data_position = self.encode_table(inner_table)
  560. return data_x,data_position
  561. def predict(self,x):
  562. model_form = self.getModel()
  563. list_result = limitRun(self.sess_form,[model_form[1]],feed_dict={model_form[0][0]:x})[0]
  564. return list_result
  565. # class Model_form_item():
  566. # def __init__(self,lazyLoad=False):
  567. # self.model_file = os.path.dirname(__file__)+"/ep039-loss0.038-val_loss0.064-f10.9783.h5"
  568. # self.model_form = None
  569. #
  570. # if not lazyLoad:
  571. # self.getModel()
  572. # self.graph = tf.get_default_graph()
  573. #
  574. # def getModel(self):
  575. # if self.model_form is None:
  576. # self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  577. # return self.model_form
  578. #
  579. # def encode(self,data,**kwargs):
  580. #
  581. # return encodeInput_form(data)
  582. #
  583. # def predict(self,x):
  584. # with self.graph.as_default():
  585. # return self.getModel().predict(x)