调用TFidfVectorizer的fit_transform()处理DataFrame列时出现内存错误
解决TFidfVectorizer.fit_transform()处理CSV文本时的内存错误问题
嘿,我刚搞定一个和你几乎一模一样的场景:读取了一份2405行的CSV文件,只提取Year(字符串类型,比如"1995")和cleaned(已经预处理好的字符串列表,举个例子就是["this", "is", "exemplar", "document", "contents"])这两列,结果初始化TFidfVectorizer后调用fit_transform()直接触发了内存错误!不过折腾了一阵后,终于用几个方法解决了,分享给你:
砍特征维度是最直接的办法:默认的
TFidfVectorizer会把所有出现过的词汇都当成特征,要是你的cleaned列里文本特别长、词汇量超大,内存直接就顶不住了。可以给它加几个参数限制:max_features=N:只保留词频前N个的特征,比如设成10000,根据你的数据调整;min_df=M:只保留至少在M个文档里出现过的词,过滤掉那些罕见的冷门词;max_df=0.X:过滤掉在X%以上文档里都出现的通用词,比如max_df=0.8就是去掉在80%文档里都有的词,这些词本来区分度也不高。
分块增量处理也行得通:要是单批次处理扛不住,就把数据切成小块,用
partial_fit()一点点拟合向量器,最后再统一转换。给你个简单的代码示例:from sklearn.feature_extraction.text import TfidfVectorizer import pandas as pd vectorizer = TfidfVectorizer() # 每次处理500行,你可以根据内存情况调整这个数值 chunk_size = 500 # 先分块拟合向量器 for chunk in pd.read_csv('your_data.csv', chunksize=chunk_size): # 注意:TFidfVectorizer默认处理单字符串,所以要把列表转成空格拼接的字符串 texts = chunk['cleaned'].apply(lambda x: ' '.join(x)) vectorizer.partial_fit(texts) # 最后读取全量数据做转换 full_data = pd.read_csv('your_data.csv') full_texts = full_data['cleaned'].apply(lambda x: ' '.join(x)) tfidf_matrix = vectorizer.transform(full_texts)别碰稠密矩阵!:sklearn返回的TF-IDF矩阵是稀疏矩阵,千万别随便用
.toarray()把它转成普通数组,那会瞬间把内存撑爆——稀疏矩阵只存非零值,内存占用小得多,后续的模型(比如SVM、逻辑回归)大多也支持直接用稀疏矩阵输入。临时救急:腾内存:要是你是在本地跑,先把浏览器、视频软件这些占内存的程序全关了;服务器的话就申请点临时资源,先把这个任务跑过去再说。
其实2405行真不算多,大概率是你的cleaned列里单条文本太长,或者默认参数保留了太多冗余特征才导致内存溢出的,上面这些方法应该能帮你解决问题。
内容的提问来源于stack exchange,提问作者Dbercules
相关产品推荐
相关产品推荐

