python - 将提取的向量加载到 TfidfVectorizer

标签 python machine-learning scikit-learn persistence tf-idf

我正在寻找一种方法来加载我之前使用 scikit-learn 的 TfidfVectorizer 生成的向量。总的来说,我希望更好地了解 TfidfVectorizer 的数据持久性。

例如,到目前为止我所做的是:

vectorizer = TfidfVectorizer(stop_words=stop)
vect_train = vectorizer.fit_transform(corpus)

然后我编写了 2 个函数以便能够保存和加载我的矢量化器:

def save_model(model,name):
    '''
    Function that enables us to save a trained model

    '''
    joblib.dump(model, '{}.pkl'.format(name)) 


def load_model(name):
    '''
    Function that enables us to load a saved model

    '''
    return joblib.load('{}.pkl'.format(name))

我检查了类似下面的帖子,但我仍然没有明白多少道理。

How do I store a TfidfVectorizer for future use in scikit-learn?

我最终希望能够进行一次培训,然后加载这组生成的向量,根据这些向量转换一些新的文本输入,并使用旧向量和基于它们生成的新向量执行余弦相似度。

我希望这样做的原因之一是,如此大的数据集中的矢量化大约需要 10 分钟,而且我希望只执行一次,而不是每次出现新查询时都执行此操作。

我想我应该保存的是 vect_train 对吧?但是,首先保存它然后将其加载到新创建的 TfidfVectorizer 实例中,哪种方法是正确的?

我第一次尝试用 joblib 保存 vect_train,就像 scikit-learn 中的人们建议的那样,我得到了 4 个文件:tfidf.pkl、tfidf.pkl_01.npy、tfidf.pkl_02.npy、tfidf.pkl_03.npy。如果我知道这些到底是什么以及如何将它们加载到新的实例中,那就太好了

vectorizer = TfidfVectorizer(stop_words=stop)

用不同的脚本创建。

提前谢谢您。

最佳答案

vect_train = vectorizer.fit_transform(corpus) 的结果有两个:(i) 矢量化器适合您的数据,即它学习语料库词汇和每个术语的 idf,并且 (ii) vect_train 使用语料库的向量进行实例化。

您建议的 save_modelload_model 函数会持久化并加载向量化器,即它已学习的内部参数,例如词汇表和 idfs。加载矢量化器后,获取矢量所需要做的就是用数据转换列表。它可以是看不见的数据,也可以是您在 fit_transform 期间使用的原始数据。因此,您需要的是:

vectorizer = load_model(name)
vect_train = vectorizer.transform(corpus) # (1) or any unseen data

此时,您已拥有保存之前的所有内容,但转换调用 (1) 将需要一些时间,具体取决于您的语料库。如果您想跳过此步骤,您还需要保存 vect_train 的内容,因为您在问题中正确地想知道。这是一个稀疏矩阵,可以使用 scipy 保存/加载,您可以在 question 中找到信息例如。从该问题复制,要实际保存您还需要的 csr 矩阵:

def save_sparse_csr(filename,array):
    np.savez(filename,data = array.data ,indices=array.indices,
             indptr =array.indptr, shape=array.shape )

def load_sparse_csr(filename):
    loader = np.load(filename)
    return csr_matrix((  loader['data'], loader['indices'], loader['indptr']),
                         shape = loader['shape'])

总而言之,上述函数可用于保存/加载您的 vec_train,而您提供的函数可用于保存/加载转换器以对新数据进行矢量化。

关于python - 将提取的向量加载到 TfidfVectorizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39568774/

相关文章:

Python scikit-learn : Cannot clone object. .. 因为构造函数似乎没有设置参数

python - Scikit Learn 中的 CountVectorizer

MATLAB。用平均值替换缺失值

java - R中的自定义距离度量,用于聚集聚类

pandas - 如何将 TF_IDF 矢量器与自定义功能相结合

python - 重复索引列表

python - 使用 * 参数从 sklearn 进行子类化的正确方法

python - 从文档中选择多个值

python - 我是否必须验证每个请求的 JWT token ?

python - 什么时候应该直接调用 __method__ ?