validation.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. '''
  2. Created on 2019年5月15日
  3. @author: User
  4. '''
  5. from bs4 import BeautifulSoup, Comment
  6. import copy
  7. import re
  8. import sys
  9. import os
  10. import codecs
  11. import requests
  12. import json
  13. sys.path.append(os.path.abspath("../.."))
  14. import fool
  15. from BiddingKG.dl.interface.Connection import *
  16. from BiddingKG.dl.common.Utils import *
  17. from BiddingKG.dl.interface.Connection import getConnection
  18. import BiddingKG.dl.interface.predictor as predictor
  19. import BiddingKG.dl.interface.Preprocessing as Preprocessing
  20. import BiddingKG.dl.interface.getAttributes as getAttributes
  21. def run_predict():
  22. '''
  23. data = load("val.pk")
  24. print(data[0])
  25. '''
  26. data = load("label_0_1197.pk")
  27. codeNamePredict = predictor.CodeNamePredict()
  28. premPredict = predictor.PREMPredict()
  29. epcPredict = predictor.EPCPredict()
  30. roleRulePredict = predictor.RoleRulePredictor()
  31. count = 0
  32. not_find_count = 0
  33. list_filename_index_notfound = []
  34. for item in data:
  35. count += 1
  36. print(count,not_find_count,len(data))
  37. list_articles,list_sentences,list_entitys,_ = Preprocessing.get_preprocessed([[item["filename"],item["content"],"","",""]],useselffool=True)
  38. codeName = codeNamePredict.predict(list_articles)
  39. premPredict.predict(list_sentences,list_entitys)
  40. roleRulePredict.predict(list_articles,list_sentences, list_entitys,codeName)
  41. epcPredict.predict(list_sentences,list_entitys)
  42. prem = getAttributes.getPREMs(list_sentences,list_entitys,list_articles)
  43. print(prem)
  44. label_prem = re.sub("[\r\s\n]","",item["prem"])
  45. label_prem = re.sub("(","(",label_prem)
  46. label_prem = re.sub(")",")",label_prem)
  47. set_label_entitys = set()
  48. for prem1 in label_prem.split(";"):
  49. if len(prem1.split("-"))>2:
  50. set_label_entitys.add(prem1.split("-")[2])
  51. set_extract_entitys = set()
  52. for list_entity in list_entitys:
  53. for entity in list_entity:
  54. if entity.entity_type in ["org","company"]:
  55. set_extract_entitys.add(entity.entity_text)
  56. not_find_count += len(set_label_entitys-(set_label_entitys&set_extract_entitys))
  57. print(item["filename"],set_label_entitys-(set_label_entitys&set_extract_entitys))
  58. list_filename_index_notfound.append([item["filename"],count,set_label_entitys-(set_label_entitys&set_extract_entitys)])
  59. if len(codeName)>0:
  60. item["predict_code"] = codeName[0][1]["code"]
  61. item["predict_name"] = codeName[0][1]["name"]
  62. else:
  63. item["predict_code"] = ""
  64. item["predict_name"] = ""
  65. if len(prem)>0:
  66. item["predict_prem"] = prem[0][1]["prem"]
  67. else:
  68. item["predict_prem"] = ""
  69. for item in list_filename_index_notfound:
  70. print(item)
  71. save(data,"val_selffool7.pk")
  72. def run_predict_interface():
  73. '''
  74. data = load("val.pk")
  75. print(data[0])
  76. '''
  77. data = load("label_0_1197.pk")
  78. # codeNamePredict = predictor.CodeNamePredict()
  79. # premPredict = predictor.PREMPredict()
  80. # epcPredict = predictor.EPCPredict()
  81. count = 0
  82. not_find_count = 0
  83. myheaders = {'Content-Type': 'application/json'}
  84. guardian_base2 = 'http://192.168.2.101:15011'
  85. for item in data:
  86. count += 1
  87. user = {
  88. "content": item["content"],
  89. "id":item["filename"]
  90. }
  91. _resp = requests.post(guardian_base2 + '/article_extract', json=user, headers=myheaders, verify=True)
  92. resp_json = _resp.content.decode("utf-8")
  93. obj_json = json.loads(resp_json)
  94. prem = obj_json["prem"]
  95. print(count,not_find_count,len(data))
  96. item["predict_code"] = obj_json["code"]
  97. item["predict_name"] = obj_json["name"]
  98. item["predict_prem"] = prem
  99. save(data,"val_interface.pk")
  100. def getAccRecall():
  101. # data = load("val_selffool7.pk")
  102. data = load("val_interface.pk")
  103. data_label = load("label_0_1197.pk")
  104. roles = [0,1,2,3,4,"code","name","money","person"]
  105. models = ["","role"]
  106. type = ["coincidence","label","predict"]
  107. count_dict = {}
  108. list_not_true = []
  109. index = 0
  110. for t in type:
  111. for m in models:
  112. for role in roles:
  113. count_dict[t+"_"+str(m)+"_"+str(role)] = 0
  114. list_filename_not_label_predict = []
  115. for item,item_label in zip(data,data_label):
  116. index += 1
  117. label_code = re.sub("[\r\n\s]","",item_label["code"])
  118. predict_code = ";".join(item["predict_code"])
  119. label_name = re.sub("[\r\n\s]","",item_label["name"])
  120. predict_name = item["predict_name"]
  121. label_prem = re.sub("[\r\n\s]","",item_label["prem"])
  122. label_prem = re.sub("(","(",label_prem)
  123. label_prem = re.sub(")",")",label_prem)
  124. predict_prem = item["predict_prem"]
  125. # print("===",item)
  126. count_not_true = 0
  127. #count code
  128. set_label_code = set([a for a in re.split("[;;]",label_code) if a!='' and a!='1'])
  129. set_predict_code = set([a for a in re.split("[;;]",predict_code) if a!=''])
  130. count_dict["coincidence__code"] += len(set_label_code&set_predict_code)
  131. count_dict["label__code"] += len(set_label_code-(set_label_code&set_predict_code))
  132. count_dict["predict__code"]+= len(set_predict_code-(set_label_code&set_predict_code))
  133. # new count name
  134. set_label_name = set([a for a in re.split("[;;]",label_name) if a!='' and a!='1'])
  135. #set_predict_name = set([a for a in re.split("[;;]",predict_name) if a!='']) # 单个项目名称
  136. set_predict_name = set(predict_name) # 多个项目名称
  137. if len(set_label_name&set_predict_name) > 0:
  138. count_dict["coincidence__name"] += 1
  139. elif len(set_predict_name-(set_label_name&set_predict_name)) >0:
  140. count_dict["predict__name"]+= 1
  141. elif len(set_label_name-(set_label_name&set_predict_name)) > 0:
  142. count_dict["label__name"] += 1
  143. #count role、money、person
  144. role_id = {0:"tenderee",
  145. 1:"agency",
  146. 2:"win_tenderer",
  147. 3:"second_tenderer",
  148. 4:"third_tenderer"}
  149. filename_not_label_predict = [item["filename"],set(),set()]
  150. #get not true roles of each article
  151. not_true_roles = [item["filename"],set(),set()]
  152. predict_roles = set()
  153. label_roles = set()
  154. # for _pack in predict_prem.keys():
  155. # for prem1 in predict_prem[_pack]["roleList"]:
  156. # predict_roles.add(prem1[0]+prem1[1])
  157. for item2 in predict_prem:
  158. predict_roles.add(item2[2]+item2[3])
  159. for item1 in label_prem.split(";"):
  160. prem1 = item1.split("-")
  161. if len(prem1)>1:
  162. label_roles.add(role_id[int(prem1[1])]+prem1[2])
  163. not_true_roles[1] = label_roles-(label_roles&predict_roles)
  164. not_true_roles[2] = predict_roles-(predict_roles&label_roles)
  165. if len(not_true_roles[1])>0 or len(not_true_roles[2])>0:
  166. print(not_true_roles)
  167. for role in [0,1,2,3,4]:
  168. temp_set = set()
  169. temp_set2 = set()
  170. same_package_count = 0
  171. package_set = set()
  172. # for _pack in predict_prem.keys():
  173. # for prem1 in predict_prem[_pack]["roleList"]:
  174. # if prem1[0]==role_id[role]:
  175. # temp_set.add((prem1[1]))
  176. for prem1 in predict_prem:
  177. if prem1[2]==role_id[role]:
  178. packageName = prem1[0]
  179. #temp_set.add((packageName,prem1[3]))
  180. temp_set.add((prem1[3]))
  181. for item1 in label_prem.split(";"):
  182. prem1 = item1.split("-")
  183. if len(prem1)>1 and str(prem1[1]).strip()==str(role):
  184. #print(prem1)
  185. packageName = "Project" if prem1[0]=="" else prem1[0]
  186. if packageName in package_set:
  187. same_package_count += 1
  188. package_set.add(packageName)
  189. #temp_set2.add((packageName,prem1[2]))
  190. temp_set2.add((prem1[2]))
  191. _coincidence = temp_set&temp_set2
  192. _label = temp_set2-(temp_set&temp_set2)
  193. _predict = temp_set-(temp_set&temp_set2)
  194. for item1 in list(_label):
  195. filename_not_label_predict[1].add((role,item1))
  196. for item1 in list(_predict):
  197. filename_not_label_predict[2].add((role,item1))
  198. count_dict["coincidence_role_"+str(role)] += len(temp_set&temp_set2)
  199. count_dict["label_role_"+str(role)] += len(temp_set2-(temp_set&temp_set2))-same_package_count
  200. count_dict["predict_role_"+str(role)] += len(temp_set-(temp_set&temp_set2))
  201. count_not_true += len(temp_set2-(temp_set&temp_set2))
  202. #count package_role_entity_money_people
  203. #list_not_true.append([item["filename"],count_not_true,index,label_prem,predict_prem])
  204. list_filename_not_label_predict.append(filename_not_label_predict)
  205. #count money
  206. temp_set = set()
  207. temp_set2 = set()
  208. same_entity_money = 0
  209. # for _pack in predict_prem.keys():
  210. # for prem1 in predict_prem[_pack]["roleList"]:
  211. # money = prem1[2]
  212. # if str(money)!="0":
  213. # temp_set.add((prem1[1],getUnifyMoney(money)))
  214. for prem1 in predict_prem:
  215. money = prem1[4]
  216. if str(money)!="0":
  217. temp_set.add((prem1[3],getUnifyMoney(str(money))))
  218. # temp_set.add((getUnifyMoney(str(money))))
  219. for item1 in label_prem.split(";"):
  220. prem1 = item1.split("-")
  221. if len(prem1)>1:
  222. for m in prem1[3].split("、"):
  223. if m!="":
  224. same_entity_money += 1
  225. temp_set2.add((prem1[2],getUnifyMoney(m)))
  226. # temp_set2.add((getUnifyMoney(m)))
  227. if same_entity_money>0:
  228. same_entity_money -= 1
  229. count_dict["coincidence__money"] += len(temp_set&temp_set2)
  230. count_dict["label__money"] += len(temp_set2-(temp_set&temp_set2))-same_entity_money
  231. count_dict["predict__money"] += len(temp_set-(temp_set&temp_set2))
  232. print("money_notfound",item["filename"],temp_set2-(temp_set&temp_set2))
  233. print("money_foundError",item["filename"],temp_set-(temp_set&temp_set2))
  234. #count person
  235. temp_set = set()
  236. temp_set2 = set()
  237. # for _pack in predict_prem.keys():
  238. # for prem1 in predict_prem[_pack]["roleList"]:
  239. # person = prem1[3]
  240. # for p in person:
  241. # temp_set.add((prem1[1],p[0]))
  242. for prem1 in predict_prem:
  243. person = prem1[5]
  244. for p in person:
  245. temp_set.add((prem1[3],p[0]))
  246. for item1 in label_prem.split(";"):
  247. prem1 = item1.split("-")
  248. if len(prem1)>4:
  249. person = prem1[4]
  250. for p in person.split("|"):
  251. if p.strip()!="/" and p.strip()!="":
  252. temp_set2.add((prem1[2],p.split("/")[0]))
  253. count_dict["coincidence__person"] += len(temp_set&temp_set2)
  254. count_dict["label__person"] += len(temp_set2-(temp_set&temp_set2))
  255. count_dict["predict__person"] += len(temp_set-(temp_set&temp_set2))
  256. #count_not_true = len(temp_set2-(temp_set&temp_set2))
  257. #list_not_true.append([item["filename"],count_not_true,index,label_prem,predict_prem])
  258. list_not_true.sort(key=lambda x:x[1],reverse=True)
  259. for item in list_not_true:
  260. if item[1]>0:
  261. print(item)
  262. count_list = []
  263. for key in count_dict.keys():
  264. if count_dict[key]>0:
  265. count_list.append([key,count_dict[key]])
  266. count_list.sort(key = lambda x:x[0])
  267. for item in count_list:
  268. print(item)
  269. count_m = ["role","code","name","money","person"]
  270. count_roles = ["",0,1,2,3,4]
  271. def get_value(_list,find_list):
  272. count = 0
  273. for item in _list:
  274. find_flag = True
  275. for key in find_list:
  276. if str(item[0]).find(key)<0:
  277. find_flag = False
  278. if find_flag:
  279. count += item[1]
  280. return count
  281. for m in count_m:
  282. for roles in count_roles:
  283. concidence = get_value(count_list,["coincidence",str(m),str(roles)])
  284. label = get_value(count_list,["label",str(m),str(roles)])
  285. predict = get_value(count_list,["predict",str(m),str(roles)])
  286. if 0 not in [predict+concidence,label+concidence]:
  287. print(m,roles,concidence,label,predict,"acc",concidence/(predict+concidence),"recall",concidence/(label+concidence))
  288. save(list_filename_not_label_predict,"list_filename_not_label_predict_3.pk")
  289. def compare():
  290. data = load("list_filename_not_label_predict_3.pk")
  291. data1 = load("list_filename_not_label_predict_2.pk")
  292. for item,item_1 in zip(data,data1):
  293. print("==",item)
  294. print("--",item_1)
  295. label_compare = item[1]-item_1[1]
  296. predict_compare = item[2]-item_1[2]
  297. if len(label_compare)>0 or len(predict_compare)>0:
  298. print(item[0],label_compare,predict_compare)
  299. def findmultipack():
  300. '''
  301. @summary: 找到多标段的数据
  302. '''
  303. data = load("label_0_1197.pk")
  304. for item_label in data:
  305. label_prem = re.sub("[\r\n\s]","",item_label["prem"])
  306. label_prem = re.sub("(","(",label_prem)
  307. label_prem = re.sub(")",")",label_prem)
  308. set_pack = set()
  309. for item1 in label_prem.split(";"):
  310. prem1 = item1.split("-")
  311. set_pack.add(prem1[0])
  312. if len(set_pack)>1:
  313. print(item_label["filename"])
  314. if __name__=="__main__":
  315. # run_predict()
  316. run_predict_interface()
  317. getAccRecall()
  318. # compare()
  319. #findmultipack()