getAccRecall.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. '''
  2. Created on 2018年12月20日
  3. @author: User
  4. '''
  5. import psycopg2
  6. import re
  7. from decimal import Decimal
  8. from BiddingKG.dl.common.Utils import getUnifyMoney
  9. # Phase 1: PG 连接走 infra/db(原硬编码 host=192.168.2.101, password=postgres 已移除)
  10. from BiddingKG.dl.infra.db import get_connection
  11. conn = get_connection("BiddingKG")
  12. cursor = conn.cursor()
  13. sql = "select A.prem,A.epc,B.prem,B.code,B.name,A.code,A.name,A.doc_id from articles_validation A,predict_validation B where A.doc_id=B.doc_id order by A.doc_id"
  14. cursor.execute(sql)
  15. rows = cursor.fetchall()
  16. def getPackages(prem):
  17. '''
  18. @summary: 取得所有的包名
  19. '''
  20. result = set()
  21. for item in prem:
  22. result.add(item[0])
  23. return result
  24. def getRole_id(role_name):
  25. '''
  26. @summary: 取得角色名对应的ID
  27. '''
  28. if role_name=="tenderee":
  29. return "0"
  30. if role_name=="agency":
  31. return "1"
  32. if role_name=="win_tenderer":
  33. return "2"
  34. if role_name=="second_tenderer":
  35. return "3"
  36. if role_name=="third_tenderer":
  37. return "4"
  38. CN_sum_predict = 0
  39. CN_sum_label = 0
  40. CN_predict_label = 0
  41. role_sum_predict = 0
  42. role_sum_label = 0
  43. role_predict_label = 0
  44. person_label = 0
  45. person_predict = 0
  46. person_label_predict = 0
  47. money_label = 0
  48. money_predict = 0
  49. money_label_predict = 0
  50. only_role_sum_predict = 0
  51. only_role_sum_label = 0
  52. only_role_predict_label = 0
  53. only_money_label = 0
  54. only_money_label_all = 0
  55. only_money_predict = 0
  56. only_money_label_predict = 0
  57. only_person_label = 0
  58. only_person_predict = 0
  59. only_person_label_predict = 0
  60. role_find = 0
  61. role_find_label = 0
  62. money_find = 0
  63. money_find_label = 0
  64. person_find = 0
  65. person_find_label = 0
  66. def getFind(doc_id,type):
  67. '''
  68. @summary: 取得一篇文章某种类型的实体的数量
  69. @param:
  70. doc_id:文章的uuid
  71. type:实体类型
  72. '''
  73. result = set()
  74. sql = "select distinct entity_text from predict_entity where doc_id='"+doc_id+"' and entity_type in "+type+" "
  75. cursor.execute(sql)
  76. rows = cursor.fetchall()
  77. for row in rows:
  78. if type.find("money")>0:
  79. result.add(Decimal(row[0]))
  80. else:
  81. result.add(row[0])
  82. return result
  83. for row in rows:
  84. doc_id = row[7]
  85. label_prem = row[0]
  86. label_epc = row[1]
  87. predict_prem = row[2]
  88. list_label_prem = []
  89. #标注值
  90. for item in re.split("[;;]",label_prem):
  91. list_label_prem.append(re.split("-",item))
  92. list_predict_prem = []
  93. #预测值
  94. for item in re.split("[;;]",predict_prem):
  95. list_predict_prem.append(re.split("\$",item))
  96. #统计编号和名称
  97. hand_code = row[5]
  98. hand_name = row[6]
  99. predict_code = row[3]
  100. predict_name = row[4]
  101. set_hand_code = set()
  102. set_predict_code = set()
  103. for item in re.split("[;;]",hand_code):
  104. if item!="":
  105. set_hand_code.add(item.strip())
  106. for item in re.split("[;;]",predict_code):
  107. if item!="":
  108. set_predict_code.add(item.strip())
  109. CN_sum_label += len(set_hand_code)
  110. CN_sum_predict += len(set_predict_code)
  111. CN_predict_label += len(set_hand_code&set_predict_code)
  112. if hand_name is not None and hand_code!="":
  113. CN_sum_label += 1
  114. if predict_name is not None and predict_name!="":
  115. CN_sum_predict += 1
  116. if hand_name is not None and hand_name!="" and hand_name.strip()==predict_name.strip():
  117. CN_predict_label += 1
  118. #统计角色
  119. set_packages = getPackages(list_label_prem)
  120. set_predict = set()
  121. set_label = set()
  122. set_only_predict = set()
  123. set_only_label = set()
  124. if len(set_packages)>1:
  125. for item in re.split("[;;]",label_prem):
  126. if len(item)>1:
  127. item_split = item.split("-")
  128. set_label.add((item_split[0],item_split[1],item_split[2].strip()))
  129. set_only_label.add(item_split[2].strip())
  130. for item in list_predict_prem:
  131. if len(item)>1:
  132. set_predict.add((item[0],getRole_id(item[2]),item[3].strip()))
  133. set_only_predict.add(item[3].strip())
  134. else:
  135. for item in re.split("[;;]",label_prem):
  136. if len(item)>1:
  137. item_split = item.split("-")
  138. set_label.add((item_split[1],item_split[2]))
  139. set_only_label.add(item_split[2].strip())
  140. for item in list_predict_prem:
  141. if len(item)>1:
  142. set_predict.add((getRole_id(item[2]),item[3].strip()))
  143. set_only_predict.add(item[3].strip())
  144. role_sum_predict += len(set_predict)
  145. role_sum_label += len(set_label)
  146. role_predict_label += len(set_predict&set_label)
  147. only_role_sum_label += len(set_only_label)
  148. only_role_sum_predict += len(set_only_predict)
  149. only_role_predict_label += len(set_only_label&set_only_predict)
  150. set_find_role = getFind(doc_id,"('org','company')")
  151. role_find += len(set_find_role)
  152. role_find_label += len(set_only_label&set_find_role)
  153. #统计金额
  154. set_money_label = set()
  155. set_money_predict = set()
  156. set_only_money_label = set()
  157. set_only_money_predict = set()
  158. count_multi = 0
  159. for item in list_label_prem:
  160. if len(item)>3:
  161. if item[3]!="":
  162. count_multi_temp = 0
  163. for i in item[3].strip().split("、"):
  164. label_money = getUnifyMoney(re.sub("[,,]",'',i))
  165. if label_money>0:
  166. count_multi_temp += 1
  167. set_money_label.add((item[2].strip(),label_money))
  168. set_only_money_label.add(label_money)
  169. if count_multi_temp>0:
  170. count_multi += count_multi_temp -1
  171. money_label+=(len(set_money_label)-count_multi)
  172. only_money_label += len(set_only_money_label)-count_multi
  173. only_money_label_all += len(set_only_money_label)
  174. for item in list_predict_prem:
  175. if len(item)>2:
  176. if str(item[4])!="0":
  177. set_money_predict.add((item[3].strip(),Decimal(item[5])))
  178. set_only_money_predict.add(Decimal(item[5]))
  179. money_predict+=len(set_money_predict)
  180. money_label_predict+= len(set_money_label&set_money_predict)
  181. only_money_predict+=len(set_only_money_predict)
  182. only_money_label_predict+= len(set_only_money_label&set_only_money_predict)
  183. set_money_find = getFind(doc_id,"('money')")
  184. money_find += len(set_money_find)
  185. money_find_label += len(set_money_find&set_only_money_label)
  186. '''
  187. if len(set_money_label)-count_multi-len(set_money_label&set_money_predict)>=2:
  188. print(doc_id)
  189. print(set_money_label)
  190. print(set_money_predict)
  191. '''
  192. #统计联系人
  193. role_set = set()
  194. for item in list_label_prem:
  195. if len(item)>1:
  196. role_set.add(item[2])
  197. list_epc_label = []
  198. for item1 in re.split("[;;]",label_epc):
  199. item = re.split(",",item1)
  200. if len(item)>1:
  201. if item[0].strip() in role_set:
  202. list_epc_label.append([item[0].strip(),re.split("[/、]",item[1])])
  203. set_person_label = set()
  204. set_only_person_label = set()
  205. for item in list_epc_label:
  206. if len(item[1])>0 and item[1][0]!="":
  207. for i in item[1]:
  208. if i!="":
  209. set_person_label.add(item[0].strip()+i.strip())
  210. set_only_person_label.add(i.strip())
  211. person_label += len(set_person_label)
  212. only_person_label += len(set_only_person_label)
  213. set_person_predict = set()
  214. set_only_person_predict = set()
  215. for item1 in list_predict_prem:
  216. if len(item1)>1:
  217. if item1[7]!="":
  218. item = item1[7].split(",")
  219. for i in item:
  220. if i!="":
  221. set_person_predict.add(item1[3].strip()+i.split("/")[0].strip())
  222. set_only_person_predict.add(i.split("/")[0].strip())
  223. person_predict += len(set_person_predict)
  224. person_label_predict += len(set_person_label&set_person_predict)
  225. only_person_predict += len(set_only_person_predict)
  226. only_person_label_predict += len(set_only_person_label&set_only_person_predict)
  227. set_person_find = getFind(doc_id,"('person')")
  228. person_find += len(set_person_find)
  229. person_find_label += len(set_person_find&set_only_person_label)
  230. ''''''
  231. if abs(len(set_only_person_label)-len(set_only_person_predict))>=2:
  232. print(doc_id)
  233. print(set_person_label)
  234. print(set_person_predict)
  235. print("LinkTrueBase")
  236. print("编号名称:CN_sum_predict:%d,CN_sum_label:%d,CN_predict_label:%d,accurency:%f,recall:%f"%(CN_sum_predict,CN_sum_label,CN_predict_label,CN_predict_label/CN_sum_predict,CN_predict_label/CN_sum_label))
  237. print("角色:role_sum_predict:%d,role_sum_label:%d,role_predict_label:%d,accurency:%f,recall:%f"%(role_sum_predict,role_sum_label,role_predict_label,role_predict_label/role_sum_predict,role_predict_label/role_sum_label))
  238. print("金额:money_predict:%d,money_label:%d,money_label_predict:%d,acc:%f,recall:%f"%(money_predict,money_label,money_label_predict,money_label_predict/money_predict,money_label_predict/money_label))
  239. print("联系人:person_label:%d,person_predict:%d,person_label_predict:%d,acc:%f,recall:%f"%(person_label,person_predict,person_label_predict,person_label_predict/person_predict,person_label_predict/person_label))
  240. print("UserableBase")
  241. print("角色:only_role_sum_predict:%d,only_role_sum_label:%d,only_role_predict_label:%d,accurency:%f,recall:%f"%(only_role_sum_predict,only_role_sum_label,only_role_predict_label,only_role_predict_label/only_role_sum_predict,only_role_predict_label/only_role_sum_label))
  242. print("金额:only_money_predict:%d,only_money_label:%d,only_money_label_predict:%d,acc:%f,recall:%f"%(only_money_predict,only_money_label,only_money_label_predict,only_money_label_predict/only_money_predict,only_money_label_predict/only_money_label))
  243. print("联系人:only_person_label:%d,only_person_predict:%d,only_person_label_predict:%d,acc:%f,recall:%f"%(only_person_label,only_person_predict,only_person_label_predict,only_person_label_predict/only_person_predict,only_person_label_predict/only_person_label))
  244. ''''''
  245. print("ExtractBase")
  246. print("角色:role_find:%d,only_role_sum_label:%d,role_find_label:%d,accurency:%f,recall:%f"%(role_find,only_role_sum_label,role_find_label,role_find_label/role_find,role_find_label/only_role_sum_label))
  247. print("金额:money_find:%d,only_money_label:%d,money_find_label:%d,acc:%f,recall:%f"%(money_find,only_money_label_all,money_find_label,money_find_label/money_find,money_find_label/only_money_label_all))
  248. print("联系人:person_find:%d,only_person_predict:%d,person_find_label:%d,acc:%f,recall:%f"%(person_find,only_person_label,person_find_label,person_find_label/person_find,person_find_label/only_person_label))