소스 검색

Merge remote-tracking branch 'origin/master'

luojiehua 2 년 전
부모
커밋
91b1a5d6c7
2개의 변경된 파일61개의 추가작업 그리고 12개의 파일을 삭제
  1. 3 0
      BiddingKG/dl/interface/getAttributes.py
  2. 58 12
      BiddingKG/dl/interface/predictor.py

+ 3 - 0
BiddingKG/dl/interface/getAttributes.py

@@ -880,6 +880,9 @@ def getPackagesFromArticle(list_sentence, list_entity):
                 elif iter.end()+2 < len(content) and  re.search('标准|标的物|标志|包装|划分', content[iter.start():iter.end()+2]):
                     # print('过滤掉错误包:',iter.group())
                     continue
+                elif re.search('同一(标段?|包)', content[max(0, iter.start()-2):iter.end()]):  # 不得参加同一标段
+                    # print('过滤掉错误包:', iter.group())
+                    continue
                 temp_package_number = uniform_package_name(iter.group(0))
                 True_package.add(temp_package_number)
                 PackageList_item.append({"name": temp_package_number, "sentence_index": list_sentence[i].sentence_index,

+ 58 - 12
BiddingKG/dl/interface/predictor.py

@@ -748,6 +748,8 @@ class PREMPredict():
                 values[label] = 0.49
             elif label == 0 and re.search('最低限价', text):
                 values[label] = 0.49
+            elif re.search('金额在$', text):
+                values[label] = 0.49
             entity.set_Money(label, values)
 
     def correct_money_by_rule(self, title, list_entitys, list_articles):
@@ -2245,7 +2247,7 @@ class ProductAttributesPredictor():
                 continue
             for td in tds:
                 td_text = re.sub('\s', '', td.get_text())
-                td_text = td_text.replace("\x06", "").replace("\x05", "").replace("\x07", "").replace('\\', '/') # 修复272144312 # 产品单价数量提取结果有特殊符号\  气动执行装置备件\密封组件\NBR+PT
+                td_text = td_text.replace("\x06", "").replace("\x05", "").replace("\x07", "").replace('\\', '/').replace('"', '') # 修复272144312 # 产品单价数量提取结果有特殊符号\  气动执行装置备件\密封组件\NBR+PT
                 tr_line.append(td_text)
             inner_table.append(tr_line)
         return inner_table
@@ -2982,9 +2984,9 @@ class DocChannel():
           '招标答疑': '现澄清(为|如下)|答疑补遗|澄清内容如下|第[0-9一二三四五]次澄清|答疑澄清|(最高(投标)?限价|控制价|拦标价)公示',  # |异议的回复
           '公告变更': '第[\d一二]次变更|(更正|变更)(公告|公示|信息|内容|事项|原因|理由|日期|时间|如下)|原公告((主要)?(信息|内容)|发布时间)|(变更|更正)[前后]内容|现?在?(变更|更正|修改|更改)(内容)?为|(公告|如下|信息|内容|事项|结果|文件|发布|时间|日期)(更正|变更)',
           '公告变更neg': '履约变更内容',
-          '候选人公示': '候选人公示|评标结果公示|中标候选人名单公示',
+          '候选人公示': '候选人公示|评标结果公示|中标候选人名单公示|现将中标候选人(进行公示|公[示布]如下)|(中标|中选)候选人(信息|情况)[::\s]',
           '候选人公示neg': '中标候选人公示期',
-          '中标信息': '供地结果信息|采用单源直接采购的?情况说明|[特现]?将\w{,4}(成交|中标|中选|选定结果|选取结果|入围结果|竞价结果)\w{,4}(进行公示|公[示布]如下)|(询价|竞价|遴选)(成交|中标|中选)(公告|公示)|(成交|中标|中选|选定|选取|入围|询价)结果(如下|公告|公示)|(中标|中选)(供应商|承包商|候选人|入围单位)如下|拟定供应商的情况|((中标|中选)(候选人|人|成交)|成交)\w{,3}(信息|情况)[::\s]',
+          '中标信息': '供地结果信息|采用单源直接采购的?情况说明|[特现]?将\w{,4}(成交|中标|中选|选定结果|选取结果|入围结果|竞价结果)\w{,4}(进行公示|公[示布]如下)|(询价|竞价|遴选)(成交|中标|中选)(公告|公示)|(成交|中标|中选|选定|选取|入围|询价)结果(如下|公告|公示)|(中标|中选)(供应商|承包商|候选人|入围单位)如下|拟定供应商的情况|((中标|中选)(人|成交)|成交)\w{,3}(信息|情况)[::\s]',
           '中标信息2': '\s(成交|中标|中选)(信息|日期|时间|总?金额|价格)[::\s]|(采购|招标|成交|中标|中选|评标)结果|单一来源采购原因|拟采取单一来源方式采购|单一来源采购公示',
           '中标信息3': '(中标|中选|成交|拟定|拟选用|最终选定的?|受让|唯一)(供应商|供货商|服务商|机构|企业|公司|单位|候选人|人)(名称)?[::\s]|[、\s](第一名|(拟定|推荐|入围)?(供应商|供货商)|(中选|中标|供货)单位|中选人)[::\s]',
           '中标信息neg': '按项目控制价下浮\d%即为成交价|成交原则|不得确定为(中标|成交)|招标人按下列原则选择中标人|评选成交供应商:|拟邀请供应商|除单一来源采购项目外|单一来源除外|(各.{,5}|尊敬的)(供应商|供货商)[:\s]|竞拍起止时间:|询价结果[\s\n::]*不公开|本项目已具备招标条件|现对该项目进行招标公告|发布\w{2}结果后\d天内送达|本次\w{2}结果不对外公示|供应商\s*资格要求|成交情况:\s*[流废]标|中标单位:本次招标拟?中标单位\d家',
@@ -2992,7 +2994,7 @@ class DocChannel():
           '合同公告': '合同(公告|公示|信息|内容)|合同(编号|名称|主体|基本情况|完成(日期|时间))|(供应商乙方|乙方供应商):|合同总?金额|履约信息',
           '废标公告': '(终止|中止|废标|流标|失败|作废|异常|撤销)(结果)?(公告|公示|招标|采购|竞价)|(谈判结果为|结果类型):?废标|((本|该)(项目|标段|合同|合同包|采购包|次)\w{,5})((失败|终止|流标|废标)|予以废标|(按|做|作)?(流标|废标|废置)处理)|(采购|招标|询价|议价|竞价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|竞谈|应答|项目)(终止|中止|废标|流标|失败|作废|异常|撤销)',
           '废标公告2': '(无效|中止|终止|废标|流标|失败|作废|异常|撤销)的?(原因|理由)|本项目因故取消|本(项目|次)(公开)?\w{2}失败|已终止\s*原因:|(人|人数|供应商|单位)(不足|未达\w{,3}数量)|已终止|不足[3三]家|无(废标)|成交情况:\s*[流废]标|现予以废置',
-          '废标公告neg': '超过此报价将作为[废流]标处理|否则按[废流]标处理|终止规则:|成交规则:|视为流标'
+          '废标公告neg': '超过此报价将作为[废流]标处理|否则按[废流]标处理|终止规则:|成交规则:|视为流标|竞价失败的一切其他情形'
       }
       self.title_life_dic = {
           '采购意向': '采购意向|招标意向|选取意向|意向公告|意向公示|意向公开',
@@ -3370,7 +3372,9 @@ class DocChannel():
           if '采购意向' in life_kw_title or '采购意向' in life_list:
               return '采购意向', msc
           elif '招标预告' in life_kw_title or '招标预告' in life_list:
-              if set(['中标信息', '候选人公示', '合同公告']) & set(life_kw_content) != set():
+              if '中标信息' in life_kw_title:
+                  return '中标信息', msc
+              elif set(['候选人公示', '合同公告']) & set(life_kw_title) != set():
                   return '', msc
               return '招标预告', msc
           elif '公告变更' in life_kw_title or '公告变更' in life_list:
@@ -3578,7 +3582,7 @@ class DocChannel():
       if web_source_no in ['02104-7', '04733', 'DX007628-6']: # 这些数据源无法识别
           return {'docchannel': {'docchannel': '', 'doctype': '采招数据', 'life_docchannel': origin_dic.get(original_docchannel, '原始类别')}}, '此数据源公告分类不明确,返回数据源类别'
 
-      title = re.sub('[^\u4e00-\u9fa5]', '', title)
+      title = re.sub('[^\u4e00-\u9fa5]+|出租车', '', title)
       if len(title) > 50:
           title = title[:20] + title[-30:]
 
@@ -4335,9 +4339,33 @@ class DistrictPredictor():
                 # print(area_dic)
                 return {'district': area_dic}
 
-        tenderee, tenderee_address = get_ree_addr(prem)
-        project_name = str(project_name)
-        tenderee = str(tenderee)
+        def get_role_address(text):
+            '''正则匹配获取招标人地址
+               3:地址直接在招标人后面 招标人:xxx,地址:xxx
+               4:招标、代理一起,两个地址一起 招标人:xxx, 代理人:xxx, 地址:xxx, 地址:xxx.
+            '''
+            p3 = '(招标|采购)(人|单位)(信息:)?(名称)?:[\w()]{4,15},(联系)?地址:(?P<addr>(\w{2,8}[省市州区县][^\w]*)+)'
+            p4 = '(招标|采购)(人|单位)(名称)?:[\w()]{4,15},(招标|采购)?代理(人|机构)(名称)?:[\w()]{4,15},(联系)?地址:(?P<addr>(\w{2,8}[省市州区县][^\w]*)+)'
+            if re.search(p3, text):
+                return re.search(p3, text).group('addr')
+            elif re.search(p4, text):
+                return re.search(p4, text).group('addr')
+            else:
+                return ''
+
+        def get_project_addr(text):
+            p1 = '(项目|建设|工程|服务|交货|送货|收货|)(地址|地点|位置|所在地区?):(\w{2,8}[省市州区县][^\w]*)+'
+            if re.search(p1, text):
+                return re.search(p1, text).group(0)
+            else:
+                return ''
+
+        def get_bid_addr(text):
+            p2 = '(磋商|谈判|开标|投标|评标|(采购|招标)(人|单位)|报名|递交|评审|发售)(地址|地点|所在地区?):(\w{2,8}[省市州区县][^\w]*)+'
+            if re.search(p2, text):
+                return re.search(p2, text).group(0)
+            else:
+                return ''
 
         if '##attachment##' in list_articles[0].content:
             content, attachment = list_articles[0].content.split('##attachment##')
@@ -4346,12 +4374,30 @@ class DistrictPredictor():
         else:
             content = list_articles[0].content
 
+        tenderee, tenderee_address = get_ree_addr(prem)
+        pro_addr = get_project_addr(content)
+        if pro_addr != "":
+            tenderee_address = pro_addr
+        else:
+            role_addr = get_role_address(content)
+            if role_addr != "":
+                tenderee_address = role_addr
+
+        if tenderee_address == "":
+            bid_addr = get_bid_addr(content)
+            if bid_addr != "":
+                tenderee_address = bid_addr
+
+        project_name = str(project_name)
+        tenderee = str(tenderee)
+
+        # print('招标人地址',role_addr, tenderee_address)
+
         project_name = project_name + title if project_name not in title else project_name
         project_name = project_name.replace(tenderee, '')
+
         text1 = "{0} {1} {2}".format(project_name, tenderee, tenderee_address)
-        ser = re.search('项目所在地区?:(\w{2,8}[省市区县])+', content)
-        if ser:
-            text1 = ser.group(0)
+        # print('text1:', text1)
 
         web_source_name = str(web_source_name)  # 修复某些不是字符串类型造成报错
         text1 = re.sub('复合肥|铁路|公路|新会计', ' ', text1)  #预防提取错 合肥 路南 新会 等地区