在一长串文件/句子中替换长令牌列表的最有效方法

时间:2017-07-08 22:44:15

标签: python python-2.7

我正在尝试找到一种最有效的方法来用他们各自的带连字符的形式(例如世界级的)来替换长连接符号(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)

0 个答案:

没有答案