在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合并/合并。有没有更快的方法?