Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

lsm vor 4 Tagen
Ursprung
Commit
9de21e9aa7

+ 3 - 3
BiddingKG/dl/channel/channel_bert.py

@@ -519,7 +519,7 @@ class_dict = {51: '公告变更',
 tenderee_type = ['公告变更','招标公告','招标预告','招标答疑','资审结果','采购意向']
 win_type = ['中标信息','废标公告','候选人公示','合同公告','开标记录','验收合同']
 
-def merge_channel(list_articles,channel_dic,original_docchannel):
+def merge_channel(list_articles,channel_dic,original_docchannel,web_source_no=""):
 
     def merge_rule(title,text,docchannel,pred_channel,channel_dic,original_docchannel):
         front_text_len = len(text)//3 if len(text)>300 else 100
@@ -601,8 +601,8 @@ def merge_channel(list_articles,channel_dic,original_docchannel):
             channel_dic['docchannel']['docchannel'] = pred
             channel_dic['docchannel']['use_original_docchannel'] = 0
 
-    # '招标预告'类 规则纠正
-    if channel_dic['docchannel']['doctype']=='采招数据' and channel_dic['docchannel']['docchannel']=="招标公告":
+    # '招标预告'类 规则纠正,规则排除部分站源
+    if channel_dic['docchannel']['doctype']=='采招数据' and channel_dic['docchannel']['docchannel']=="招标公告" and web_source_no not in ['DX000027-1']:
         if "##attachment##" in text:
             main_text, attachment_text = text.split("##attachment##", maxsplit=1)
         else:

+ 5 - 0
BiddingKG/dl/entityLink/entityLink.py

@@ -13,6 +13,7 @@ from BiddingKG.dl.common.Utils import *
 from BiddingKG.dl.interface.Entitys import *
 import json
 from BiddingKG.dl.common.constDict import ConstDict
+# from BiddingKG.dl.interface.classification_process import entity_classify_process
 
 def edit_distance(source,target):
     dp = [["" for i in range(len(source)+1)] for j in range(len(target)+1)]
@@ -324,6 +325,10 @@ def get_nlp_enterprise(list_entity):
             else:
                 if entity.entity_text not in nlp_enterprise_attachment:
                     nlp_enterprise_attachment.append(entity.entity_text)
+    # for enterprise,value in dict_enterprise.items():
+    #     enterprise_class = entity_classify_process(enterprise)
+    #     _class = [{"first_level":key.split("-")[0],"second_level":key.split("-")[1]} for key in enterprise_class]
+    #     value['class'] = _class
     return nlp_enterprise[:max_num],nlp_enterprise_attachment[:max_num], dict_enterprise
 
 ENTERPRISE_HUGE = None

+ 17 - 13
BiddingKG/dl/interface/extract.py

@@ -465,7 +465,7 @@ def predict(doc_id,text,title="",page_time="",web_source_no='',web_source_name="
     else:
         channel_dic, msc = predictor.getPredictor("channel").final_change(channel_dic, prem[0], original_docchannel, msc)
     # print('msc', msc)
-    channel_dic = merge_channel(list_articles,channel_dic,original_docchannel) # channel_dic 根据新模型预测结合判断,整合结果
+    channel_dic = merge_channel(list_articles,channel_dic,original_docchannel,web_source_no) # channel_dic 根据新模型预测结合判断,整合结果
     cost_time["rule_channel2"] = round(time.time()-start_time,2)
 
     '''一包多中标人提取及所有金额提取'''
@@ -501,18 +501,6 @@ def predict(doc_id,text,title="",page_time="",web_source_no='',web_source_name="
     '''根据数据源最后召回招标人角色'''
     prem = predictor.getPredictor('websource_tenderee').get_websource_tenderee(doc_id, web_source_no, web_source_name, prem)
 
-    '''根据关键词表生成项目标签'''
-    project_label = predictor.getPredictor('project_label').predict(title,product=','.join(product_list),project_name=codeName[0]['name'],prem=prem)
-    # 额外需求的标签
-    project_label = predictor.getPredictor('project_label').predict_other(project_label,industry,title,codeName[0]['name'],','.join(product_list),list_articles)
-    # print(project_label)
-
-    '''行业关键词标签'''
-    industry_label = predictor.getPredictor('industry_label').predict(title,list_articles[0],product=','.join(product_list),prem=prem)
-
-    '''产权分类二级标签'''
-    property_label = predictor.getPredictor('property_label').predict(title, product=','.join(product_list),project_name=codeName[0]['name'], prem=prem,channel_dic=channel_dic)
-
     '''最终验证prem'''
     getAttributes.confirm_prem(doc_id, prem[0]['prem'], channel_dic, list_articles[0].content, deposit_project, prem[0]['total_tendereeMoney'])
 
@@ -576,6 +564,21 @@ def predict(doc_id,text,title="",page_time="",web_source_no='',web_source_name="
         if isinstance(d['product'], str) and d['product'] not in data_res['product']:
             data_res['product'].append(d['product'])
 
+    # 标签生成,使用data_res['product']更新后的字段
+    '''根据关键词表生成项目标签'''
+    project_label, main_content_text = predictor.getPredictor('project_label').predict(title,product=','.join(data_res['product']),
+                                                             project_name=codeName[0]['name'],prem=prem,all_text=list_articles[0].content)
+    # 额外需求的标签
+    project_label = predictor.getPredictor('project_label').predict_other(project_label, industry, title,codeName[0]['name'],
+                                                                          ','.join(data_res['product']),list_articles)
+
+    '''行业关键词标签'''
+    industry_label = predictor.getPredictor('industry_label').predict(title, list_articles[0],product=','.join(data_res['product']), prem=prem)
+
+    '''产权分类二级标签'''
+    property_label = predictor.getPredictor('property_label').predict(title, product=','.join(data_res['product']),project_name=codeName[0]['name'],
+                                                                      prem=prem,channel_dic=channel_dic)
+
     '''最终检查修正招标、中标金额'''
     getAttributes.limit_maximum_amount(data_res, list_entitys[0])
 
@@ -584,6 +587,7 @@ def predict(doc_id,text,title="",page_time="",web_source_no='',web_source_name="
         getAttributes.demand_to_prem(data_res.get('demand_info', {}), prem[0]['prem'])
 
     data_res["project_label"] = project_label
+    data_res["main_content_text"] = main_content_text
     data_res["industry_label"] = industry_label
     data_res["property_label"] = property_label
     data_res["doctitle_refine"] = doctitle_refine

+ 29 - 22
BiddingKG/dl/interface/getAttributes.py

@@ -1292,11 +1292,18 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
     agency_phone = set()
     winter_contact = set()
     rule_winter_phone = set()
+    tenderee_entity_set = set()
+    agency_entity_set = set()
     for _person in person_list:
         if _person.label == 1:
             tenderee_contact.add(_person.entity_text)
         if _person.label == 2:
             agency_contact.add(_person.entity_text)
+    for _entity in [entity for entity in list_entity if entity.entity_type in ['company','org']]:
+        if _entity.label==0:
+            tenderee_entity_set.add(_entity.entity_text)
+        elif _entity.label==1:
+            agency_entity_set.add(_entity.entity_text)
     # 正则匹配无 '主体/联系人' 的电话
     # 例:"采购人联系方式:0833-5226788,"
     phone_pattern = '(1[3-9][0-9][-—-―]?\d{4}[-—-―]?\d{4}|' \
@@ -1653,7 +1660,7 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                             # print('not_win_tenderer_contact1')
                             continue
                         # 角色为招标/代理人,排除"纪检|监察"相关的联系人
-                        if _subject.label in [0,1] and re.search("纪检|监察|乙方|中标",list_sentence[_object.sentence_index].sentence_text[max(0,_object.wordOffset_begin - 10):_object.wordOffset_begin]):
+                        if (_subject.label in [0,1] or _subject.entity_text in tenderee_entity_set|agency_entity_set) and re.search("纪检|监察|投诉|监督|乙方|中标",list_sentence[_object.sentence_index].sentence_text[max(0,_object.wordOffset_begin - 10):_object.wordOffset_begin]):
                         # if _subject.label in [0,1] and re.search("纪检|监察|乙方|中标",list_sentence[_object.sentence_index].sentence_text[_subject.end_index:_object.wordOffset_begin]):
                             continue
                         if _object.sentence_index!=0 and _object.wordOffset_begin<=10:
@@ -2041,7 +2048,7 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                                 "联系人|联系方式|电话|负责人|经理|法人|法定代表人", list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
                             continue
                         # 角色为招标/代理人,排除"纪检|监察"相关的联系人
-                        if entity.label in [0, 1] and re.search("纪检|监察|乙方|中标", list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
+                        if (entity.label in [0,1] or entity.entity_text in tenderee_entity_set|agency_entity_set) and re.search("纪检|监察|投诉|监督|乙方|中标", list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
                             break
                         if after_entity.sentence_index != 0 and after_entity.wordOffset_begin <= 10:
                             if entity.label in [2, 3, 4] and re.search("请.{0,5}联系",list_sentence[after_entity.sentence_index - 1].sentence_text[-10:] +
@@ -2070,7 +2077,7 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                                 max(0, previous_entity.wordOffset_begin - 10):previous_entity.wordOffset_begin]):
                             continue
                         # 角色为招标/代理人,排除"纪检|监察"相关的联系人
-                        if entity.label in [0, 1] and re.search("纪检|监察|乙方|中标", list_sentence[previous_entity.sentence_index].sentence_text[
+                        if (entity.label in [0,1] or entity.entity_text in tenderee_entity_set|agency_entity_set) and re.search("纪检|监察|投诉|监督|乙方|中标", list_sentence[previous_entity.sentence_index].sentence_text[
                                                                                max(0,previous_entity.wordOffset_begin - 10):previous_entity.wordOffset_begin]):
                             break
                         if previous_entity.sentence_index == entity.sentence_index:
@@ -2219,7 +2226,7 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                                 if entity.label in [2, 3, 4] and not after_entity.person_phone and not re.search("联系人|联系方式|电话|负责人|经理|法人|法定代表人",list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
                                     continue
                                 # 角色为招标/代理人,排除"纪检|监察"相关的联系人
-                                if entity.label in [0,1] and re.search("纪检|监察|乙方|中标",list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
+                                if (entity.label in [0,1] or entity.entity_text in tenderee_entity_set|agency_entity_set) and re.search("纪检|监察|投诉|监督|乙方|中标",list_sentence[after_entity.sentence_index].sentence_text[max(0,after_entity.wordOffset_begin - 10):after_entity.wordOffset_begin]):
                                     break
                                 if after_entity.sentence_index != 0 and after_entity.wordOffset_begin <= 10:
                                     if entity.label in [2, 3, 4] and re.search("请.{0,5}联系",
@@ -2395,7 +2402,7 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                                             list_sentence[previous_entity.sentence_index].sentence_text[max(0,previous_entity.wordOffset_begin - 10):previous_entity.wordOffset_begin]):
                                         continue
                                     # 角色为招标/代理人,排除"纪检|监察"相关的联系人
-                                    if entity.label in [0, 1] and re.search("纪检|监察|乙方|中标", list_sentence[previous_entity.sentence_index].sentence_text[
+                                    if (entity.label in [0,1] or entity.entity_text in tenderee_entity_set|agency_entity_set) and re.search("纪检|监察|投诉|监督|乙方|中标", list_sentence[previous_entity.sentence_index].sentence_text[
                                                                                            max(0,previous_entity.wordOffset_begin - 10):previous_entity.wordOffset_begin]):
                                         break
                                     if previous_entity.sentence_index == entity.sentence_index:
@@ -3163,23 +3170,23 @@ def findAttributeAfterEntity(PackDict,roleSet,PackageList,PackageSet,list_senten
                                             tenderee_agency_role[0].linklist.append(("", sentence_phone[0]))
                                             get_contacts = True
                                             break
-                    if not get_contacts:
-                        # 直接取文中倒数第一个联系人
-                        for _entity in temporary_list2[::-1]:
-                            if _entity.entity_type=='person' and _entity.label==3:
-                                if _entity.person_phone:
-                                    _phone = [p.entity_text for p in _entity.person_phone]
-                                    for _p in _phone:
-                                        if _entity.entity_text not in exist_person and _p not in ",".join(exist_phone):
-                                            tenderee_agency_role[0].linklist.append((_entity.entity_text, _p))
-                                            get_contacts = True
-                                    break
-                    if not get_contacts:
-                        # 如果文中只有一个“phone”实体,则直接取为联系人电话
-                        if len(phone_entitys) == 1:
-                            if phone_entitys[0].entity_text not in ",".join(exist_phone):
-                                tenderee_agency_role[0].linklist.append(("", phone_entitys[0].entity_text))
-                                get_contacts = True
+                    # if not get_contacts: # 会召回错误数据,不启用规则
+                    #     # 直接取文中倒数第一个联系人
+                    #     for _entity in temporary_list2[::-1]:
+                    #         if _entity.entity_type=='person' and _entity.label==3:
+                    #             if _entity.person_phone:
+                    #                 _phone = [p.entity_text for p in _entity.person_phone]
+                    #                 for _p in _phone:
+                    #                     if _entity.entity_text not in exist_person and _p not in ",".join(exist_phone):
+                    #                         tenderee_agency_role[0].linklist.append((_entity.entity_text, _p))
+                    #                         get_contacts = True
+                    #                 break
+                    # if not get_contacts: # 会召回错误数据,不启用规则
+                    #     # 如果文中只有一个“phone”实体,则直接取为联系人电话
+                    #     if len(phone_entitys) == 1:
+                    #         if phone_entitys[0].entity_text not in ",".join(exist_phone):
+                    #             tenderee_agency_role[0].linklist.append(("", phone_entitys[0].entity_text))
+                    #             get_contacts = True
                     if not get_contacts:
                         # 通过大纲Outline类直接取电话
                         if len(new_split_list) > 1:

+ 94 - 3
BiddingKG/dl/interface/predictor.py

@@ -5089,7 +5089,59 @@ class ProjectLabel():
                 key_word_list.append((key_wrod, key_wrod2, search_type, info_type_list))
         return key_word_list
 
-    def predict(self, doctitle,product,project_name,prem):
+    def extract_core_text(self,all_text,tenderee="",agency=""):
+        # 剔除 招标单位、代理机构名称
+        if tenderee:
+            all_text = all_text.replace(tenderee, " ")
+        if agency:
+            all_text = all_text.replace(agency, " ")
+        # 定义需要匹配的关键词列表
+        keywords = [
+            '项目名称', '工程名称', '采购名称', '标段名称', '项目的名称', '设备名称', '申购主题',
+            '申购单主题', '标的', '商品名称', '二级目录', '招标内容', '项目内容', '商品清单',
+            '标的名称', '采购内容', '集成要求', '概况介绍', '品目分类', '招标范围', '采购范围',
+            '项目采购分', '采购合同', '招标合同','产品名称','服务内容','采购品目名称','货物名称',
+            '采购需求概况','项目概况','招标范围','采购条目名称','物资名称','物料名称','建设规模',
+            '建设内容','采购项目概况','采购包名称','物料描述','商品信息','服务品目','标项名称',
+            '规格描述','采购标的','服务名称','采购单名称','明细信息','申购主题','需求详情'
+        ]
+
+        # 创建正则表达式模式,匹配任意一个关键词
+        pattern = r'(' + '|'.join(re.escape(kw) for kw in keywords) + r')'
+
+        # 查找所有匹配位置
+        matches = list(re.finditer(pattern, all_text))
+
+        if not matches:
+            return ""  # 没有找到关键词
+
+        all_match_text = []
+        for _match in matches:
+
+            start_pos = _match.end()  # 关键词结束位置
+
+            # 提取关键词之后的内容
+            after_text = all_text[start_pos:]
+
+            # 提取最多45个汉字
+            chinese_chars = []
+            count = 0
+            for char in after_text:
+                # 判断是否为汉字 (Unicode范围)
+                if '\u4e00' <= char <= '\u9fff':
+                    count += 1
+                    if count > 45:
+                        break
+                chinese_chars.append(char)
+            chinese_chars = ''.join(chinese_chars).strip()
+            if chinese_chars and chinese_chars not in all_match_text:
+                all_match_text.append(chinese_chars)
+
+        # 将字符列表组合成字符串
+        main_content_text = ','.join(all_match_text).strip()
+        return main_content_text
+
+    def predict(self, doctitle,product,project_name,prem,all_text):
 
         doctitle = doctitle if doctitle else ""
         product = product if product else ""
@@ -5111,8 +5163,11 @@ class ProjectLabel():
             # print('解析prem 获取招标人、代理人出错')
             pass
         sub_project_names = ";".join(sub_project_names)
+        main_content_text = self.extract_core_text(all_text,tenderee,agency)
         # 核心字段:标题+产品词+项目名称+标段名称
-        main_text = ",".join([doctitle, product, project_name, sub_project_names])
+        # main_text = ",".join([doctitle, product, project_name, sub_project_names])
+        # 核心字段:标题+项目名称+产品词+正文定位词后45个字
+        main_text = ",".join([doctitle, project_name, product, main_content_text])
         # 剔除 招标单位、代理机构名称
         if tenderee:
             doctitle = doctitle.replace(tenderee, " ")
@@ -5180,7 +5235,7 @@ class ProjectLabel():
             for item in main_text_labels[10:]:
                 main_text_dict.pop(item[0])
 
-        return {"标题":doctitle_dict,"核心字段":main_text_dict}
+        return {"标题":doctitle_dict,"核心字段":main_text_dict},main_content_text
 
     def predict_other(self,project_label,industry,doctitle,project_name,product,list_articles):
         # doctextcon 取正文内容
@@ -5230,11 +5285,47 @@ class ProjectLabel():
 
         return project_label
 
+
+# from BiddingKG.dl.interface.classification_process import product_classify_process
 # 行业标签
 class IndustryLabel():
 
     def __init__(self):
         self.keyword_list = self.get_label_keywords()
+        pass
+
+    # def predict(self,doctitle,article,product,prem):
+    #     doctitle = doctitle if doctitle else ""
+    #     product = product if product else ""
+    #     product = ",".join(set(product.split(','))) # 产品词去重
+    #     all_text = article.content
+    #     all_text = re.sub('\s+', ' ', all_text)
+    #     tenderee = ""
+    #     agency = ""
+    #     try:
+    #         for k,v in prem[0]['prem'].items():
+    #             for link in v['roleList']:
+    #                 if link['role_name'] == 'tenderee' and tenderee == "":
+    #                     tenderee = link['role_text']
+    #                 if link['role_name'] == 'agency' and agency == "":
+    #                     agency = link['role_text']
+    #     except Exception as e:
+    #         # print('解析prem 获取招标人、代理人出错')
+    #         pass
+    #     # 剔除 招标单位、代理机构名称
+    #     if tenderee:
+    #         doctitle = doctitle.replace(tenderee, " ")
+    #         all_text = all_text.replace(tenderee, " ")
+    #     if agency:
+    #         doctitle = doctitle.replace(agency, " ")
+    #         all_text = all_text.replace(agency, " ")
+    #
+    #     category_1, category_2, category_3, matched_keywords, rule_id = product_classify_process(doctitle, all_text, product)
+    #     print(category_1, category_2, category_3, matched_keywords, rule_id)
+    #     if category_2=="标题排除":
+    #         category_1 = "其他"
+    #         category_2 = ""
+    #     return {"first_level":category_1,"second_level":category_2}
 
     def get_label_keywords(self):
         import csv

+ 87 - 81
BiddingKG/dl/interface/project_label_keywords.csv

@@ -254,7 +254,7 @@
 服装,羊绒衫,,洗涤、租赁、设计
 服装,休闲服,,洗涤、租赁、设计
 服装,男装,,洗涤、租赁、设计
-校服,校服,,洗涤、租赁、设计
+校服,校服,校服检测服务,洗涤、租赁、设计
 校服,学生校服,,洗涤、租赁、设计
 校服,学士服,,洗涤、租赁、设计
 校服,学生装,,洗涤、租赁、设计
@@ -7359,15 +7359,13 @@
 物业,物业采购,,
 物业,物业业务,,
 物业,物业合同,,
-物业,后勤服务,,
-物业,后勤保障,,
+物业,后勤服务,后勤服务部、后勤服务科、后勤服务楼、后勤服务中心、后勤服务保障部、,
+物业,后勤保障,后勤保障部、后勤保证科,
 物业,后勤社会化,,
-保安服务,保安,,
+保安服务,保安,保安室、保安镇、保安中学、保安过滤器、保安沼地区,
 保安服务,安保服务,,
-保安服务,门卫,,
 保安服务,安保巡查,,
 保安服务,城管巡查,,
-保安服务,巡逻,,
 保安服务,护卫服务,,
 保安服务,门卫服务,,
 保安服务,保安安全服务,,
@@ -7390,6 +7388,7 @@
 保安服务,安保人员,,
 保安服务,安保劳务派遣,,
 保安服务,雇佣保安,,
+保安服务,巡逻服务,,
 保洁服务,保洁服务,,
 保洁服务,保洁采购,,
 保洁服务,保洁外包,,
@@ -9686,81 +9685,82 @@
 知识产权,专利诉讼,,
 知识产权,专利撰写,,
 知识产权,商标咨询,,
-展览会,展览会,,
-展览会,展会,,
-展览会,展览服务,,
-展览会,物流展,,
-展览会,文体展,,
-展览会,保险展,,
-展览会,行业展会,,
-展览会,摩托展,,
-展览会,礼品展,,
-展览会,皮革展,,
-展览会,家电展,,
-展览会,纸业展,,
-展览会,运输展,,
-展览会,工艺品展,,
-展览会,防护展,,
-展览会,信息展,,
-展览会,出版展,,
-展览会,五金展,,
-展览会,酒店展,,
-展览会,综合类展会,,
-展览会,代理展,,
-展览会,公共展,,
-展览会,建材展,,
-展览会,医药展,,
-展览会,工业展,,
-展览会,食品展,,
-展览会,能源展,,
-展览会,办公展,,
-展览会,网络展,,
-展览会,生物展,,
-展览会,体育展,,
-展览会,日用品展,,
-展览会,农业展,,
-展览会,航天展,,
-展览会,化妆品展,,
-展览会,电子展,,
-展览会,纺织展,,
-展览会,海洋展,,
-展览会,印刷展,,
-展览会,金融展,,
-展览会,饰品展,,
-展览会,安全展,,
-展览会,通讯展,,
-展览会,传媒展,,
-展览会,机械展,,
-展览会,广告展,,
-展览会,艺术展,,
-展览会,首饰展,,
-展览会,文物展,,
-展览会,仓储展,,
-展览会,玩具展,,
-展览会,审计展,,
-展览会,汽车展,,
-展览会,配件展,,
-展览会,化工展,,
-展览会,软件展,,
-展览会,旅游展,,
-展览会,娱乐展,,
-展览会,家具展,,
-展览会,饮料展,,
-展览会,航空展,,
-展览会,美容展,,
-展览会,服装展,,
-展览会,餐饮展,,
-展览会,计算机展,,
-展览会,进出口展,,
-展览会,教育展,,
-展览会,建筑展,,
-展览会,保健展,,
-展览会,设备展,,
-展览会,贸易展,,
-展览会,环保展,,
-展览会,包装展,,
-展览会,培训展,,
-展览会,影视展,,
+展览会,展览会,,出租
+展览会,展会,,出租
+展览会,展览服务,,出租
+展览会,物流展,,出租
+展览会,文体展,,出租
+展览会,保险展,,出租
+展览会,行业展会,,出租
+展览会,摩托展,,出租
+展览会,礼品展,,出租
+展览会,皮革展,,出租
+展览会,家电展,,出租
+展览会,纸业展,,出租
+展览会,运输展,,出租
+展览会,工艺品展,,出租
+展览会,防护展,,出租
+展览会,信息展,,出租
+展览会,出版展,,出租
+展览会,五金展,,出租
+展览会,酒店展,,出租
+展览会,综合类展会,,出租
+展览会,代理展,,出租
+展览会,公共展,,出租
+展览会,建材展,,出租
+展览会,医药展,,出租
+展览会,工业展,,出租
+展览会,食品展,,出租
+展览会,能源展,,出租
+展览会,办公展,,出租
+展览会,网络展,,出租
+展览会,生物展,,出租
+展览会,体育展,,出租
+展览会,日用品展,,出租
+展览会,农业展,,出租
+展览会,航天展,,出租
+展览会,化妆品展,,出租
+展览会,电子展,,出租
+展览会,纺织展,,出租
+展览会,海洋展,,出租
+展览会,印刷展,,出租
+展览会,金融展,,出租
+展览会,饰品展,,出租
+展览会,安全展,,出租
+展览会,通讯展,,出租
+展览会,传媒展,,出租
+展览会,机械展,,出租
+展览会,广告展,广告展会,出租
+展览会,艺术展,,出租
+展览会,首饰展,,出租
+展览会,文物展,,出租
+展览会,仓储展,,出租
+展览会,玩具展,,出租
+展览会,审计展,,出租
+展览会,汽车展,,出租
+展览会,配件展,,出租
+展览会,化工展,,出租
+展览会,软件展,,出租
+展览会,旅游展,,出租
+展览会,娱乐展,,出租
+展览会,家具展,,出租
+展览会,饮料展,,出租
+展览会,航空展,,出租
+展览会,美容展,,出租
+展览会,服装展,,出租
+展览会,餐饮展,,出租
+展览会,计算机展,,出租
+展览会,进出口展,,出租
+展览会,教育展,,出租
+展览会,建筑展,,出租
+展览会,保健展,,出租
+展览会,设备展,,出租
+展览会,贸易展,,出租
+展览会,环保展,,出租
+展览会,包装展,,出租
+展览会,培训展,,出租
+展览会,影视展,,出租
+展览会,展会服务,,出租
 印前处理设备,打样机,,租赁、维修、维护、维保、报废、回收、废旧、检测
 印前处理设备,冲版机,,租赁、维修、维护、维保、报废、回收、废旧、检测
 印前处理设备,制版机,,租赁、维修、维护、维保、报废、回收、废旧、检测
@@ -10024,6 +10024,12 @@
 食材配送,食材服务商,,
 食材配送,副食配送,,
 食材配送,食材代采购,,
+食材配送,食材供应,,
+食材配送,餐饮食材,,
+食材配送,蔬菜配送,蔬菜配送中心,
+食材配送,鲜冻货采购,,
+食材配送,食品原材料供应,,
+食材配送,食材采购,,
 环卫,环卫公厕保洁,,
 环卫,环境卫生,,
 环卫,环卫保洁,,