3

i have created a Chatbot using chatterbot and tkinter library. but whenever i open the file it starts the training model and takes a lot of time so for solution i searched and find the pickle module. But now i also tried pickle its not working and shows me error.

is there any way to save the model that will not start training everytime. here is my code

import chatterbot
import pickle
from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
import os
import tkinter as tk
try:
    import ttk as ttk
    import ScrolledText
except ImportError:
    import tkinter.ttk as ttk
    import tkinter.scrolledtext as ScrolledText
import time


class TkinterGUIExample(tk.Tk):

    def __init__(self, *args, **kwargs):
        """
        Create & set window variables.
        """
        tk.Tk.__init__(self, *args, **kwargs)

        self.chatbot = ChatBot(
            "GUI Bot",

            storage_adapter="chatterbot.storage.SQLStorageAdapter",
            logic_adapters=[{
                'import_path': 'chatterbot.logic.BestMatch',
                'default_response': 'I am sorry, but I do not understand.',
                'maximum_similarity_threshold': 0.80
} ]



        )



        for files in os.listdir('C:/Users/HP/Desktop/FYP BOT/training_data/'):
            con=open('C:/Users/HP/Desktop/FYP BOT/training_data/'+files,'r').readlines()
            trainer = ListTrainer(self.chatbot)
            trainer.train(con)
        self.title("Chatterbot")

        self.initialize()

    def initialize(self):
        """
        Set window layout.
        """
        self.grid()

        ttk.Style().configure("TButton", padding=6, relief="flat",background="#ccc")
        style = ttk.Style()
        style.map("C.TButton",
            foreground=[('pressed', 'red'), ('active', 'blue')],
            background=[('pressed', '!disabled', 'black'), ('active', 'white')]
            )


        self.respond = ttk.Button(self, text='Get Response',cursor='hand2' ,command=self.get_response)
        self.respond.grid(column=1, row=2, sticky='nesw', padx=3, pady=10)




        self.usr_input = tk.Entry(self, state='normal',text='Enter your query here!')
        self.usr_input.grid(column=0, row=2, sticky='nesw', padx=1, pady=5)

        #Binding entry
        self.usr_input.bind('<Return>',self.get_response)


        self.conversation_lbl = tk.Label(self,
                                         text='English',
                                         anchor='center',
                                         font=('Arial Bold ',18),
                                         bg="#3a8fc5",
                                         fg="white")
        self.conversation_lbl.grid(column=0, row=0,columnspan=2, padx=3, pady=3,sticky='news')
        self.conversation = ScrolledText.ScrolledText(self,
                                                      state='disabled',borderwidth=5,
                                                      highlightthickness=1,
                                                      bg='#15202b',fg='#16202A',
                                                      font=('Arial Bold',8))

        self.conversation.grid(column=0, row=1, columnspan=2, sticky='nesw', padx=3, pady=3)


    def get_response(self,*args):
        """
        Get a response from the chatbot and display it.
        """
        user_input = self.usr_input.get()
        self.usr_input.delete(0, tk.END)

        response = self.chatbot.get_response(user_input)

        self.conversation['state'] = 'normal'
        '''----------------------------------------------
        self.conversation.tag_configure('tag-left', justify='left')
        self.conversation.insert('end',"Human: " + user_input + "\n", 'tag-left')

        self.conversation.tag_configure('tag-left', justify='right')
        self.conversation.insert('end',"ChatBot: " + str(response.text) + "\n\n\n", 'tag-right')'''

        label1 = tk.Label(self.conversation, 
                          text="Human: \n"+user_input, 
                          background='#3B5566',
                          fg='white',
                          font=("Helvetica", 12),
                          justify='left',
                          wraplength=300,
                          anchor='w',
                          padx=10, pady=5)
        label2 = tk.Label(self.conversation, 
                          text="ChatBot: \n"+str(response.text),
                          wraplength=300,
                          anchor='w',
                          background='#1D9DFC', 
                          fg='white',
                          font=("Helvetica", 12),
                          justify='left',
                          padx=10, pady=5)

        self.conversation.tag_configure('tag-left', justify='left')
        self.conversation.tag_configure('tag-right', justify='right')


        self.conversation.insert('end', '\n\n\n')
        self.conversation.window_create('end', window=label1)

        self.conversation.insert('end', '\n\n\n ', 'tag-right') # space to move Label to the right 
        self.conversation.window_create('end', window=label2)

        '''self.conversation.insert(
            tk.END, "Human: " + user_input + "\n" + "ChatBot: " + str(response.text) + "\n\n\n"
        )'''
        self.conversation['state'] = 'disabled'

        time.sleep(0.2)

gui_example = TkinterGUIExample()
gui_example.attributes('-topmost', True)
gui_example.update()
gui_example.attributes('-topmost', False)
gui_example.geometry('810x550+460+100')
gui_example.resizable(0, 0)
gui_example.configure(background='#3a8fc5')
gui_example.mainloop()

i also created .exi file but that also starts training so is there any way to save this without error and when i call this script in main window this script starts working rather than training etc.

1 Answers1

3

You can try this. It worked for me. When the code is run first time trainer = ChatterBotCorpusTrainer(bot) and trainer.train("static/chatterbot_data.yml") is used to train the bot. It will generate a file database.db in project folder. Once the database file is generated if there is no more change to corpus then comment last two lines of code below to run without retraining.

Code:

## initialize chatter bot
bot = ChatBot(
    'robot',
    storage_adapter='chatterbot.storage.SQLStorageAdapter',
    preprocessors=[
        'chatterbot.preprocessors.clean_whitespace',
    ],
    logic_adapters=[
        {
            'import_path': 'chatterbot.logic.BestMatch',
            'default_response': 'I am sorry, but I do not understand.',
            'maximum_similarity_threshold': 0.90,
            'statement_comparison_function': chatterbot.comparisons.levenshtein_distance,
            'response_selection_method': chatterbot.response_selection.get_first_response
        },
        'chatterbot.logic.MathematicalEvaluation'
    ],
    database_uri='sqlite:///database.db',
    read_only=True
)


## training corpus list
## Disable these two lines below AFTER first run when a *.db file is generated in project directory
trainer = ChatterBotCorpusTrainer(bot)
trainer.train("static/chatterbot_data.yml")
B200011011
  • 3,798
  • 22
  • 33
  • 1
    Thanks a lot, dear it worked for me too. one thing more is there any way to *save conversations* in one text file and unanswered questions in the second file so that i can put their answers later. – Hassan Sheraz Basra Feb 13 '20 at 19:30
  • 1
    I have provided an answer for your question here, https://stackoverflow.com/questions/60024786/how-to-store-chatbots-unanswered-questions-in-a-text-file. – B200011011 Feb 13 '20 at 21:14