加速从巨大的csvfi中删除停止字

2024-10-04 01:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有更好(更快)的方法来删除csv文件中的停止字?

下面是简单的代码,一个多小时后我仍在等待结果(所以我甚至不知道它是否真的有效):

import nltk
from nltk.corpus import stopwords
import csv
import codecs

f = codecs.open("agenericcsvfile.csv","r","utf-8")
readit = f.read()
f.close()

filtered = [w for w in readit if not w in stopwords.words('english')]

csv文件有50000行,总共约1500万字。为什么要花这么长时间?可悲的是,这只是一个亚群落。我要用100多万行和3亿多字来完成这个任务。那么,有没有一种方法可以加快速度呢?或者更优雅的密码?

CSV文件示例:

^{pr2}$

所需的输出将是没有停止字的相同csv文件。


Tags: 文件csv方法代码infromimportcorpus
2条回答

NLTK返回的停止字似乎是list,因此有O(n)查找。首先将列表转换为set,这样会更快。在

>>> some_word = "aren't"
>>> stop = stopwords.words('english')
>>> type(stop)
list
>>> %timeit some_word in stop
1000000 loops, best of 3: 1.3 µs per loop

>>> stop = set(stopwords.words('english'))
>>> %timeit some_word in stop
10000000 loops, best of 3: 43.8 ns per loop

然而,虽然这应该可以解决性能问题,但似乎您的代码并没有按照您最初期望的那样进行。readit是一个包含整个文件内容的字符串,因此您迭代的是字符而不是单词。导入csv模块,但从未使用过它。另外,您的csv文件中的字符串应该被引用,否则它将在all,处拆分,而不仅仅是最后一个。如果您不能更改csv文件,那么使用str.rsplit可能更容易。在

^{pr2}$

第一个明显的优化是1/避免在每次迭代中调用stopwords.words(),2/使其成为setset查找为O(1),其中list查找为O(N)):

words = set(stopwords.words("english"))
filtered = [w for w in readit if not w in words]

但是这不会产生预期的结果,因为readit是一个字符串,所以实际上您是在迭代单个字符,而不是单词。您需要先将字符串标记化,[如这里所述][1]:

^{pr2}$

但是现在你已经丢失了所有的csv新行,所以你不能正确地重建它。。。如果你的csv中有引用的话,你可能也会有一些问题。所以实际上,您可能希望使用csv.reader正确地解析源代码,并逐字段、逐行地清理数据,这当然会增加一些开销。好吧,如果你的目标是重建csv而不使用stopwords,那就是(否则你可能不太在乎)。在

安怀依:如果你有一个非常庞大的语料库需要清理并且需要性能,下一步就是真正的并行化:将源数据分成若干部分,将每个部分发送到一个不同的进程(每个处理器/核心一个是一个好的开始),可能分布在多台计算机上,然后收集结果。这种模式被称为“mapreduce”,它们已经是两个Python实现。在

相关问题 更多 >