为什么tfidf对象占用这么多空间?

时间:2019-08-06 19:32:09

标签: tf-idf tfidfvectorizer

执行时,我大约有100,000篇长文章,总共约5GB文本

TfidfVectorizer
sklearn的

构造了一个6GB的模型。那怎么可能?难道我们只需要存储那4000个单词的文档频率以及那4000个单词是什么?我猜想TfidfVectorizer为每个文档存储这样的4000维向量。可能以某种方式错误地设置了某些设置吗?

2 个答案:

答案 0 :(得分:1)

TF-IDF矩阵形状为(文档数,唯一字数)。因此,对于每个文档,您都会从数据集中获得每个单词的功能。对于大型数据集,它可能会肿。

在您的情况下 (100000 (docs) * 4000 (words) * 4 (np.float64 bytes))/1024**3 ~ 1.5 Gb

此外,默认情况下,Scipy TfidfVectorizer尝试使用稀疏矩阵(scipy.sparse.csr.csr_matrix)对其进行补偿。即使对于长文档,矩阵也倾向于包含很多零。因此它通常比原始尺寸小一个订单。如果我没错,它应该小于1.5 GB。

这就是问题。您的模型中确实只有4000个单词(由TfidfVectorizer(max_features=4000)控制吗?

如果您不关心单个单词的频率,则可以使用PCA或其他技术来减小矢量大小。

    dense_matrix = tf_idf_matrix.todense()
    components_number = 300
    reduced_data = PCA(n_components=300).fit_transform(dense_matrix)

或者您可以使用诸如doc2vec之类的东西。 https://radimrehurek.com/gensim/models/doc2vec.html

使用它,您将获得形状的矩阵(文档数,嵌入大小)。嵌入大小通常在(100到600)之间。您可以使用dbow_words参数来训练doc2vec模型而无需存储单个单词向量。

如果您关心单个单词的功能,我看到的唯一合理的解决方案是减少单词的数量。

有关stackoverflow的帖子:

----降低二度性

How do i visualize data points of tf-idf vectors for kmeans clustering?

----关于使用发电机训练TFIDF

Sklearn TFIDF on large corpus of documents

How to get tf-idf matrix of a large size corpus, where features are pre-specified?

tf-idf on a somewhat large (65k) amount of text files


模型本身不应占用太多空间。我想有可能只有TfidfVectorizer tokenizerpreprocessor属性中有一些重物。

class Tokenizer: 
        def __init__(self): 
            self.s = np.random.uniform(0,1, size=(10000,10000)) 
        def tokenizer(self, text): 
            text = text.lower().split() 
            return text
    tokenizer = Tokenizer()                                                                                                                                                   
    vectorizer = TfidfVectorizer(tokenizer=tokenizer.tokenizer)
    pickle.dump(vectorizer, open("vectorizer.pcl", "wb"))

腌制后将占据700mb以上。

答案 1 :(得分:1)

我知道有一个答案,但有些其他信息需要考虑。当您直接给TFIDFVectorizer腌制时,您还保存了vectorizer的停用词属性,但这在建立词汇表之后是不必要的。在我们的一个模型中,词汇表中有3000个单词,但保存的模型占用了250MB的空间,因此在检查模型时,我们看到该模型也存储了1000万个停用词。然后我们在TfidfVectorizer

看到了以下警告

“在酸洗时,stop_words_属性会变大并增加模型大小。此属性仅用于自省,可以使用delattr安全删除,或在酸洗前设置为None。”

应用后,我们的模型尺寸大大减小了。