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()