예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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
예제 #7
0
                    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('咨询结束')
예제 #8
0
파일: main.py 프로젝트: MissuQAQ/Medical_KG
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)
예제 #9
0
            ])
        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('咨询结束')