我正在尝试找到一种最有效的方法来用他们各自的带连字符的形式(例如世界级的)来替换长连接符号(10,000)的非连字符号(例如世界级)。
我面临的问题是我必须对大量文件/句子(500,000)进行操作。
这是我目前的代码:
# build dict of tokens to replace # {first class: first-class, ... }
with open(file_with_tokens, 'rb') as f:
tokens = {k.replace('-', ' ').lower(): k for k in f}
# sort dictionary to make sure longer tokens are replaced first
tokens_sorted = sorted(tokens, key=len, reverse=True)
# compile
tokens_escaped = ['\\b' + re.escape(replacement) + '\\b' for replacement in tokens_sorted]
pattern_re = re.compile(r'(?:%s)' % '|'.join(tokens_escaped), re.IGNORECASE)
# loop list of sentences, replace tokens and output
output = []
for sent in open(fsents, 'rb'):
sent_new = pattern_re.sub(lambda match: tokens[match.group(0).lower()], sent)
if sent_new != sent:
output.append(sent_new)
return output
上述方法大约需要12个小时才能完成。关于如何加快这一进程的任何建议?
编辑实施的解决方案
我最终更新了我的功能,如下所示:
...
# loop list of sentences, replace tokens and output
pool = Pool(4)
output = pool.map(replace_token, itertools.repeat(pattern_re), itertools.repeat(tokens), sents))
return output
函数replace_token的定义如下:
def replace_token(pattern_re, tokens, sent):
return pattern_re.sub(lambda match: tokens[match.group(0).lower()], sent)