Python 将提取的向量加载到TfidfVectorizer

Python 将提取的向量加载到TfidfVectorizer,python,machine-learning,scikit-learn,persistence,tf-idf,Python,Machine Learning,Scikit Learn,Persistence,Tf Idf,我正在寻找一种加载以前使用scikit learn的TfidfVectorizer生成的向量的方法。总的来说,我希望更好地理解TfidfVectorizer的数据持久性 例如,到目前为止,我所做的是: vectorizer = TfidfVectorizer(stop_words=stop) vect_train = vectorizer.fit_transform(corpus) 然后我编写了两个函数,以便能够保存和加载我的矢量器: def save_model(model,name):

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

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

vectorizer = TfidfVectorizer(stop_words=stop)
vect_train = vectorizer.fit_transform(corpus)
然后我编写了两个函数,以便能够保存和加载我的矢量器:

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))
我查看了下面这样的帖子,但还是没有弄清楚

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

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

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

当我第一次尝试用joblib保存vect_train时,我得到了4个文件:tfidf.pkl、tfidf.pkl_01.npy、tfidf.pkl_02.npy、tfidf.pkl_03.npy。如果我知道它们到底是什么以及如何将它们加载到

vectorizer = TfidfVectorizer(stop_words=stop)
用不同的脚本创建


提前谢谢。

你的
vect\u train=vectorizer.fit\u transform(语料库)
的结果有两个方面:(i)向量化器适合你的数据,即它学习每个术语的语料库词汇和idf,以及 (ii)
vect\u train
用语料库的向量实例化

您建议的
save_model
load_model
功能将持续并加载矢量器,即它已学习的内部参数,如词汇表和IDF。加载矢量器后,只需使用数据转换列表即可获得矢量。它可以是看不见的数据,也可以是在
fit\u转换过程中使用的原始数据。因此,您只需要:

vectorizer = load_model(name)
vect_train = vectorizer.transform(corpus) # (1) or any unseen data
此时,您已经拥有了保存之前的所有内容,但是转换调用(1)将需要一些时间,具体取决于您的语料库。如果您想跳过此项,还需要保存
vect\u train
的内容,正如您在问题中正确思考的那样。这是一个稀疏矩阵,可以使用scipy保存/加载,例如,您可以在其中找到信息。从该问题复制,要实际保存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\u序列
,而您提供的用于保存/加载变压器的功能则用于对新数据进行矢量化。

为了澄清,您有一个“训练”集,希望将其转换为tf idf向量矩阵。然后您要保存该
mxn
矩阵。稍后,在一个新会话中,您想重新加载该矩阵并使用它计算到查询的余弦距离吗?在写回答之前确保我理解是的,这就是我想要做的!再详细说明一下,我的最终目标是进行一次耗时的培训课程,返回您提到的矩阵,然后通过加载该矩阵,转换一个“看不见”的查询。我不确定是否只要保存向量器,我就可以重新加载它,并使用它初始化一个新实例,使用以前提取的向量。您应该已经准备好了书面答案。保存矢量器并同时保存
vect\u train
。重新加载vect_train,以获得tf idf矩阵。然后重新加载矢量器并使用它将新查询转换为相同的
mxn
空间。从那里,你可以使用任意数量的方法来计算余弦距离/相似性。我将尝试这一点,并希望它能起作用!愚蠢的后续问题:正如我在保存
vect_train
时提到的,我得到了4个文件,即
tfidf.pkl,tfidf.pkl_01.npy,tfidf.pkl_02.npy,tfidf.pkl_03.npy
。当加载回它时,我想我应该使用
tfidf.pkl
,并且每个相关的文件也会被加载,或者我应该找到一种方法将它们全部加载到新的矢量器?干杯只要tdiff.pkl。当要序列化的数据量很大时,它被拆分为多个文件。如果您仍在挣扎,下次保存tf idf矩阵时,请使用
save\u sparse\u csr
将其保存为.npz文件。然后使用
load\u sparse\u csr
将其带回。您仍然可以使用矢量器的保存/加载。