Countvectorize 统计大文件中的字数
Posted
技术标签:
【中文标题】Countvectorize 统计大文件中的字数【英文标题】:Countvectorize to count the number of words in a huge file 【发布时间】:2022-01-19 15:59:42 【问题描述】:嗨,亲爱的,我有一个问题。我想对我的大型数据集中的所有单词进行计数和求和,大约 2 GB 用于 3400000 行。我写的代码是:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
pd.set_option('display.max_colwidth', None)
df1 = pd.read_pickle("tweet_post_stop.pkl")
然后
cv = CountVectorizer()
cv_fit = cv.fit_transform(df1.Testo_token)
一切都很好,但我对分段部分有疑问:
word_list = cv.get_feature_names_out()
count_list = cv_fit.toarray().sum(axis= 0)
使用最后一个命令内核死了,我不能做我想做的事,也就是说计算数据集中出现的所有单词并将它们相加,看看人们最常用的前 20 个单词.我怎样才能改进我的代码让它做我想做的事?我认为这是 RAM 的问题,但我有 24 GB 的 RAM。我在我的数据框的一部分上尝试了这段代码。我将前 100 行保存在另一个 Dataframe 上,导入它并在我的代码上尝试了 100 行,它可以工作。为了在所有数据集上执行我想要的操作,我能做些什么? 感谢您为我花费的时间和耐心
【问题讨论】:
【参考方案1】:我找到的唯一解决方案是减少特征数量作为 CountVectorizer 的参数,以这种方式:
vectorizer = CountVectorizer(max_features = n)
其中“n”是一个可以代表我们主要特征的数字。
【讨论】:
【参考方案2】:CountVectorizer
会产生一个非常稀疏的矩阵(这个矩阵每行会有很多0
和很少的1
)。
例如,如果您有 10000 个单词的词汇表,编码后的句子 I love ***
将产生一个大小为 (10000,)
的数组,其中包含 3 乘以 1,否则为 0。
您可以想象,这将在内存中占用大量空间。为了解决这个问题,CountVectorizer
生成了一个稀疏矩阵,前一句将仅由单词的索引位置及其计数的 3 个值表示。
当您执行cv_fit.toarray()
时,您基本上是将每个句子转换为大小为(10000,)
的numpy 数组。
因此,您应该直接在稀疏矩阵上执行此操作,如下例所示:
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
features = vectorizer.get_feature_names_out()
freqs = zip(vectorizer.get_feature_names_out(), np.asarray(X.sum(axis=0)).ravel())
print(sorted(freqs, key=lambda x: -x[1]))
【讨论】:
我尝试过这样做。另外,如果我不明白您在做什么,我试图知道它是否有效,但我有这个减弱:IOPub 数据速率超出。笔记本服务器将暂时停止向客户端发送输出以避免崩溃。要更改此限制,请设置配置变量 --NotebookApp.iopub_data_rate_limit。我可以做什么?比你@Antoine Dubuis 的时间 此警告发生在哪些行上? 在所有数据集上我收到了这个问题@Antoine Dubuis以上是关于Countvectorize 统计大文件中的字数的主要内容,如果未能解决你的问题,请参考以下文章