作nlp的時候,若是用到tf-idf,sklearn中用CountVectorizer與TfidfTransformer兩個類,下面對和兩個類進行講解測試
CountVectorizer與TfidfTransformer在處理訓練數據的時候都用fit_transform方法,在測試集用transform方法。fit包含訓練的意思,表示訓練好了去測試,若是在測試集中也用fit_transform,那顯然致使結果錯誤。
#變量:content_train 訓練集,content_test測試集
vectorizer = CountVectorizer()
tfidftransformer = TfidfTransformer()
#訓練 用fit_transform
count_train=vectorizer.fit_transform(content_train)
tfidf = tfidftransformer.fit_transform(count_train)
#測試
count_test=vectorizer.transform(content_test)
test_tfidf = tfidftransformer.transform(count_test)
測試集的if-idf
test_weight = test_tfidf.toarray()spa
咱們老是須要保存tf-idf的詞典,而後計算測試集的tfidf,這裏要注意sklearn中保存有兩種方法:pickle與joblib。咱們這裏用picklecode
train_content = segmentWord(X_train) test_content = segmentWord(X_test) # replace 必須加,保存訓練集的特徵 vectorizer = CountVectorizer(decode_error="replace") tfidftransformer = TfidfTransformer() # 注意在訓練的時候必須用vectorizer.fit_transform、tfidftransformer.fit_transform # 在預測的時候必須用vectorizer.transform、tfidftransformer.transform vec_train = vectorizer.fit_transform(train_content) tfidf = tfidftransformer.fit_transform(vec_train) # 保存通過fit的vectorizer 與 通過fit的tfidftransformer,預測時使用 feature_path = 'models/feature.pkl' with open(feature_path, 'wb') as fw: pickle.dump(vectorizer.vocabulary_, fw) tfidftransformer_path = 'models/tfidftransformer.pkl' with open(tfidftransformer_path, 'wb') as fw: pickle.dump(tfidftransformer, fw)
注意:vectorizer 與tfidftransformer都要保存,並且只能 fit_transform 以後保存,表示vectorizer 與tfidftransformer已經用訓練集訓練好了。orm
# 加載特徵 feature_path = 'models/feature.pkl' loaded_vec = CountVectorizer(decode_error="replace", vocabulary=pickle.load(open(feature_path, "rb"))) # 加載TfidfTransformer tfidftransformer_path = 'models/tfidftransformer.pkl' tfidftransformer = pickle.load(open(tfidftransformer_path, "rb")) #測試用transform,表示測試數據,爲list test_tfidf = tfidftransformer.transform(loaded_vec.transform(test_content))