我正在使用SciKit Learn对一个大型数据集(+- 34.000个文件)执行一些分析。现在我在想。HashingVectorizer的目标是低内存使用率。是否可以首先将一堆文件转换为HashingVectorizer对象(使用pickle.dump),然后加载所有这些文件并将其转换为TfIdf功能?这些特征可以从HashingVectorizer中计算出来,因为可以存储计数并推断文档的数量。我现在有以下内容:
for text in texts:
vectorizer = HashingVectorizer(norm=None, non_negative=True)
features = vectorizer.fit_transform([text])
with open(path, 'wb') as handle:
pickle.dump(features, handle)然后,加载文件就很简单了:
data = []
for path in paths:
with open(path, 'rb') as handle:
data.append(pickle.load(handle))
tfidf = TfidfVectorizer()
tfidf.fit_transform(data)但是,奇迹并没有发生。我怎么才能让魔法发生呢?
发布于 2016-01-05 15:37:25
看起来问题是你试图向量化你的文本两次。一旦您构建了计数矩阵,您应该能够使用sklearn.feature_extraction.text.TfidfTransformer而不是TfidfVectorizer将计数转换为tf-idf特征。
此外,您保存的数据似乎是一个稀疏矩阵。您应该使用scipy.sparse.vstack()而不是向TfidfTransformer传递矩阵列表来堆叠加载的矩阵
发布于 2016-01-05 07:00:06
我很担心你的循环
for text in texts:
vectorizer = HashingVectorizer(norm=None, non_negative=True)
features = vectorizer.fit_transform([text])每次重新拟合向量器时,它可能会忘记它的词汇表,因此每个向量中的条目将不会对应于相同的单词(不确定这一点,我猜这取决于它们如何进行散列);为什么不直接将其放在整个语料库中,即
features = vectorizer.fit_transform(texts)对于你的实际问题,听起来你只是想通过IDF来标准化你的data矩阵的列;你应该能够直接在数组上做到这一点(我已经转换成了numpy数组,因为我不知道索引是如何在scipy数组上工作的)。掩码DF != 0是必需的,因为您使用了具有2^20列的散列向量化器:
import numpy as np
X = np.array(features.todense())
DF = (X != 0).sum(axis=0)
X_TFIDF = X[:,DF != 0]/DF[DF != 0]https://stackoverflow.com/questions/34595699
复制相似问题