首页 > 解决方案 > sklearn Count vectorizer - 如何在以后保存、加载和使用转换单个文本

问题描述

像往常一样,我正在努力将基本原理概念化。我已经在一个数据集上训练和测试了许多 1v1 估计器。训练数据是每个估计器的 count_vectorizer 和句子中所有单词的 tfidf 分数总和(每个估计器用于不同的分类器,每个分类器都有专用的词典)。因此 count_vectorizer 值保持不变,并且将其连接到与每个估计器的给定类相关的分数数组。

下面是一个玩具示例:

cv = CountVectorizer(min_df=2, ngram_range=(1, 3), stop_words=stopwords)
count_vector = cv.fit_transform(series_of_train_texts.tolist())
test_vector = cv.transform(series_of_test_texts.tolist())

df_train_scores = list(zip(df_train['score_1'], df_train['score_2'], 
                     df_train['score_3']
                     ))

training_array = np.array(df_train_list)
test_array = np.array(df_test_list)

X_train = np.hstack([count_vector.todense(), training_array])
X_test = np.hstack([test_vector.todense(),test_array])

svm_var = LinearSVC(tol=1e-5, max_iter=1500)


for class in groups:
    svm_var.fit(X_train, df_train[class].tolist())
    predictions= list(svm_var.predict(X_test))  

我有两个问题:

  1. 如何引入一个需要首先通过计数矢量化器进行转换并在进行预测之前与各种 tfidf 分数连接的测试句子?
  1. 如何导出它以使其可重复使用

我通常的解决方法是 1) 阅读文档;2)谷歌周围; 3)尝试我能想到的一切。当我到达 3 时,这是一个痛苦而漫长的过程,我尝试了我认为可能有效的每一种可能的组合,但却不知道我应该如何思考这个问题。

谁能帮我理解?

标签: pythonscikit-learncountvectorizer

解决方案


持久化和重用训练模型的最简单方法是将其保存为一个对象。Pipeline在 scikit-learn 中,您可以将预处理步骤和模型结合到对象中。一旦你创建了你的管道,你就可以fit()使用你的训练集,然后joblib像这个玩具示例一样使用它来保存它:

import joblib

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC 
from sklearn.pipeline import Pipeline
import pandas as pd


df = pd.DataFrame({
    'A': ['abcde', 'abcde', 'xyz', 'xyz'],
    'B': [0,0,1,1]}
)

X = df['A']
y = df['B']

model = Pipeline([('countVectorizer', CountVectorizer()),
         ('svc', LinearSVC())])

model.fit(X, y)

joblib.dump(model, 'model.joblib')

model2 = joblib.load('model.joblib')
model2.predict(['abde'])

推荐阅读