将SciPy CSR矩阵转换为Pandas SparseDataFrame太慢

时间:2018-08-02 01:54:55

标签: python pandas scipy sparse-matrix sparse-dataframe

在Pandas DataFrame中,我的词汇量约为50,000个,语料库约为20,000个,

import pandas as pd
vocab = {"movie", "good", "very"}
corpus = pd.DataFrame({
    "ID": [100, 200, 300],
    "Text": ["It's a good movie", "Wow it's very good", "Bad movie"]
})

以下代码仅在大约5秒钟内即可生成SciPy CSR矩阵:

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer(use_idf = False, ngram_range = (1, 2),
                      vocabulary = vocab)
vec.transform(corpus["Text"])

但是,将CSR矩阵转换为Pandas SparseDataFrame太慢,以至于我不得不中止它:

dtm = pd.SparseDataFrame(vec.transform(corpus["Text"]))
dtm["ID"] = corpus["ID"]

尝试的解决方案

我尝试将.tocoo()附加到vec.transform(corpus["Text"]),但速度没有差别。附加.toarray()也不行,因为它返回

  

ValueError:数组太大; arr.size * arr.dtype.itemsize大于最大可能大小

我也按照stackoverflow.com/q/17818783的建议尝试了SparseSeries,但它导致了MemoryError:

tfidf = vec.transform(corpus["Text"])
dtm = pd.SparseDataFrame( [pd.SparseSeries(tfidf[k].toarray().ravel())
                           for k in range(tfidf.shape[0])] )

无法通过将列表理解更改为生成器表达式来解决MemoryError,因为后者返回UnboundLocalError: local variable 'mgr' referenced before assignment

我需要一个SparseDataFrame,因为我想将ID列与另一个DataFrame合并/合并。有没有更快的方法?

0 个答案:

没有答案