如何在熊猫数据帧上迭代 TfidfVectorizer()

Posted

技术标签:

【中文标题】如何在熊猫数据帧上迭代 TfidfVectorizer()【英文标题】:How to iterate TfidfVectorizer() on pandas dataframe 【发布时间】:2018-12-25 21:54:18 【问题描述】:

我有一个包含 1000 万条新闻文章记录的大型 pandas 数据框。所以,这就是我申请TfidfVectorizer的方式。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
feature_matrix = tfidf.fit_transform(df['articles'])

处理所有文件需要很长时间。我只想一次迭代数据框中的每篇文章,还是我可以分块传递文档并不断更新现有词汇表而不覆盖旧的词汇表?

我已经完成了这个 SO post,但不完全了解如何将它应用到 pandas。我也听说过Python generators,但不知道它在这里是否有用。

【问题讨论】:

这就是 tfidfvectorizer 正在做的事情。它一次迭代一个文档并更新词汇表。你还想做什么。请详细说明。 @VivekKumar 感谢您的评论。我只想减少使用 TfidfVectorizer 处理文档的迭代时间。我现在做的好像是在计算结果矩阵时花费更多时间,因为它一次处理所有 df['article'] 我希望它一个一个地完成。通过chunks 或使用可迭代生成器在熊猫中一次传递一个文档,是否有更专业的方式在大型数据集上执行 Tfidf?希望你明白了 正如我上面所说,它不会一次性处理所有内容。在fit() method of TfidfVectorizer 内部,它会迭代您传递的系列并一一处理,以填充词汇表和计数矩阵。然后它处理计数矩阵以准备 tfidf 矩阵。 @VivekKumar 那么,反过来计算df['articles'] 的 Tfidf 会更方便 1000 万条记录吗? 是的,您可以加快速度。见这里:***.com/a/26212970/5025009 【参考方案1】:

您可以按如下方式迭代。解决方案已改编自here

def ChunkIterator():
    for chunk in pd.read_csv(csvfilename, chunksize=1000):
      for doc in  chunk['articles'].values:
             yield doc

corpus  = ChunkIterator()
tfidf = TfidfVectorizer()
feature_matrix = tfidf.fit_transform(corpus)

【讨论】:

我正在使用上面给出的相同代码(由你),但为什么它在 fit_transform 过程中仍然消耗太多内存,我又用完了内存。任何想法 不确定您是否可以通过***.com/questions/53754234/… 参考cmets。确实有人在那里也遇到了内存错误

以上是关于如何在熊猫数据帧上迭代 TfidfVectorizer()的主要内容,如果未能解决你的问题,请参考以下文章

为啥在数据帧上具有中位数的 fillna 仍然在熊猫中留下 Na/NaN?

熊猫逐渐减去日期,直到满足数据帧上的条件

如何在 R 中的单个数据帧上迭代地应用函数?

在多个熊猫数据帧上执行相同操作的正确方法是什么?

在熊猫数据框中按行应用时如何保留数据类型?

在 pandas 数据帧上应用 Pyspark 管道