有没有更好(更快)的方法来删除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文件。
NLTK返回的停止字似乎是
list
,因此有O(n)查找。首先将列表转换为set
,这样会更快。在然而,虽然这应该可以解决性能问题,但似乎您的代码并没有按照您最初期望的那样进行。
^{pr2}$readit
是一个包含整个文件内容的字符串,因此您迭代的是字符而不是单词。导入csv
模块,但从未使用过它。另外,您的csv
文件中的字符串应该被引用,否则它将在all,
处拆分,而不仅仅是最后一个。如果您不能更改csv文件,那么使用str.rsplit
可能更容易。在第一个明显的优化是1/避免在每次迭代中调用
stopwords.words()
,2/使其成为set
(set
查找为O(1),其中list
查找为O(N)):但是这不会产生预期的结果,因为
^{pr2}$readit
是一个字符串,所以实际上您是在迭代单个字符,而不是单词。您需要先将字符串标记化,[如这里所述][1]:但是现在你已经丢失了所有的csv新行,所以你不能正确地重建它。。。如果你的csv中有引用的话,你可能也会有一些问题。所以实际上,您可能希望使用
csv.reader
正确地解析源代码,并逐字段、逐行地清理数据,这当然会增加一些开销。好吧,如果你的目标是重建csv而不使用stopwords,那就是(否则你可能不太在乎)。在安怀依:如果你有一个非常庞大的语料库需要清理并且需要性能,下一步就是真正的并行化:将源数据分成若干部分,将每个部分发送到一个不同的进程(每个处理器/核心一个是一个好的开始),可能分布在多台计算机上,然后收集结果。这种模式被称为“mapreduce”,它们已经是两个Python实现。在
相关问题 更多 >
编程相关推荐