0

複数のトークンを大きな Unicode テキスト ドキュメントに置き換える必要があります。現在、私は自分の辞書の単語を反復処理しておりsub、コンパイルされた正規表現に置き換えています:

for token, replacement in dictionary.tokens().iteritems():
    r = re.compile(word_regex_unicode(token), flags=re.I | re.X | re.UNICODE)
    text = r.sub(replacement, text)

私の単語の正規表現はどこですか

# UTF8 unicode word regex
def word_regex_unicode(word):
    return r"(?<!\S){}(?!\S)".format(re.escape(word))

これは、新しい正規表現をコンパイルする必要がありsub、ドキュメントに存在するかどうかにかかわらず、すべてのトークンに対して呼び出しが発生することを意味しますtext。別のアプローチとして、トークンの出現を見つけて、トークンが見つかった場合re.finditerに呼び出すことができます。re.sub

for token, replacement in dictionary.tokens().iteritems():
    r = re.compile(word_regex_unicode(token), flags=re.I | re.X | re.UNICODE)
    for m in r.finditer(token, text):
        # now call sub 
        text = r.sub(replacement, text)

re.subしたがって、実際には必要ないときの呼び出しを回避します。re.finditer最後のアプローチは、グループの結果を使用して改善できます。

for m in r.finditer(token, text):
    # match start: match.start()
    index = match.start()
    # replace from start to end
    text = text[:index] + token + text[index + 1:]

これらのうち、どれがより速いアプローチですか?

4

0 に答える 0