如何使用joblib序列化具有自定义分词函数的CountVectorizer

3

我使用一个自定义分词方法的CountVectorizer。当我序列化它,然后再反序列化它时,我会得到以下错误信息:

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

我该如何“序列化”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")
1个回答

2

joblib(以及它在内部使用的pickle)是这样序列化函数的:它只记住从哪里导入函数的路径-模块和函数名称。因此,如果您在交互式会话中定义一个函数,就没有地方可以从那里导入这个函数;它将在进程退出时被销毁。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接