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

How to serialize a CountVectorizer with a custom tokenize function with joblib

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

AttributeError: module '__main__' has no attribute 'tokenize'

如何"serialize" 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)以这种方式序列化函数:它只记住从中导入函数的路径 - 模块和函数名称。因此,如果您在交互式会话中定义一个函数,则没有地方可以从中导入该函数;一旦进程退出,它就会被销毁。

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