如何用Python 3.6.4读取CountVectorizer生成的CSV稀疏矩阵?
读取CSV中存储的稀疏矩阵(Python 3.6.4)
从你的代码片段来看,你是把CountVectorizer生成的二进制存在型特征向量逐行写入了CSV文件。需要注意的是:CountVectorizer的输出是scipy.sparse.csr_matrix类型的稀疏矩阵,但直接用csv.writer写入时,实际上是把稀疏矩阵转成了密集的数值数组存储(毕竟CSV是密集表格格式)。下面给你两种实用的读取方案:
方案1:用Pandas快速读取并转稀疏矩阵
这是最省心的方式,Pandas可以直接解析CSV,再转换成scipy稀疏矩阵来节省内存(毕竟你的特征是binary类型,大部分值为0,稀疏矩阵能大幅减少内存占用):
import pandas as pd from scipy.sparse import csr_matrix # 读取CSV,注意设置header=None,因为你的文件没有表头 df = pd.read_csv(r'''C:\Users\User\Desktop\csmp3\presence-dataset-training-stemmed.csv''', header=None) # 将DataFrame转换为CSR稀疏矩阵 sparse_matrix = csr_matrix(df.values) # 验证结果:查看矩阵形状和非零元素情况 print(f"稀疏矩阵形状: {sparse_matrix.shape}") print(f"前3行的非零元素总数: {sparse_matrix[:3].nnz}")
方案2:用内置csv模块手动构建稀疏矩阵
如果不想依赖Pandas,用Python自带的csv模块也能实现,步骤是先读取每行数据,再转成numpy数组,最后构建稀疏矩阵:
import csv import numpy as np from scipy.sparse import csr_matrix # 读取所有行数据 feature_rows = [] with open(r'''C:\Users\User\Desktop\csmp3\presence-dataset-training-stemmed.csv''', "r") as csv_file: reader = csv.reader(csv_file, delimiter=',') for row in reader: # 将字符串类型的特征值转为整数(binary特征只有0和1) feature_rows.append([int(val) for val in row]) # 转成密集数组后再构建稀疏矩阵 dense_array = np.array(feature_rows) sparse_matrix = csr_matrix(dense_array) # 打印稀疏矩阵的基本信息 print(sparse_matrix)
额外提示
- 确认你的CSV文件没有表头:从你的写入代码来看,你是直接写的特征向量,没有表头行,所以读取时一定要避免把第一行数据误识别为表头(Pandas方法里的
header=None就是干这个的)。 - 为什么要转稀疏矩阵?因为你的特征字典可能有上千个词,每封邮件的特征向量里大部分是0,用稀疏矩阵存储比密集数组节省几倍甚至几十倍的内存,后续做模型训练(比如朴素贝叶斯、SVM)时也能直接兼容scikit-learn的接口。
内容的提问来源于stack exchange,提问作者Ria Yangzon
相关产品推荐
相关产品推荐

