123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- class QuestionParser:
- '''构建实体节点'''
- def build_entitydict(self, args):
- entity_dict = {}
- for arg, types in args.items():
- for type in types:
- if type not in entity_dict:
- entity_dict[type] = [arg]
- else:
- entity_dict[type].append(arg)
- return entity_dict
- '''解析主函数'''
- def parser_main(self, res_classify):
- args = res_classify['args'] # 解析问句中的实体
- entity_dict = self.build_entitydict(args) # 创建一个实体的字典
- question_types = res_classify['question_types'] # 创建意图的字典并将一个问句中的意图放入到res_classify中去
- sqls = []
- for question_type in question_types:
- sql_ = {}
- sql_['question_type'] = question_type
- sql = []
- if question_type == 'query_des': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('fault_des'))
- elif question_type == 'query_hmc': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
- elif question_type == 'query_obj': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
- elif question_type == 'query_x_obj': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('fault_x_obj'))
- elif question_type == 'query_s_sys': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('s_sys'))
- elif question_type == 'query_system': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('system'))
- elif question_type == 'fault_des': # 故障现象
- sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
- elif question_type == 'fault_excluds': # 故障时间
- sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
- elif question_type == 'des_excluds': # 故障所属系统
- sql = self.sql_transfer(question_type, entity_dict.get('fault_des'))
- elif question_type == 'fault_obj': # 专业
- sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
- elif question_type == 'hmc_system': # 故障产品或部位
- sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
- elif question_type == 'sys_s_sys': # 故障原因
- sql = self.sql_transfer(question_type, entity_dict.get('system'))
- elif question_type == 'sys_fault_obj': # 排除方法
- sql = self.sql_transfer(question_type, entity_dict.get('s_sys'))
- elif question_type == 'fault_obj_sys': # 排除方法
- sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
- elif question_type == 'fault_obj_fault_x_obj': # 排除方法
- sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
- if sql:
- sql_['sql'] = sql
- sqls.append(sql_)
- return sqls
- '''针对不同的问题,分开进行处理'''
- def sql_transfer(self, question_type, entities):
- if not entities:
- return []
- # 查询语句
- sql = []
- # 查询故障的故障现象
- if question_type == 'query_des':
- sql = ["MATCH (m:故障描述)-[r]->(n) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'query_hmc':
- sql = ["MATCH (m:HMC)-[r]->(n) WHERE m.name = {0} return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'query_obj':
- sql = ["MATCH (m:成品)-[r]->(n) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'query_x_obj':
- sql = ["MATCH (m)-[r]->(n:型号) WHERE n.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'query_s_sys':
- sql = ["MATCH (m:子系统)-[r]->(n) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'query_system':
- sql = ["MATCH (m:系统)-[r]->(n) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'fault_des':
- sql = ["MATCH (m:HMC)-[r:故障描述]->(n:故障描述) WHERE m.name = {0} return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- # MATCH (m:故障名称)-[r:原因]->(n:原因) where m.name = '转速指示器显示与规程规定不符' return m.name, r.name, n.name
- # 查询故障的发生时间
- elif question_type == 'fault_excluds':
- sql = ["MATCH (m:HMC)-[r:维修策略]->(n:维修策略) WHERE m.name = {0} " \
- "OPTIONAL MATCH(a)-[b]->(c) WHERE a.type=n.name return m.name, n.name, r.name, a.name, b.name, c.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- # 查询故障的所属系统
- elif question_type == 'des_excluds':
- sql = ["MATCH (m:故障描述)-[r:维修策略]->(n:维修策略) WHERE m.name = '{0}' " \
- "OPTIONAL MATCH(a)-[b]->(c) WHERE a.type=n.name return m.name, n.name, r.name, a.name, b.name, c.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'fault_obj':
- sql = ["MATCH (m:HMC)-[r:成品]->(n:成品) WHERE m.name = {0} return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- # 查询故障的产品部位
- elif question_type == 'hmc_system':
- sql = ["MATCH (m:HMC)-[r:系统]->(n:系统) WHERE m.name = {0} return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- # 查询故障的故障原因
- elif question_type == 'sys_s_sys':
- sql = ["MATCH (m:系统)-[r:子系统]->(n:子系统) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- # 查询故障的解决办法
- elif question_type == 'sys_fault_obj':
- # sql = ["MATCH (m:故障名称)-[r:排除方法]->(n:排除方法) WHERE m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]
- sql = ["MATCH (m:子系统)-[r:成品]->(n:成品) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- elif question_type == 'fault_obj_sys':
- # sql = ["MATCH (m:故障名称)-[r:排除方法]->(n:排除方法) WHERE m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]
- sql = ["MATCH (n:子系统)-[r:成品]->(m:成品) WHERE m.name = '{0}' return m.name, r.name, n.name, m.doc_id, m.doc_name, m.filePage".format(i) for i in entities]
- elif question_type == 'fault_obj_fault_x_obj':
- sql = ["MATCH (m:成品)-[r:型号]->(n:型号) WHERE m.name = '{0}' return m.name, r.name, n.name, n.doc_id, n.doc_name, n.filePage".format(i) for i in entities]
- return sql
- # ["MATCH (m:{type:'{0}'})-[r:{type:'{0}'}]->(n:{type:'{0}') return m.name, r.name, n.name".format(i) for i in entities]
- if __name__ == '__main__':
- handler = QuestionParser()
|