![](/img/trans.png)
[英]Reduce Dimension of word-vectors from TFIDFVectorizer / CountVectorizer
[英]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))
我检查了以下类似的帖子,但我仍然没有多大意义。
如何存储TfidfVectorizer以便将来在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_model
和load_model
函数将保留并加载矢量化器,即它已学习的内部参数,例如词汇表和idfs。 加载矢量化程序后,获得矢量所需要做的就是用数据转换列表。 它可以是看不见的数据,也可以是您在fit_transform
期间使用的原始数据。 因此,您只需要:
vectorizer = load_model(name)
vect_train = vectorizer.transform(corpus) # (1) or any unseen data
至此,您已经拥有了保存之前的所有内容,但是转换调用(1)会花费一些时间,具体取决于您的语料库。 如果您想跳过此步骤,还需要保存vect_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_train
而您提供的功能则用于保存/加载转换器,以便对新数据进行矢量化处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.