question_parser.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. class QuestionParser:
  2. '''构建实体节点'''
  3. def build_entitydict(self, args):
  4. entity_dict = {}
  5. for arg, types in args.items():
  6. for type in types:
  7. if type not in entity_dict:
  8. entity_dict[type] = [arg]
  9. else:
  10. entity_dict[type].append(arg)
  11. return entity_dict
  12. '''解析主函数'''
  13. def parser_main(self, res_classify):
  14. args = res_classify['args'] # 解析问句中的实体
  15. entity_dict = self.build_entitydict(args) # 创建一个实体的字典
  16. question_types = res_classify['question_types'] # 创建意图的字典并将一个问句中的意图放入到res_classify中去
  17. sqls = []
  18. for question_type in question_types:
  19. sql_ = {}
  20. sql_['question_type'] = question_type
  21. sql = []
  22. if question_type == 'query_des': # 故障时间
  23. sql = self.sql_transfer(question_type, entity_dict.get('fault_des'))
  24. elif question_type == 'query_hmc': # 故障时间
  25. sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
  26. elif question_type == 'query_obj': # 故障时间
  27. sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
  28. elif question_type == 'query_x_obj': # 故障时间
  29. sql = self.sql_transfer(question_type, entity_dict.get('fault_x_obj'))
  30. elif question_type == 'query_s_sys': # 故障时间
  31. sql = self.sql_transfer(question_type, entity_dict.get('s_sys'))
  32. elif question_type == 'query_system': # 故障时间
  33. sql = self.sql_transfer(question_type, entity_dict.get('system'))
  34. elif question_type == 'fault_des': # 故障现象
  35. sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
  36. elif question_type == 'fault_excluds': # 故障时间
  37. sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
  38. elif question_type == 'des_excluds': # 故障所属系统
  39. sql = self.sql_transfer(question_type, entity_dict.get('fault_des'))
  40. elif question_type == 'fault_obj': # 专业
  41. sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
  42. elif question_type == 'hmc_system': # 故障产品或部位
  43. sql = self.sql_transfer(question_type, entity_dict.get('fault_hmc'))
  44. elif question_type == 'sys_s_sys': # 故障原因
  45. sql = self.sql_transfer(question_type, entity_dict.get('system'))
  46. elif question_type == 'sys_fault_obj': # 排除方法
  47. sql = self.sql_transfer(question_type, entity_dict.get('s_sys'))
  48. elif question_type == 'fault_obj_sys': # 排除方法
  49. sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
  50. elif question_type == 'fault_obj_fault_x_obj': # 排除方法
  51. sql = self.sql_transfer(question_type, entity_dict.get('fault_obj'))
  52. if sql:
  53. sql_['sql'] = sql
  54. sqls.append(sql_)
  55. return sqls
  56. '''针对不同的问题,分开进行处理'''
  57. def sql_transfer(self, question_type, entities):
  58. if not entities:
  59. return []
  60. # 查询语句
  61. sql = []
  62. # 查询故障的故障现象
  63. if question_type == 'query_des':
  64. 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]
  65. elif question_type == 'query_hmc':
  66. 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]
  67. elif question_type == 'query_obj':
  68. 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]
  69. elif question_type == 'query_x_obj':
  70. 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]
  71. elif question_type == 'query_s_sys':
  72. 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]
  73. elif question_type == 'query_system':
  74. 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]
  75. elif question_type == 'fault_des':
  76. 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]
  77. # MATCH (m:故障名称)-[r:原因]->(n:原因) where m.name = '转速指示器显示与规程规定不符' return m.name, r.name, n.name
  78. # 查询故障的发生时间
  79. elif question_type == 'fault_excluds':
  80. sql = ["MATCH (m:HMC)-[r:维修策略]->(n:维修策略) WHERE m.name = {0} " \
  81. "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]
  82. # 查询故障的所属系统
  83. elif question_type == 'des_excluds':
  84. sql = ["MATCH (m:故障描述)-[r:维修策略]->(n:维修策略) WHERE m.name = '{0}' " \
  85. "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]
  86. elif question_type == 'fault_obj':
  87. 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]
  88. # 查询故障的产品部位
  89. elif question_type == 'hmc_system':
  90. 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]
  91. # 查询故障的故障原因
  92. elif question_type == 'sys_s_sys':
  93. 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]
  94. # 查询故障的解决办法
  95. elif question_type == 'sys_fault_obj':
  96. # sql = ["MATCH (m:故障名称)-[r:排除方法]->(n:排除方法) WHERE m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]
  97. 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]
  98. elif question_type == 'fault_obj_sys':
  99. # sql = ["MATCH (m:故障名称)-[r:排除方法]->(n:排除方法) WHERE m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]
  100. 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]
  101. elif question_type == 'fault_obj_fault_x_obj':
  102. 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]
  103. return sql
  104. # ["MATCH (m:{type:'{0}'})-[r:{type:'{0}'}]->(n:{type:'{0}') return m.name, r.name, n.name".format(i) for i in entities]
  105. if __name__ == '__main__':
  106. handler = QuestionParser()