将提取的向量加载到 TfidfVectorizer
Load extracted vectors to TfidfVectorizer
我正在寻找一种方法来加载我之前使用 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?
我最终希望能够进行训练,然后加载这组生成的向量,根据这些向量转换一些新的文本输入,并使用旧向量和生成的新向量执行 cosine_similarity基于它们。
我希望这样做的原因之一是因为在如此大的数据集中进行矢量化大约需要 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_model
和 load_model
函数会保留并加载矢量化器,即它已学习的内部参数,例如词汇表和 idfs。加载矢量化器后,获取矢量所需要做的就是用数据转换列表。它可以是看不见的数据,也可以是您在 fit_transform
期间使用的原始数据。因此,您只需要:
vectorizer = load_model(name)
vect_train = vectorizer.transform(corpus) # (1) or any unseen data
此时,您拥有保存之前的所有内容,但转换调用 (1) 将花费一些时间,具体取决于您的语料库。如果您想跳过此步骤,您还需要保存 vect_train
的内容,正如您在问题中所想的那样。这是一个稀疏矩阵,可以 saved/loaded 使用 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'])
总而言之,上述函数可用于 saving/loading 您的 vec_train
而您为 saving/loading 转换器提供的函数用于向量化新数据。
我正在寻找一种方法来加载我之前使用 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?
我最终希望能够进行训练,然后加载这组生成的向量,根据这些向量转换一些新的文本输入,并使用旧向量和生成的新向量执行 cosine_similarity基于它们。
我希望这样做的原因之一是因为在如此大的数据集中进行矢量化大约需要 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_model
和 load_model
函数会保留并加载矢量化器,即它已学习的内部参数,例如词汇表和 idfs。加载矢量化器后,获取矢量所需要做的就是用数据转换列表。它可以是看不见的数据,也可以是您在 fit_transform
期间使用的原始数据。因此,您只需要:
vectorizer = load_model(name)
vect_train = vectorizer.transform(corpus) # (1) or any unseen data
此时,您拥有保存之前的所有内容,但转换调用 (1) 将花费一些时间,具体取决于您的语料库。如果您想跳过此步骤,您还需要保存 vect_train
的内容,正如您在问题中所想的那样。这是一个稀疏矩阵,可以 saved/loaded 使用 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'])
总而言之,上述函数可用于 saving/loading 您的 vec_train
而您为 saving/loading 转换器提供的函数用于向量化新数据。