所以我正在尝试使用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 视图中触发。
任何帮助表示赞赏。