如果该类具有另一个不同类的实例,该如何腌制一个类实例?

时间:2019-05-04 20:49:10

标签: python pickle dill chatterbot

因此,我尝试使用python中著名的“ chatterbot”库构建一个聊天机器人。我开设了一个名为Trainer的课程,用于训练我的聊天机器人。因此,在此类中,我将初始化“ chatterbot”类的实例,然后对其进行训练。因此,为了避免再三地对其进行培训,尽管我要腌制Trainer类的实例。因此,如果它已经存在,则无需重新培训它,因此,我尝试对Trainer类实例进行腌制。我正在使用莳萝库腌制该类实例,但由于它试图腌制我的模型,因此向我显示以下错误:

  
    

_pickle.PicklingError:无法腌制>'sqlalchemy.orm.session.Session'>:它与>> sqlalchemy.orm.session.Session

不同   

现在,我在代码中的任何地方都看不到我创建了任何类型的会话。但是我相信我在Trainer类中使用的 chatterbot 库必须在其中使用任何类型的会话。实际上,我检查了源代码,它正在使用记录器。因此,可能会造成疼痛。我不知道如何解决这个问题。我尝试更改 chatterbot 库的源代码,并从其中删除了所有记录程序,但是我什么也没做,只是破坏了代码。谁能帮助我解决此问题。我在这里附加所需的代码。

实用程序


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

培训师


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视图中获取触发。

任何帮助表示赞赏。

0 个答案:

没有答案