2012-12-12 18 views
2

我有一個名爲classifier.pkl的醃製文件,我試圖加載到另一個模塊中。但是,我收到一個我不明白的錯誤。如何解讀這個cPickle錯誤?

我的代碼來醃製:

features = ['bob','ice','snowing'] #... shortened for exposition's sake 
def extract_features(document): 
     return {'contains(%s)'% word: (word in set(document)) 
       for word in all_together_word_list} 
training_set = classify.util.apply_features(extract_features,tweets[0]) 
classifier = NaiveBayesClassifier.train(training_set) 
cPcikle.dump(open('cocaine_classifier.pkl','wb')) 

我的代碼unpickle:

features, extract_features, classifier = 
     cPickle.load(open('cocaine_classifier.pkl','rb')) 

我的錯誤:

AttributeError: 'module' object has no attribute 'extract_features' 

前段時間我酸洗三件事情作出.pkl文件:

  • 特點:列表
  • extract_features:功能
  • 分類:NLTK樸素貝葉斯分類器的實例

令人困惑的是,我得到了下面的代碼相同的錯誤:

x = cPickle.load(open('cocaine_classifier.pkl','rb')) 

爲什麼能我有三件事嗎?即使我沒有試圖解開元組?

更新

由於NPE指出被拆封必須在其被拆封到其中的函數完全匹配功能的路徑。我正在調試和終端,所以from mod import *加載到命名空間的一切,而import mod as m沒有。

+4

你可以發佈你用來醃製這些對象的代碼嗎? – Blender

+0

'cocaine_classifier'?我很好奇... – NPE

+1

@NPE:這是一些流行病學研究,真的:http://tox.sinaiem.org/(正在建設中)。 (不試圖做廣告只是說明原因) – mac389

回答

1

問題是,當你醃一個函數時,只會調用該函數的(完全限定的)名稱,而不是函數本身。這意味着當您取消打開時,您必須有適當的功能定義。

您是否有機會醃製結果調用extract_features

+0

不,我需要調用該函數。代碼是我正在解構的意大利麪代碼,我很樂意重寫函數或從實用程序文件中導入它。但是,我必須處理它,因爲我需要醃製文件的其他部分。 – mac389

+0

只要在酸洗過程中使用與「完全限定名稱」相同的'extract_features'功能,您應該可以輕鬆取出。 – NPE

+0

@ mac389:如果您不確定完全限定的名稱是什麼,可能'pickletools.dis'可能會提供幫助:http://docs.python.org/2.6/library/pickletools.html#pickletools.dis – NPE