我目前正在尝试对一个文本文件进行分词,每行都是一条推文的主体文本:
"根据向FINRA报告的数据,$SALT的短期交易量百分比在12-29-17达到了39.19% http://www.volumebot.com/?s=SALT""@Good2go @krueb 我发布的图表确实支持ng会进一步下降。 Gobstopper' 2.12,可能甚至是保守的。""@Crypt0Fortune 它的抛售情况没有以前那么糟糕了。""$XVG.X 哈哈。有人刚刚触发了一连串的止损订单,并抢购了傻瓜的币。这是股票交易者手册中最古老的伎俩。"
该文件有59,397行(一天的数据),我使用spaCy进行预处理/分词。目前大约需要8.5分钟,我在想是否有办法优化以下代码以加快速度,因为8.5分钟对于这个过程来说似乎太长了:
def token_loop(path): store = [] files = [f for f in listdir(path) if isfile(join(path, f))] start_time = time.monotonic() for filename in files: with open("./data/"+filename) as f: for line in f: tokens = nlp(line.lower()) tokens = [token.lemma_ for token in tokens if not token.orth_.isspace() and token.is_alpha and not token.is_stop and len(token.orth_) != 1] store.append(tokens) end_time = time.monotonic() print("分词所需时间:",timedelta(seconds=end_time - start_time)) return store
虽然代码中提到文件,但目前它只在循环处理一个文件。
需要注意的是,我只需要对内容进行分词;我不需要任何额外的标记等。
回答:
听起来你还没有优化管道。你可以通过禁用不需要的管道组件来显著提高速度,像这样:
nlp = spacy.load('en', disable=['parser', 'tagger', 'ner'])
仅此一项应该就能将时间缩短到大约两分钟,或更短。
如果你需要进一步加速,可以考虑使用nlp.pipe
进行多线程处理。多线程的文档在这里:https://spacy.io/usage/processing-pipelines#section-multithreading