class CAChatBot: def __init__(self, mode: str = 'cmd'): assert mode in ('cmd', 'notebook', 'web') self.classifier = QuestionClassifier() self.parser = QuestionParser() self.searcher = AnswerSearcher() self.mode = mode print("欢迎与小航对话,请问有什么可以帮助您的?") self.default_answer = '抱歉!小航能力有限,无法回答您这个问题。可以联系开发者哟!' self.goodbye = '小航期待与你的下次见面,拜拜!' def query(self, question: str): try: final_ans = '' # 开始查询 result = self.classifier.classify(question) if result is None or result.is_qt_null(): return self.default_answer result = self.parser.parse(result) answers = self.searcher.search(result) # 合并回答与渲染图表 for answer in answers: final_ans += (answer.to_string().rstrip('。') + '。') if answer.have_charts() and self.mode != 'web': answer.combine_charts() answer.render_chart(result.raw_question) # 依不同模式返回 if self.mode == 'notebook': return final_ans, answers[0].get_chart() # None or chart elif self.mode == 'web': return final_ans, answers[0].get_charts() # chart list else: # default: 'cmd' return final_ans except QuestionError as err: return err.args[0] def run(self): while 1: question = input('[我]: ') if question.lower() == 'q': print(self.goodbye) break answer = self.query(question) print('[小航]: ', answer)
class ChatBot: '''问答类''' def __init__(self): self.classifier = QuestionClassifier() self.parser = QuestionPaser() self.searcher = AnswerSearcher() def chat_answer(self, sent): answer = '才疏学浅,未知如何作答。' res_classify = self.classifier.classify(sent) if not res_classify: return answer res_sql = self.parser.parser_main(res_classify) final_answers = self.searcher.search_main(res_sql) if not final_answers: return answer else: return '\n'.join(final_answers)
class CAChatBot: def __init__(self): self.classifier = QuestionClassifier() self.parser = QuestionParser() self.searcher = AnswerSearcher() self.max_fail_count = 3 # 记录最大失败次数,以便提示帮助 self.count = 0 print("欢迎与小航对话,请问有什么可以帮助您的?") self.default_answer = '抱歉!小航能力有限,无法回答您这个问题。可以联系开发者哟!' self.goodbye = '小航期待与你的下次见面,拜拜!' self.help = "help" def query(self, question: str) -> str: if self.count == self.max_fail_count: self.count = 0 print(self.help) try: result = self.classifier.classify(question) if result is None or result.is_qt_null(): self.count += 1 return self.default_answer result = self.parser.parse(result) # self.searcher.search(sql_result) return 'answer' except QuestionError as err: self.count += 1 return err.args[0] def run(self): while 1: question = input('[我]: ') if question.lower() == 'q': print(self.goodbye) break answer = self.query(question) print('[小航]: ', answer)
def answer(question): classifier_handler = QuestionClassifier() parse_handle = QuestionParse() query_handle = QuestionQuery() data = classifier_handler.classify(question) if not data: print(' 理解不了诶!\n', '你可以这样输入:\n', ' xx保险属于哪个公司\n', ' 人寿保险有哪些种类的保险') answers = ' 理解不了诶!你可以这样输入:xx保险属于哪个公司,人寿保险有哪些种类的保险' else: sql = parse_handle.parse_main(data) # print(sql[0]) answers = query_handle.query_main(sql) print('\n'.join(answers)) user_socket = request.environ.get("wsgi.websocket") answer_msg = { "send_user": '******', "send_msg": answers, } user_socket.send(json.dumps(answer_msg))
if question_type == 'product_range': desc = [i['m.range'] for i in answers] subject = answers[0]['m.name'] final_answer = '{}的保障范围:{}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) #产品主要保障 if question_type == 'product_content': desc = [i['m.content'] for i in answers] subject = answers[0]['m.name'] final_answer = '{}主要保障是:{}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) return final_answer if __name__ == '__main__': classifier_handler = QuestionClassifier() parse_handle = QuestionParse() query_handle = QuestionQuery() while 1: question = input('input an question:') data = classifier_handler.classify(question) #print(data) if not data: print(' 理解不了诶!\n', '你可以这样输入:\n', ' xx保险属于哪个公司\n', ' 人寿保险有哪些种类的保险') else: sql = parse_handle.parse_main(data) #print(sql[0]) answers = query_handle.query_main(sql) print('\n'.join(answers))
class ChatBot(object): def __init__(self, corona_data=None): ''' Parameters ---------- corona_data : class instance The object responsible to mine data from github repositories. The default is None. ''' self.qc = QuestionClassifier() if corona_data == None: self.corona_data = CoronaData() else: self.corona_data = corona_data def reply(self, query: str): ''' Parameters ---------- query : str question or query asked. Returns ------- answer : str or pd.DataFrame returns either one of above based on the query. ''' label = int(self.qc.classify(query)) if label > 0: try: answer = self.qa.answer_query(query, label) except: self.qa = QuestionAnswer(self.qc) answer = self.qa.answer_query(query, label) else: country, cases_type, date = self.get_details(query) answer = self.corona_data.get_specific_data( country, cases_type, date) return answer def get_details(self, query: str): ''' Parameters ---------- query : str question or query corresponding to label 0. Returns ------- country : str country name or 'All' in case name is missing. cases_type : str confirmed or death. We assume confirmed cases if not specified. req_date : datetime date. We assume cumulative data in case date is not mentioned. ''' entities = [ent.text for ent in nlp(query).ents] if 'DATE' in [ent.label_ for ent in nlp(query).ents]: time_entity = [ ent.text for ent in nlp(query).ents if ent.label_ in 'DATE' ][0] if 'yesterday' in entities: req_date = datetime.date.today() - datetime.timedelta(days=1) elif 'today' in entities: req_date = datetime.date.today() else: try: req_date = pd.to_datetime(time_entity) except: req_date = pd.to_datetime(time_entity + '2020') req_date = req_date.strftime("%Y-%m-%d") else: req_date = 'All' if 'GPE' in [ent.label_ for ent in nlp(query).ents]: country = [ ent.text for ent in nlp(query).ents if ent.label_ in 'GPE' ][0] else: country = 'All' if 'death' in query or 'died' in query: cases_type = 'deaths' else: cases_type = 'confirmed' return country, cases_type, req_date
desc = ['暂无相关资料'] subject = answers[0]['m.name'] final_answer = '{0}通常可以通过以下方式检查出来:{1}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) elif question_type == 'check_disease': for i in answers: if i['m.name']: desc.append(i['m.name']) else: desc = ['暂无相关资料'] subject = answers[0]['n.name'] final_answer = '通常可以通过{0}检查出来的疾病有{1}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) return final_answer if __name__ == '__main__': end = False handler = QuestionClassifier(config) while not end: query = input('咨询问题:') data = handler.classify(query) paser = QuestionPaser() sql = paser.parser_main(data) searcher = AnswerSearcher() searcher.search_main(sql) if input('是否结束:') == '是': end = True print('咨询结束')
from searcher import AnswerSearcher from drug_recommend import Drug_Searcher from KG_parameters import params from question_classifier import QuestionClassifier from paser import QuestionPaser #%% if __name__ == '__main__': config = params() handler = QuestionClassifier(config) end = False while not end: query = input('咨询问题:') print('') res_classify = handler.classify(query) paser = QuestionPaser() sql = paser.parser_main(res_classify) searcher = AnswerSearcher() searcher.search_main(sql) print('') print('--------------- 药品推荐 ---------------') print('') d = Drug_Searcher(res_classify) d.search_main() print('') if input('针对该问题是否需要追加提问:') in ['是', '需要']: new_query = input('查询问题:') res_classify = handler.additional_q(new_query) sql = paser.parser_main(res_classify)
]) else: final_answer = '' return final_answer, final_taboo def check_taboo(self, taboo): for entity in self.res_classify.keys(): if entity in taboo: return True else: return False #%% if __name__ == '__main__': config = params() classifier = QuestionClassifier(config) end = False while not end: query = input('咨询问题:') print('=' * 50) print('') res_classify = classifier.classify(query) d = Drug_Searcher(res_classify) d.search_main() if input('是否结束:') == '是': end = True print('=' * 50) print('') print('咨询结束')