コード例 #1
0
 def __init__(self):
     """
     Init for logger Intent engine Corpus
     """
     self.engine = IntentDeterminationEngine()
     self.bot = BotLogger()
     self.cr = BotNextCorpus()
     self.first_time = True
     self.intent = []
     self.train_intent()
コード例 #2
0
ファイル: chat_bot.py プロジェクト: avi0gaur/FbMessengerBot
 def __init__(self):
     """
     Init for logger Intent engine Corpus
     """
     self.engine = IntentDeterminationEngine()
     self.bot = BotLogger()
     self.cr = BotNextCorpus()
     self.first_time = True
     self.intent = []
     self.train_data = {'intent': "", 'user_text': "", 'bot_response': ""}
     self.train_intent()
     self.senti = SentimentIntensityAnalyzer()
コード例 #3
0
from pymongo import MongoClient

from chat_logger import BotLogger

__author__ = 'Sachin Arora'

log = BotLogger()


class state_mdb:
    def __init__(self):

        try:
            client = MongoClient(
                "mongodb://*****:*****@ds027295.mlab.com:27295/chatbot")

            self.db = client.chatbot
        except Exception as ex:
            log.log_error(ex)

    def insert_user_state(self, cr):
        """
        Def to insert data into db with user state
        :param cr:
        :return:
        """
        try:
            self.delete_col()
            self.db.user_state.insert_one(cr)
            print("Inside insert_user_state " + str(cr))
            print('\nInserted data successfully\n')
コード例 #4
0
ファイル: chat_bot.py プロジェクト: avi0gaur/FbMessengerBot
class CrmnextChatBot:
    def __init__(self):
        """
        Init for logger Intent engine Corpus
        """
        self.engine = IntentDeterminationEngine()
        self.bot = BotLogger()
        self.cr = BotNextCorpus()
        self.first_time = True
        self.intent = []
        self.train_data = {'intent': "", 'user_text': "", 'bot_response': ""}
        self.train_intent()
        self.senti = SentimentIntensityAnalyzer()

    def train_intent(self):
        """
        Training intent engine to classify text intent
        :return:
        """
        for k in self.cr.train_intent_list.keys():
            for w in self.cr.train_intent_list[k]:
                self.engine.register_entity(w, k)

        for w in self.cr.train_intent.keys():
            self.intent.append(IntentBuilder(w) \
                    .require(self.cr.train_intent[w]) \
                    .build())
        for obj in self.intent:
            self.engine.register_intent_parser(obj)

    def run_bot(self, conv):
        """
        Thread starts from here.
        :return:
        """
        self.bot.log_debug("Received Json in run_bot: {}".format(conv))
        msg = conv["user_text"]
        isFirst = True if conv["intent_type"] == "" else False

        if self.sent(msg):
            if isFirst:
                try:
                    intent = json.loads(self.intent_parser(msg))
                except Exception:
                    intent = {
                        "intent_type": "",
                        "Card": "",
                        "CardLost": "",
                        "target": "",
                        "confidence": 0.0
                    }
                conv["intent_type"] = intent["intent_type"]
                return self.p_flow(self.cr.chat_data, conv)
            else:
                return self.p_flow(self.cr.chat_data, conv)
        else:
            return self.neg_res(self.cr.chat_data, conv)

    def intent_parser(self, conv):
        """
        Method to get intent of user text.
        :param conv: user data
        :return:
        """
        for intent in self.engine.determine_intent(conv):
            if intent.get('confidence') > 0:
                return json.dumps(intent, indent=4)
            else:
                pass

    def p_flow(self, corpus, ud):
        """
        Method to implement process for user.
        :param corpus: It provides data for chatbot
        :param ud: User related data.
        :return: response
        """
        response = dict(userId="123",
                        user_intent="",
                        response_text="",
                        card_type="",
                        recommendation=[],
                        entities=[],
                        user_stage=0)

        self.bot.log_debug("User Data: {}".format(ud))
        p_data = corpus[ud['intent_type']][ud['user_stage']]
        user_txt = self.clean_text(ud['user_text'])
        if user_txt in p_data.keys():
            response['response_text'] = random.choice(p_data[user_txt])
            response['card_type'] = ""

        elif user_txt in p_data['user_text']:
            print("p_data: >>" + str(p_data))
            response = self.update_res(response, p_data)

        elif user_txt == 'quit':
            q_data = corpus['EXIT'][0]
            response['user_intent'] = q_data['intent_type']
            response['user_stage'] = q_data['user_stage']
            response['response_text'] = random.choice(q_data['response'])
            response['card_type'] = q_data['card_type']

        else:
            self.build_train_cr(ud)
            if 'default_speech' in p_data.keys(
            ) and p_data['default_speech'] is not '':
                response['response_text'] = random.choice(
                    p_data['default_speech'])
            else:
                response[
                    'response_text'] = "Please select below option to move forward"
            response['card_type'] = "#IntentOptions"
            response['user_stage'] = ud['user_stage']
            response['user_intent'] = ud['intent_type']
            if len(p_data['recommendation']) == 0:
                response['recommendation'] = self.cr.all_skills
            else:
                response['recommendation'] = p_data['recommendation']
        print("response: " + str(response))
        return response

    def update_res(self, response, p_data):
        """
        :param response:
        :param p_data:
        :return:
        """
        response['response_text'] = random.choice(p_data['response'])
        response['user_intent'] = p_data['intent_type']
        response['card_type'] = p_data['card_type']
        response['user_stage'] = p_data['user_stage']
        response['entities'] = p_data['entities']

        return response

    def neg_res(self, cr_data, conv):
        """
        Generate response if sentiment is -ve
        :param cr_data:
        :param conv:
        :return:
        """
        neg_data = cr_data["neg_sent"][0]
        return dict(user_intent="",
                    response_text=random.choice(neg_data["response"]),
                    user_stage=0,
                    card_type='',
                    recommendation=[])

    def sent(self, conv):
        """
        Polarity is considered pos if > -0.2 (for tuning our scenario)
        :param conv:
        :return:
        """
        t = TextBlob(conv)
        vs = self.senti.polarity_scores(conv)
        return False if t.polarity < -0.3 else True

    def clean_text(self, statement):
        """
        Remove any consecutive whitespace characters from the statement text.
        """
        return re.sub(r'[^a-zA-Z0-9 ]', r'', statement).rstrip().lower()

    def build_train_cr(self, ud):
        intent = ud['intent_type']
        if intent is not '':
            self.train_data['intent'] = intent
            self.train_data['user_text'] = ud['user_text']
        else:
            self.train_data['intent'] = ""
            self.train_data['user_text'] = ud['user_text']

        with open('train_data.json', 'a') as f:
            json.dump(self.train_data, f, indent=True)


# bot = CrmnextChatBot()
# user_stage = 0
# intent = ''
# print(bot.clean_text("Hi I am #avinash ?  "))
# while True:
#
#     text = input("Enter text: ")
#     reconnect = input('re-connect: ')
#     print(bool(reconnect))
#     data = {'userId': '123', "intent_type":intent, "user_text": text, 'user_name': 'Avinash Gaur',
#             'contactNumber': '89892398128', 'cardCount': 2, 'user_stage': user_stage, 're_connect': bool(reconnect)}
#     print(data)
#     print(user_stage)
#     print(intent)
#     d = bot.run_bot(data)
#     intent = d['user_intent']
#     user_stage = d['user_stage']
#
#
#     print(d)
コード例 #5
0
class CrmnextChatBot:

    def __init__(self):
        """
        Init for logger Intent engine Corpus
        """
        self.engine = IntentDeterminationEngine()
        self.bot = BotLogger()
        self.cr = BotNextCorpus()
        self.first_time = True
        self.intent = []
        self.train_intent()

    def train_intent(self):
        """
        Training intent engine to classify text intent
        :return:
        """
        for k in self.cr.train_intent_list.keys():
            for w in self.cr.train_intent_list[k]:
                self.engine.register_entity(w, k)

        for w in self.cr.train_intent.keys():
            self.intent.append(IntentBuilder(w) \
                    .require(self.cr.train_intent[w]) \
                    .build())
        for obj in self.intent:
            self.engine.register_intent_parser(obj)

    def run_bot(self, conv):
        """
        Thread starts from here.
        :return:
        """
        self.bot.log_debug("Received Json in run_bot: {}".format(conv))
        msg = conv["user_text"]
        isFirst = conv["re_connect"]

        if self.sent(msg):
            if isFirst:
                try:
                    intent = json.loads(self.intent_parser(msg))
                except Exception:
                    intent = {
                            "intent_type": "",
                            "Card": "",
                            "CardLost": "",
                            "target": "",
                            "confidence": 0.0
                            }
                conv["intent_type"] = intent["intent_type"]
                return self.p_flow(self.cr.chat_data, conv)
            else:
                return self.p_flow(self.cr.chat_data, conv)
        else:
            return self.neg_res(self.cr.chat_data, conv)

    def intent_parser(self, conv):
        """
        Method to get intent of user text.
        :param conv: user data
        :return:
        """
        for intent in self.engine.determine_intent(conv):
            if intent.get('confidence') > 0:
                return json.dumps(intent, indent=4)
            else:
                pass

    def p_flow(self, corpus, ud):
        """
        Method to implement process for user.
        :param corpus: It provides data for chatbot
        :param ud: User related data.
        :return: response
        """
        response = dict(type="text", response_text="Sorry Not able to understand", senderId="1234", userintent="")
        self.bot.log_debug("User Data: {}".format(ud))
        p_data = corpus[ud['intent_type']][ud['user_stage']]
        
        if ud['user_text'].lower() in p_data['user_text']:
            response = self.update_res(response, p_data)
        return response

    def update_res(self, response, p_data):
        """
        :param response:
        :param p_data:
        :return:
        """
        response['response_text'] = random.choice(p_data['response'])
        return response

    def neg_res(self, cr_data, conv):
        """
        Generate response if sentiment is -ve
        :param cr_data:
        :param conv:
        :return:
        """
        neg_data = cr_data["neg_sent"][0]
        return dict(userId=conv["userId"], user_intent=neg_data["intent_type"], response_text=random.choice(neg_data["response"]),
                    card_type=neg_data["card_type"],user_stage=0)

    def sent(self, conv):
        """
        Polarity is considered pos if > -0.2 (for tuning our scenario)
        :param conv:
        :return:
        """
        t = TextBlob(conv)
        return True if t.polarity > - 0.2 else False