Python 如何使用joblib的自定义标记化函数序列化CountVectorizer

Python 如何使用joblib的自定义标记化函数序列化CountVectorizer,python,scikit-learn,joblib,Python,Scikit Learn,Joblib,我使用带有自定义标记化方法的CountVectorizer。当我序列化它,然后取消序列化它时,我会收到以下错误消息: AttributeError: module '__main__' has no attribute 'tokenize' 如何“序列化”标记化方法 下面是一个小例子: import nltk from nltk.stem.snowball import FrenchStemmer stemmer = FrenchStemmer() def stem_tokens(token

我使用带有自定义标记化方法的CountVectorizer。当我序列化它,然后取消序列化它时,我会收到以下错误消息:

AttributeError: module '__main__' has no attribute 'tokenize'
如何“序列化”
标记化方法

下面是一个小例子:

import nltk
from nltk.stem.snowball import FrenchStemmer
stemmer = FrenchStemmer()

def stem_tokens(tokens, stemmer):
    stemmed = []
    for item in tokens:
        stemmed.append(stemmer.stem(item))
    return stemmed

def tokenize(text):
    tokens = nltk.word_tokenize(text)
    stems = stem_tokens(tokens, stemmer)
    return stems

tfidf_vec = TfidfVectorizer(tokenizer=tokenize, stop_words=stopwords.words('french'), ngram_range=(1,1))

clf = MLPClassifier(solver='lbfgs', alpha=0.02, hidden_layer_sizes=(400, 50))

pipeline = Pipeline([("tfidf", tfidf_vec),
                ("MLP", clf)])

joblib.dump(pipeline,"../models/classifier.pkl")
joblib(以及它在后台使用的pickle)以这种方式序列化函数:它只记住从-module和函数名导入函数的路径。因此,如果您在交互式会话中定义了一个函数,那么就没有地方可以从中导入该函数;一旦进程退出,它就会被销毁

要使序列化工作,请将此代码放入Python模块(保存到.py文件),并确保在调用
joblib.load
时此模块可用(可导入)