0

所以我正在尝试使用python中著名的“chatterbot”库构建一个聊天机器人。我开设了一个名为 Trainer 的课程,用于训练我的聊天机器人。因此,在本课程中,我正在为“chatterbot”类初始化实例,然后对其进行训练。因此,为了避免一次又一次地重新训练它,我想腌制我的 Trainer 类的实例。因此,如果它已经存在,我不需要重新训练它,因此我试图腌制 Trainer 类实例。我正在使用 dill 库来腌制类实例,但是当它试图腌制我的模型时,它向我显示以下错误:

_pickle.PicklingError: Can't pickle >'sqlalchemy.orm.session.Session'>: 它与 >>sqlalchemy.orm.session.Session 不是同一个对象

现在,我在我的代码中没有看到我创建了任何类型的会话。但我相信我在 Trainer 课程中使用的聊天机器人库必须在其中使用任何类型的会话。事实上,我检查了源代码,它正在使用记录器。所以这可能是导致疼痛的原因。我不知道如何处理这个问题。我试图更改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 视图中触发。

任何帮助表示赞赏。

4

0 回答 0