You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:20:23