Python 使用sklearn TF-IDF矢量器进行文本转换会生成过大的csv文件
我有1000个文本,每个文本有200-1000个单词。文本csv文件的大小约为10 MB。当我用这段代码对它们进行矢量化时,输出CSV的大小异常大(2.5 GB)。我不确定我做错了什么。非常感谢你的帮助。代码:Python 使用sklearn TF-IDF矢量器进行文本转换会生成过大的csv文件,python,csv,scikit-learn,text-processing,tf-idf,Python,Csv,Scikit Learn,Text Processing,Tf Idf,我有1000个文本,每个文本有200-1000个单词。文本csv文件的大小约为10 MB。当我用这段代码对它们进行矢量化时,输出CSV的大小异常大(2.5 GB)。我不确定我做错了什么。非常感谢你的帮助。代码: import numpy as np import pandas as pd from copy import deepcopy import glob from sklearn.feature_extraction.text import TfidfVectorizer from nu
import numpy as np
import pandas as pd
from copy import deepcopy
import glob
from sklearn.feature_extraction.text import TfidfVectorizer
from numpy import savetxt
df = pd.read_csv('data.csv')
#data has two columns: teks and groups
filtered_df = deepcopy(df)
vectorizer = TfidfVectorizer()
vectorizer.fit(filtered_df["teks"])
vector = vectorizer.transform(filtered_df["teks"])
print(vector.shape) # shape (1000, 83000)
savetxt('dataVectorized1.csv', vector.toarray(), delimiter=',')
稀疏矩阵(如此处的向量
)不应转换为密集矩阵(如使用.toarray()
)并保存为CSV文件;这样做毫无意义,而且会使稀疏矩阵本身的整个概念失效。有鉴于此,这么大的尺寸并不令人惊讶
<>你应该认真考虑将你的稀疏<代码>矢量< /代码>保存到适当的格式,例如使用:
有关其他可能的选项,请参见
如果出于任何原因,您必须坚持使用CSV文件进行存储,您可以尝试通过在文件名中使用.gz
扩展名来压缩输出文件;从np.savetxt()
:
如果文件名以.gz
结尾,则该文件将自动以压缩的gzip格式保存loadtxt
透明地理解gzip文件
因此,这应该起到作用:
np.savetxt('dataVectorized1.csv.gz', vector.toarray(), delimiter=',')
然而,我并不真的建议这样做;请记住:
.npz
文件不能用作进一步下游任务(如分类、可视化和聚类)的输入,这绝对是没有原因的;相反,在类似情况下,使用它是非常合理的,并建议使用在您的两行之后(我不太确定):#方式一:“arr=datavectoried.npz”“arr.tofile('datavectoried.csv',sep=',')”)。#方式二:“arr=np.read(datavectoried.npz)“#将数组转换为数据帧”DF=pd.dataframe(arr)“#将数据框另存为csv文件'DF.to_csv(“dataVetorized.csv”)”@tursunWali不知道您在这里想说什么,也不知道您为什么坚持另存为csv(这不是一个好主意,甚至是必要的);最好省去代码(它在注释中看起来从来都不好)并进行解释?是的,我想保存在CSV文件中。我想将CSV作为其他过程的输入,如分类、聚类、可视化等。@tursunWali请参阅更新的回答我测试了您的解决方案。gz文件的大小大约为17MB,但当我提取压缩文件时,它的真实大小显示为2.78GB,与我用最上面的代码得到的大小相似。我认为这不是一个适当的解决办法。正常大小应该是14MB,我尝试使用TFIDF和另一个python模块。然而,我仍然希望减小输出文件“dataVectorized1”的大小,我认为这种解决方案更透明。
np.savetxt('dataVectorized1.csv.gz', vector.toarray(), delimiter=',')