首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashingVectorizer上的scikit learn- Tfidf

HashingVectorizer上的scikit learn- Tfidf
EN

Stack Overflow用户
提问于 2016-01-05 00:38:52
回答 2查看 3.7K关注 0票数 3

我正在使用SciKit Learn对一个大型数据集(+- 34.000个文件)执行一些分析。现在我在想。HashingVectorizer的目标是低内存使用率。是否可以首先将一堆文件转换为HashingVectorizer对象(使用pickle.dump),然后加载所有这些文件并将其转换为TfIdf功能?这些特征可以从HashingVectorizer中计算出来,因为可以存储计数并推断文档的数量。我现在有以下内容:

代码语言:javascript
复制
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)

然后,加载文件就很简单了:

代码语言:javascript
复制
data = []
for path in paths:
    with open(path, 'rb') as handle:
        data.append(pickle.load(handle))
tfidf = TfidfVectorizer()
tfidf.fit_transform(data)

但是,奇迹并没有发生。我怎么才能让魔法发生呢?

EN

回答 2

Stack Overflow用户

发布于 2016-01-05 15:37:25

看起来问题是你试图向量化你的文本两次。一旦您构建了计数矩阵,您应该能够使用sklearn.feature_extraction.text.TfidfTransformer而不是TfidfVectorizer将计数转换为tf-idf特征。

此外,您保存的数据似乎是一个稀疏矩阵。您应该使用scipy.sparse.vstack()而不是向TfidfTransformer传递矩阵列表来堆叠加载的矩阵

票数 5
EN

Stack Overflow用户

发布于 2016-01-05 07:00:06

我很担心你的循环

代码语言:javascript
复制
for text in texts:
    vectorizer = HashingVectorizer(norm=None, non_negative=True)
    features = vectorizer.fit_transform([text])

每次重新拟合向量器时,它可能会忘记它的词汇表,因此每个向量中的条目将不会对应于相同的单词(不确定这一点,我猜这取决于它们如何进行散列);为什么不直接将其放在整个语料库中,即

代码语言:javascript
复制
    features = vectorizer.fit_transform(texts)

对于你的实际问题,听起来你只是想通过IDF来标准化你的data矩阵的列;你应该能够直接在数组上做到这一点(我已经转换成了numpy数组,因为我不知道索引是如何在scipy数组上工作的)。掩码DF != 0是必需的,因为您使用了具有2^20列的散列向量化器:

代码语言:javascript
复制
import numpy as np
X = np.array(features.todense())
DF = (X != 0).sum(axis=0)
X_TFIDF = X[:,DF != 0]/DF[DF != 0]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34595699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档