繁体   English   中英

Python | Jupyter Notebook - NLTK function 检查单词时速度慢

[英]Python | Jupyter Notebook - NLTK function slow when checking for words

我正在尝试使用 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() function 时,可能必须构建该列表。 尽管如此,在列表中使用in关键字比在集合中使用时要慢得多。 鉴于列表中的所有单词都是唯一的,您可以重新排列代码,如下所示:

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')

这是对我原始答案的重写,包括 pandas 系列并展示了性能特征。 在我的机器上, gibberishBody列表是在 0.0051 秒内构建的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM