我正在寻找一种方法来加载我之前使用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)
在不同的脚本中创建。
提前谢谢。
答案 0 :(得分:2)
你的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
的内容,因为您在问题中正确地想知道。这是一个稀疏矩阵,可以使用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
,而您可以使用这些功能来保存/加载变换器,以便对新数据进行矢量化。