document_.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. from tools_1 import BaseMethods
  2. from pprint import pprint
  3. import re
  4. import logging
  5. def create_logger(log_path):
  6. """
  7. 将日志输出到日志文件和控制台
  8. """
  9. logger = logging.getLogger()
  10. logger.setLevel(logging.INFO)
  11. formatter = logging.Formatter(
  12. '%(asctime)s - %(levelname)s - %(message)s')
  13. # 创建一个handler,用于写入日志文件
  14. file_handler = logging.FileHandler(
  15. filename=log_path, mode='w')
  16. file_handler.setFormatter(formatter)
  17. file_handler.setLevel(logging.INFO)
  18. logger.addHandler(file_handler)
  19. # 创建一个handler,用于将日志输出到控制台
  20. console = logging.StreamHandler()
  21. console.setLevel(logging.DEBUG)
  22. console.setFormatter(formatter)
  23. logger.addHandler(console)
  24. return logger
  25. log_path = "code/logs/logs.log"
  26. logger = create_logger(log_path=log_path)
  27. class DocumentPreReview():
  28. def __init__(self, file_path) -> None:
  29. self.bm = BaseMethods()
  30. self.Bidding_tables = self.get_Bidding_table(file_path)
  31. def get_Bidding_table(self, file_path:str):
  32. ''' get table data
  33. '''
  34. # file_path = "data/预审查数据/三峡左岸及电源电站中央空调系统管网及末端改造(发布稿)-table.json"
  35. # file_path = "data/预审查数据/2023年档案管理系统功能优化项目采购程序文件-table.json"
  36. all_tables = self.bm.json_read(file_path)
  37. return all_tables
  38. def _scrutinize_judge(self, tag:str, threshold_value:int=3):
  39. ''' Clause number content judgment
  40. 商务 技术 报价 评审 评分 标准
  41. '''
  42. scrutinize_tuple = ("商务","技术","报价","评审","评分","标准")
  43. hit_num = 0
  44. for scru in scrutinize_tuple:
  45. if scru in tag: hit_num+= 1
  46. if hit_num>=threshold_value: return True
  47. else: return False
  48. def check_table(self, all_tables):
  49. ''' check the form to assess quailty'''
  50. # all_tables = self.Bidding_tables
  51. tables_list = []
  52. previous_page_number = 0
  53. criteria_sign = False
  54. for partial_form in all_tables:
  55. record_num = 1
  56. table_name = partial_form['table_name']
  57. page_number = partial_form['page_numbers']
  58. title_len = partial_form['title_len']
  59. col_len = partial_form['col_len']
  60. tables = partial_form["table"]
  61. form_ = {'table_name':table_name, 'page_numbers':page_number, 'table':[],
  62. 'col_len':col_len, 'title_len':title_len}
  63. if '办法' in table_name and '前附表' in table_name:
  64. previous_page_number = page_number[0]
  65. regulation_number_index,evaluation_factor_index,evaluation_criteria_index = 0,0,0
  66. regulation_number_index_,score_factor_index,score_criteria_index = 0,0,0
  67. for table_index, table in enumerate(tables):
  68. if '评审因素' in table and '评审标准' in table:
  69. regulation_number_index = table.index("条款号")
  70. evaluation_factor_index = table.index("评审因素")
  71. evaluation_criteria_index = table.index("评审标准")
  72. form_['table'].append(table)
  73. continue
  74. elif not table[evaluation_factor_index] and table[evaluation_criteria_index]:
  75. form_['table'][table_index-1][evaluation_criteria_index] += table[evaluation_factor_index]
  76. else:
  77. if table not in form_['table'] and not criteria_sign:
  78. form_['table'].append(table)
  79. if '评分因素' in table and '评分标准' in table:
  80. regulation_number_index_ = table.index("条款号")
  81. score_factor_index = table.index("评分因素")
  82. score_criteria_index = table.index("评分标准")
  83. weights_index = table.index("权重")
  84. criteria_sign = True
  85. continue
  86. elif criteria_sign and self._scrutinize_judge(table[regulation_number_index_+1],2) and not table[score_factor_index]:
  87. form_['table'][table_index-record_num][score_factor_index-1] += table[score_factor_index-1]
  88. form_['table'][table_index-record_num][score_criteria_index] += table[score_criteria_index]
  89. form_['table'][table_index-record_num][weights_index] += table[weights_index]
  90. record_num += 1
  91. else:
  92. if table not in form_['table'] and criteria_sign:
  93. form_['table'].append(table)
  94. continue
  95. tables_list.append(form_)
  96. elif previous_page_number and page_number[-1]<previous_page_number+3:
  97. for table_index, table in enumerate(tables):
  98. if '评分因素' in table and '评分标准' in table:
  99. regulation_number_index_ = table.index("条款号")
  100. score_factor_index = table.index("评分因素")
  101. score_criteria_index = table.index("评分标准")
  102. weights_index = table.index("权重")
  103. form_['table'].append(table)
  104. criteria_sign = True
  105. continue
  106. elif criteria_sign and self._scrutinize_judge(table[regulation_number_index_+1],2) and not table[score_factor_index]:
  107. form_['table'][table_index-record_num][score_factor_index-1] += table[score_factor_index-1]
  108. form_['table'][table_index-record_num][score_criteria_index] += table[score_criteria_index]
  109. form_['table'][table_index-record_num][weights_index] += table[weights_index]
  110. record_num += 1
  111. else: form_['table'].append(table)
  112. tables_list.append(form_)
  113. else:
  114. tables_list.append(partial_form)
  115. return tables_list
  116. def get_table(self):
  117. ''' parse the Bidding_tables.json file to get the table data from it.
  118. '''
  119. all_tables = self.check_table(self.Bidding_tables)
  120. # all_tables = self.Bidding_tables
  121. # 招标文件内容中预审查
  122. tag_sign = ''
  123. tag_list = ("形式评审标准", "资格评审标准", "响应性评审标准")
  124. tag_dict = dict([(tag,[]) for tag in tag_list])
  125. scrutinize_dict = {}
  126. scrutinize_page = 0
  127. scrutinize_index = -1
  128. scrutinize_Initial_title_len = 0 # 详审表长度
  129. scrutinize_second_title_len = 0
  130. scrutinize_sign = False
  131. regulation_number_index_,evaluation_factor_index,evaluation_criteria_index,weights_index = 0,0,0,0
  132. for partial_form in all_tables:
  133. table_name = partial_form['table_name']
  134. page_number = partial_form['page_numbers']
  135. title_len = partial_form['title_len']
  136. tables = partial_form["table"]
  137. form_sign = re.findall('评\w+法前附表',table_name)
  138. if form_sign:
  139. table_page_num = page_number[-1]
  140. for table in tables[1:]:
  141. if '评分因素' in table or '评分标准' in table:
  142. scrutinize_page = table_page_num
  143. scrutinize_Initial_title_len = title_len
  144. if not scrutinize_page: scrutinize_page = table_page_num+1
  145. ''' scrutinize '''
  146. if (scrutinize_page in page_number and scrutinize_Initial_title_len) or scrutinize_page == page_number[0]:
  147. scrutinize_sign = True
  148. if not scrutinize_Initial_title_len: scrutinize_Initial_title_len = title_len
  149. for table in tables:
  150. if '评分因素' in table and '评分标准' in table:
  151. regulation_number_index_ = table.index("条款号")
  152. evaluation_factor_index = table.index("评分因素")
  153. evaluation_criteria_index = table.index("评分标准")
  154. weights_index = table.index("权重")
  155. tag_sign_ = ''
  156. scrutinize_index = tables.index(table)
  157. break
  158. elif '评分因素' in table and '评分标准' not in table:
  159. scrutinize_index = tables.index(table)
  160. table_split = table[-1].replace(' ','').split()
  161. if '评分标准' in table_split and '权重' in table_split:
  162. table = table[:-1]
  163. table.extend(table_split)
  164. regulation_number_index_ = table.index("条款号")
  165. evaluation_factor_index = table.index("评分因素")
  166. evaluation_criteria_index = table.index("评分标准")
  167. weights_index = table.index("权重")
  168. tag_sign_ = ''
  169. break
  170. if scrutinize_index != -1:
  171. for table in tables[scrutinize_index+1:]:
  172. if table[regulation_number_index_+1]: tag = table[regulation_number_index_+1]
  173. elif self._scrutinize_judge(table[regulation_number_index_+2]): tag = table[regulation_number_index_+2]
  174. else: tag = table[regulation_number_index_]
  175. if tag:
  176. tag = tag.strip().replace("\n","")
  177. tag = ''.join(re.findall(r"[\u4e00-\u9fa5]+", tag))
  178. if tag and self._scrutinize_judge(tag):
  179. tag_sign_ = tag
  180. if tag_sign_ not in scrutinize_dict: scrutinize_dict[tag_sign_] = []
  181. evaluation_factor,evaluation_criteria,weights = table[evaluation_factor_index],table[evaluation_criteria_index],table[weights_index]
  182. if not weights: value = {"评分因素":evaluation_factor.strip().replace("\n",""),"评分标准":evaluation_criteria.strip().replace("\n","")}
  183. else: value = {"评分因素":evaluation_factor.strip().replace("\n",""),
  184. "评分标准":evaluation_criteria.strip().replace("\n",""),
  185. "权重":weights.strip().replace("\n","")}
  186. scrutinize_dict[tag_sign_].append(value)
  187. if table[regulation_number_index_]:
  188. if table[regulation_number_index_][0] == '3':
  189. scrutinize_dict = {key: value for key, value in scrutinize_dict.items() if value}
  190. scrutinize_Initial_title_len = 0
  191. break
  192. elif scrutinize_page+1 in page_number and scrutinize_sign:
  193. scrutinize_second_title_len = title_len
  194. difference_value = scrutinize_Initial_title_len - title_len
  195. if difference_value:
  196. table_length = len(table)
  197. evaluation_factor_index -= difference_value
  198. evaluation_criteria_index -= difference_value
  199. weights_index -= difference_value
  200. if weights_index >= table_length:
  201. evaluation_factor_index = table_length-3
  202. evaluation_criteria_index = table_length-2
  203. weights_index = table_length-1
  204. for table in tables:
  205. if not table[evaluation_criteria_index]:
  206. scrutinize_dict[tag_sign_][-1]['评分标准'] += table[-1] if table[-1] else table[-2]
  207. continue
  208. if '条款内容' in table and '编列内容' in table:
  209. break
  210. if table[regulation_number_index_+1]: tag = table[regulation_number_index_+1]
  211. elif self._scrutinize_judge(table[regulation_number_index_+2]): tag = table[regulation_number_index_+2]
  212. else: tag = table[regulation_number_index_]
  213. if tag:
  214. tag = tag.strip().replace("\n","")
  215. tag = re.findall("[\u4e00-\u9fff]+", tag)[0]
  216. if tag and self._scrutinize_judge(tag):
  217. tag_sign_ = tag
  218. if tag_sign_ not in scrutinize_dict: scrutinize_dict[tag_sign_] = []
  219. evaluation_factor,evaluation_criteria,weights = table[evaluation_factor_index],table[evaluation_criteria_index],table[weights_index]
  220. if not weights: value = {"评分因素":evaluation_factor.strip().replace("\n",""), "评分标准":evaluation_criteria.strip().replace("\n","")}
  221. else: value = {"评分因素":evaluation_factor.strip().replace("\n",""),
  222. "评分标准":evaluation_criteria.strip().replace("\n",""),
  223. "权重":weights.strip().replace("\n","")}
  224. scrutinize_dict[tag_sign_].append(value)
  225. if table[regulation_number_index_]:
  226. if table[regulation_number_index_][0] == '3':
  227. scrutinize_dict = {key: value for key, value in scrutinize_dict.items() if value}
  228. scrutinize_Initial_title_len = 0
  229. break
  230. elif scrutinize_page+2 in page_number and scrutinize_sign:
  231. difference_value = scrutinize_second_title_len - title_len
  232. if difference_value:
  233. evaluation_factor_index -= difference_value
  234. evaluation_criteria_index -= difference_value
  235. weights_index -= difference_value
  236. for table in tables:
  237. if not table[evaluation_criteria_index]:
  238. scrutinize_dict[tag_sign_][-1]['评分标准'] += table[-1] if table[-1] else table[-2]
  239. continue
  240. if '条款内容' in table and '编列内容' in table:
  241. break
  242. if table[regulation_number_index_+1]: tag = table[regulation_number_index_+1]
  243. elif self._scrutinize_judge(table[regulation_number_index_+2]): tag = table[regulation_number_index_+2]
  244. else: tag = table[regulation_number_index_]
  245. if tag:
  246. tag = tag.strip().replace("\n","")
  247. tag = re.findall("[\u4e00-\u9fff]+", tag)[0]
  248. if tag and self._scrutinize_judge(tag):
  249. tag_sign_ = tag
  250. if tag_sign_ not in scrutinize_dict: scrutinize_dict[tag_sign_] = []
  251. evaluation_factor,evaluation_criteria,weights = table[evaluation_factor_index],table[evaluation_criteria_index],table[weights_index]
  252. if not weights: value = {"评分因素":evaluation_factor.strip().replace("\n",""), "评分标准":evaluation_criteria.strip().replace("\n","")}
  253. else: value = {"评分因素":evaluation_factor.strip().replace("\n",""),
  254. "评分标准":evaluation_criteria.strip().replace("\n",""),
  255. "权重":weights.strip().replace("\n","")}
  256. scrutinize_dict[tag_sign_].append(value)
  257. if table[regulation_number_index_]:
  258. if table[regulation_number_index_][0] == '3':
  259. scrutinize_dict = {key: value for key, value in scrutinize_dict.items() if value}
  260. scrutinize_Initial_title_len = 0
  261. break
  262. pprint(scrutinize_dict)
  263. return scrutinize_dict
  264. if __name__ == '__main__':
  265. # import os
  266. # base_dir = 'data/清标详审数据'
  267. # for path_ in os.listdir(base_dir):
  268. # if 'table' in path_ and path_.endswith('.json'):
  269. # file_path = os.path.join(base_dir, path_)
  270. # dpr = DocumentPreReview(file_path)
  271. # print(path_)
  272. # scrutinize_dict = dpr.get_table() # TODO scrutinize_dict是需要的结果
  273. # break
  274. path_ = "data/清标详审数据/2023-2024年度乌东德电站图像监控系统及广播系统扩建-table(1).json"
  275. dpr = DocumentPreReview(path_)
  276. scrutinize_dict = dpr.get_table()