Python 加快从巨大的csv文件中删除停止字的速度

Python 加快从巨大的csv文件中删除停止字的速度,python,python-3.x,csv,stop-words,Python,Python 3.x,Csv,Stop Words,有没有更好(更快)的方法从csv文件中删除停止字 下面是简单的代码,一个多小时后我仍在等待结果(因此我甚至不知道它是否真的起作用): csv文件有50000行,总计约1500万字。为什么要花这么长时间?不幸的是,这只是一个亚群落。我将不得不用超过100万行和超过3亿字来完成这项工作。有没有办法加快速度?还是更优雅的代码 CSV文件示例: 1 text,sentiment 2 Loosely based on The Decameron, Jeff Baena's subversive film

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

下面是简单的代码,一个多小时后我仍在等待结果(因此我甚至不知道它是否真的起作用):

csv文件有50000行,总计约1500万字。为什么要花这么长时间?不幸的是,这只是一个亚群落。我将不得不用超过100万行和超过3亿字来完成这项工作。有没有办法加快速度?还是更优雅的代码

CSV文件示例:

1 text,sentiment
2 Loosely based on The Decameron, Jeff Baena's subversive film takes us behind the walls of a 13th century convent and squarely in the midst of a trio of lustful sisters, Alessandra (Alison Brie), Fernanda (Aubrey Plaza), and Ginerva (Kate Micucci) who are "beguiled" by a new handyman, Massetto (Dave Franco). He is posing as a deaf [...] and it is coming undone from all of these farcical complications.,3
3 One might recommend this film to the most liberally-minded of individuals, but even that is questionable as [...] But if you are one of the ribald loving few, who likes their raunchy hi-jinks with a satirical sting, this is your kinda movie. For me, the satire was lost.,5
4 [...]
[...]
50.000 The movie is [...] tht is what I ahve to say.,9

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

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

>>> 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
文件中的字符串应该被引用,否则它将在所有
处被拆分,而不仅仅是在最后一个。如果您无法更改csv文件,那么使用
str.rsplit
可能会更容易

texts = [line.rsplit(",", 1)[0] for line in readit.splitlines()]
filtered = [[w for w in text.split() if w.lower() not in stopwords_set]
            for text in texts]

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

>>> 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
文件中的字符串应该被引用,否则它将在所有
处被拆分,而不仅仅是在最后一个。如果您无法更改csv文件,那么使用
str.rsplit
可能会更容易

texts = [line.rsplit(",", 1)[0] for line in readit.splitlines()]
filtered = [[w for w in text.split() if w.lower() not in stopwords_set]
            for text in texts]

第一个明显的优化是1/避免在每次迭代中调用
stopwords.words()
,2/将其设置为
查找为O(1),其中
列表
查找为O(N)):

但是这不会产生预期的结果,因为
readit
是一个字符串,所以实际上您是在单个字符上进行迭代,而不是在单词上进行迭代。您需要在以下操作之前对字符串进行标记,[如此处所述][1]:

from nltk.tokenize import word_tokenize
readit = word_tokenize(readit)
# now readit is a proper list of words...
filtered = [w for w in readit if not w in words]
但是现在您已经丢失了所有csv换行符,因此无法正确重建它。。。如果csv中有任何引用,您可能也会遇到一些引用问题。因此,实际上,您可能希望使用
csv.reader
正确解析源代码,并逐字段、逐行清理数据,这当然会增加一些开销。好吧,如果你的目标是在不使用stopwords的情况下重建csv,那就是(否则你可能不会太在意)


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

第一个明显的优化是1/避免在每次迭代中调用
stopwords.words()
,2/将其设置为
set
set
lookup是O(1),其中
list
lookup是O(N)):

但是这不会产生预期的结果,因为
readit
是一个字符串,所以实际上您是在单个字符上进行迭代,而不是在单词上进行迭代。您需要在以下操作之前对字符串进行标记,[如此处所述][1]:

from nltk.tokenize import word_tokenize
readit = word_tokenize(readit)
# now readit is a proper list of words...
filtered = [w for w in readit if not w in words]
但是现在您已经丢失了所有csv换行符,因此无法正确重建它。。。如果csv中有任何引用,您可能也会遇到一些引用问题。因此,实际上,您可能希望使用
csv.reader
正确解析源代码,并逐字段、逐行清理数据,这当然会增加一些开销。好吧,如果你的目标是在不使用stopwords的情况下重建csv,那就是(否则你可能不会太在意)


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

这是哪一个Python版本?您可以添加适当的标记吗?还请添加一个有意义的输入CSV示例和该示例所需的输出。顺便说一句,CSV中的字符串不应该被引用吗?否则,如何区分文本中的
分离文本和情感?而且,
readit
似乎只是一个字符串,包含文件中的所有字符,而不是一个单词列表。(导入,但从不使用
csv
模块。)@tobias_k我尝试过,但它将是一个没有换行符的字符串?有没有一种方法可以正确执行?这是哪个Python版本?您可以添加相应的标记吗?还请添加一个有意义的输入CSV示例和该示例所需的输出。顺便说一句,CSV中的字符串不应该被引用吗?否则,如何区分文本中的
分离文本和情感?而且,
readit
似乎只是一个字符串,包含文件中的所有字符,而不是一个单词列表。(导入,但从不使用
csv
模块。)@tobias_k我尝试过,但它将是一个没有换行符的字符串?有没有一种方法可以正确地做到这一点?Uff,我的代码有很多缺陷,而不是一个想法。我将不得不重新考虑整件事。我不知道怎样才能不失去csv