sklearn Count vectorizer - 如何在以后保存、加载和使用转换单个文本

Posted

技术标签:

【中文标题】sklearn Count vectorizer - 如何在以后保存、加载和使用转换单个文本【英文标题】:sklearn Count vectorizer - how to save, load and use to transform a single text at a later point 【发布时间】:2021-09-23 13:48:06 【问题描述】:

像往常一样,我正在努力将基本原理概念化。我已经在一个数据集上训练和测试了许多 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))  

我有两个问题:

    如何引入一个需要首先通过计数矢量化器进行转换并在进行预测之前与各种 tfidf 分数连接的测试句子?
如果我 cv.transform([single_sentence]) 并与分数数组连接(1 发送所以一维数组)我得到一个形状不匹配 - 我可以强制重新形状,但我不知道为什么我' d 选择一个特定的形状,或者为什么我一开始就不必这样做。 count_vectorizer 文档矩阵的形状为 (1, 3455) 的分数数组 shape = (3,)。
    如何将其导出以使其可重复使用
在 fit_transform 之后是否要导出 count_vectorizer? - 如果是这样,我如何导入它才能转换一个新句子? (在上面的代码中导出 count_vector - joblib.dump 并再次加载后,我不能立即使用转换 - 我需要 cv 和 count_vector - 它需要是那个特定的还是我实例化一个新的 cv?) 它是我导出的一种估算器吗?我不这么认为,因为它是在 for 循环中按类重新训练的 - 所以我必须再次这样做还是将每个估计器保存在循环中?

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

谁能帮我理解一下?

【问题讨论】:

【参考方案1】:

持久化和重用训练模型的最简单方法是将其保存为一个对象。 scikit-learn 中的Pipeline 允许您将预处理步骤和模型结合到对象中。一旦你创建了你的管道,你可以用你的火车组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'])

【讨论】:

谢谢 - 有一个额外的步骤需要单独执行 - 分数数组的连接:countvectorize > 与分数数组连接 > 分类器的输入 - 有没有办法在这两个步骤之间添加这个?

以上是关于sklearn Count vectorizer - 如何在以后保存、加载和使用转换单个文本的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn 通过句子对文档进行矢量化以进行分类

如何将 sklearn 管道转换为普通代码?

sklearn 中的 countvectorizer 仅适用于英语吗?

参数“mds”在pyLDAvis.sklearn.prepare()函数中的含义是什么?

所有记录的Python sklearn余弦相似度循环

无法编写 Count Vectorizer 词汇表