保存TFIDF词汇表应用于新数据集触发AttributeError如何解决
问题根源
你报错的直接原因是保存的不是训练好的TFIDF向量化器本身,只是它的词汇表字典:
你执行pickle.dump(cvec_tfidf.vocabulary_, ...)时,cvec_tfidf.vocabulary_本身就是存储「词汇-索引」映射的Python字典,加载后的savedtfidf自然也是字典类型,不存在fit_transform这类属于TfidfVectorizer类的方法。
额外需要纠正的使用误区:对于已经在训练集上拟合完成的向量化器,处理新数据时不需要调用任何fit相关方法,直接用transform即可,重新fit会覆盖原有词汇和IDF值,失去之前训练的意义。
正确操作方案
方案1(最推荐):保存完整的训练好的向量化器
直接存储整个拟合完成的cvec_tfidf对象,不需要单独拆分词汇和IDF:
import pickle # 保存向量化器 pickle.dump(cvec_tfidf, open("tfidf_vectorizer.pkl", "wb")) # 加载向量化器 loaded_tfidf = pickle.load(open("tfidf_vectorizer.pkl", "rb")) # 直接用transform处理新文本,不要调用fit/fit_transform newtext_tfidf = loaded_tfidf.transform(text['newtext'])
如果需要转为DataFrame格式,用loaded_tfidf.get_feature_names_out()作为列名即可。
方案2:仅复用已保存的词汇表
如果有特殊需求必须单独存储词汇表,加载后需要重新初始化TfidfVectorizer并指定词汇参数:
# 加载已保存的词汇字典 saved_vocab = pickle.load(open("feature.pkl", "rb")) # 初始化新向量化器,参数和训练时完全一致,额外指定vocabulary参数 new_tfidf = TfidfVectorizer( analyzer="word", tokenizer=nltk.word_tokenize, strip_accents='unicode', min_df = .01, max_df = .99, ngram_range=(1,3), vocabulary=saved_vocab ) # 直接处理新文本 newtext_tfidf = new_tfidf.transform(text['newtext'])
该方案需要自行匹配IDF值,便捷性远低于方案1,非必要不推荐。
内容的提问来源于stack exchange,提问作者Kim S.
相关产品推荐
相关产品推荐

