Colab中Pickle序列化推荐系统在新文件反序列化时data未定义
问题原因
你的InstaPost.Post方法直接依赖全局作用域的data变量,但pickle序列化类时,不会自动将外部依赖的全局变量一并序列化。新Colab文件中未定义data,调用方法时自然找不到该变量,触发name 'data' is not defined错误。
解决方法
以下是三种可行的修复方案,按实用性排序:
方案1:将data绑定为类实例的属性(推荐)
重构InstaPost类,让它在初始化时接收data并保存为实例属性,这样序列化对象时会自动包含data,无需在新环境单独加载数据集。
修改原文件代码:
import pandas as pd import numpy as np from sklearn.feature_extraction import text from sklearn.metrics.pairwise import cosine_similarity import dill as pickle data = pd.read_csv("/content/instaData.txt") data = data[["Caption", "Hashtags"]] captions = data["Caption"].tolist() uni_tfidf = text.TfidfVectorizer(input=captions, stop_words="english") uni_matrix = uni_tfidf.fit_transform(captions) uni_sim = cosine_similarity(uni_matrix) def recommend_post(x): return ", ".join(data["Caption"].loc[x.argsort()[-7:-1]]) data["Recommended Post"] = [recommend_post(x) for x in uni_sim] # 修改后的InstaPost类 class InstaPost: def __init__(self, data_df): # 将data保存为实例属性 self.data = data_df def Post(self, number): count = 0 # 改用实例属性self.data wordy = self.data["Recommended Post"][number] sentence = wordy.split(',') for i in sentence: count += 1 print(count, " ", i) # 创建实例时传入data obj = InstaPost(data) obj.Post(1) # 序列化实例 pickle_out = open("modelREC", "wb") pickle.dump(obj, pickle_out) pickle_out.close()
新文件反序列化代码:
import dill as pickle pickle_in = open("modelREC", "rb") exe = pickle.load(pickle_in) # 直接调用方法即可 exe.Post(10)
方案2:序列化时同时保存data和类
如果不想修改类结构,可以将data和InstaPost类一起序列化,新环境中先加载data再调用方法。
修改原文件序列化代码:
# 同时序列化data和obj pickle_out = open("modelREC", "wb") pickle.dump((data, obj), pickle_out) pickle_out.close()
新文件反序列化代码:
import dill as pickle import pandas as pd pickle_in = open("modelREC", "rb") # 先加载data和类 data, exe = pickle.load(pickle_in) # 此时全局有data变量,可正常调用方法 exe.Post(10)
方案3:重构Post方法,传入data参数
每次调用Post时手动传入data,彻底消除对全局变量的依赖。
修改原文件类代码:
class InstaPost: def Post(number, data_df): count = 0 wordy = data_df["Recommended Post"][number] sentence = wordy.split(',') for i in sentence: count += 1 print(count, " ", i)
新文件反序列化代码:
import dill as pickle import pandas as pd # 先加载处理后的data(建议提前保存包含Recommended Post列的数据集) data = pd.read_csv("/content/processed_instaData.txt") pickle_in = open("modelREC", "rb") exe = pickle.load(pickle_in) # 调用时传入data exe.Post(10, data)
内容的提问来源于stack exchange,提问作者Dark Light
相关产品推荐
相关产品推荐

