Как выбрать экземпляр класса, если у класса есть другой экземпляр другого класса? - PullRequest
0 голосов
/ 04 мая 2019

Итак, я пытаюсь создать чат-бота, используя знаменитую библиотеку "chatterbot" в python.Я сделал урок под названием Trainer, который тренирует моего чат-бота.Итак, в этом классе я инициализирую экземпляр для класса «болтун», а затем обучаю его.Так что, чтобы не переучивать его снова и снова, я собираюсь привести пример моего класса для тренеров.Поэтому, если он уже существует, мне не нужно его переобучать, и поэтому я пытаюсь выбрать экземпляр класса Trainer.Я использую библиотеку dill для выбора экземпляра класса, но при попытке выбрать мою модель она выдает следующую ошибку:

_pickle.PicklingError: Can't pickle> 'sqlalchemy.orm.session.Session '>: это не тот же объект, что и >> sqlalchemy.orm.session.Session

Теперь я не вижу нигде в своем коде, который я создаллюбой вид сессии.Но я полагаю, что библиотека chatterbot , которую я использую в своем классе Trainer, должна использовать в ней любой вид сессии.Фактически я проверил исходный код, и он использует регистратор.Так что, возможно, это причиняет боль.Я понятия не имею, как решить эту проблему.Я пытался изменить исходный код библиотеки chatterbot и удалял из нее все вхождения регистратора, но ничего не делал, кроме как сломал код.Может кто-нибудь помочь мне, как решить эту проблему.Я прилагаю необходимый код здесь.

utils :


import logging
from pathlib import Path
import pickle
import dill
import  os
from .trainer import Trainer

# Method returns the directories in which model objects are stored/saved.
def model_base_dir():
    directory = 'MLModel/pickled_models'
    parent_directory = os.pardir
    return os.path.abspath(os.path.join(parent_directory,directory))

def picked_model(base_dir=None):
    if base_dir == None:
        logging.exception("Base Directory does not exist !!!")
        raise AssertionError("Base Directory does not exist !!!")

    model_path = base_dir+'/version1.pickle'
    if Path(model_path).is_file():
        with open(model_path,'rb') as handle:
            model = dill.load(handle)
        return model
    else:
        return None


def save_model(model_obj):
    dir = model_base_dir()    # Get the directory where model needs to be saved
    with open(dir+'/version1.pickle','wb') as f:
        dill.dump(model_obj,f)
        f.close()


def train_model():
    mod_obj = Trainer()
    save_model(mod_obj)
    return mod_obj

Trainer


from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer

class Trainer():

    def __init__(self):
        self.chatbot = ChatBot('Dexter')
        self.create_chatbot_trainer(language="chatterbot.corpus.english")

    def train_chatbot(self,trainer,language):
        return trainer.train(language)

    def create_chatbot_trainer(self,language):
        self.trainer = ChatterBotCorpusTrainer(self.chatbot)
        self.trainer = self.train_chatbot(self.trainer,language)
        return self.trainer

    def __getstate__(self):
        d = self.__dict__.copy()
        d.pop('_parents',None)
        return d

    def response(self,text=""):
        if text is None:
            return "Sorry, your query is empty"
        else:
            return self.chatbot.get_response(text)

Train_model () получает триггер из моего представления django.

Любая помощь приветствуется.

...