Python|Jupyter Notebook-NLTK函数在检查单词时速度较慢



我正试图使用NLTK清理数据集,但我遇到了一些麻烦,因为它需要很长时间才能完成。我确实有一个超过20000多行文本的大型数据集。

我运行的代码如下:

from nltk.corpus import words
nltk.download('words')
gibberishBody = []
for x in bodyStopWords:
if x in words.words():
gibberishBody.append(x)
print(gibberishBody)

bodyStopWords是pandas.core.series.series数据类型。

有人对优化脚本的速度有什么建议吗?

在您的示例中,words.words()返回一个很大的英语单词列表。对于列表来说,通过in检查成员身份是缓慢的(线性的(。也就是说,要检查单词列表中是否有某个单词x,必须将x与列表中的每个元素进行比较。

相反,您可以使用set来加快进程,因为它具有恒定的时间查找*。尝试以下操作:

from nltk.corpus import words
nltk.download('words')
gibberishBody = []
my_words = set(words.words())
for x in bodyStopWords:
if x in my_words:
gibberishBody.append(x)
print(gibberishBody)

*从技术上讲,恒定时间只是意料之中的事,但这已经足够了。

这可能会改善问题。words.words((返回一个列表。每次调用words((函数时,都必须构造该列表。尽管如此,在列表中使用中的关键字要比在集合中使用慢得多。假设列表中的所有单词都是唯一的,您可以按如下方式重新排列代码:

from nltk.corpus import words
from pandas import DataFrame
import random
import time
WL = words.words() # get the word list
print(f'Word list contains {len(WL)} words')
WS = set(WL) # convert to a set
NW = min(20_000, len(WL)) # not really necessary as the word list is known to contain over 200k words
bodyStopWords = DataFrame([random.choice(WL) for _ in range(NW)])[0] # get a Series representation
print(f'{NW} random stopwords chosen')
s = time.perf_counter() # note start time
gibberishBody = [x for x in bodyStopWords if x in WS] # build the body
e = time.perf_counter() # note end time
print(f'{e-s:.4f}s')

这是对我最初答案的改写,包括熊猫系列,并展示了表演特点。在我的机器上,赤码正文列表是在0.0051s 中构建的

最新更新