Объединение многих операций регулярных выражений вместе - PullRequest
1 голос
/ 02 апреля 2020

Я работаю над проектом обработки текста НЛП с использованием python, в котором мне нужно выполнить очистку данных перед извлечением функций. Я делаю очистку специальных символов и разделений чисел с помощью символов, используя операцию регулярного выражения, но я делаю все это во многих операциях по отдельности, что делает его медленным. Я хочу сделать это как можно меньше операций или более быстрым способом.

мой код выглядит следующим образом

def remove_special_char(x):
    if type(x) is str:
        x = x.replace('-', ' ').replace('(', ',').replace(')', ',')
        x = re.compile(r"\s+").sub(" ", x).strip()
        x = re.sub(r'[^A-Z a-z 0-9-,.x]+', '', x).lower()
        x = re.sub(r"([0-9]+(\.[0-9]+)?)",r" \1 ", x).strip()
        x = x.replace(",,",",")
        return x
    else:
        return x 

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

В дополнение к подготовке скомпилированных шаблонов вне функции вы можете повысить производительность, используя translate для всех преобразований один-к-одному или один-к-одному:

import string
mappings     = {'-':' ', '(':',', ')':','}            # add more mappings as needed
mappings.update({ c:' ' for c in string.whitespace }) # white spaces become spaces
mappings.update({c:c.lower() for c in string.ascii_uppercase}) # set to lowercase
specialChars = str.maketrans(mappings)

def remove_special_char(x):
    x = x.translate(specialChars)
    ...
    return x
2 голосов
/ 02 апреля 2020

У вас есть разные строки замены для различных операций, поэтому вы не можете их объединить.

Вы можете предварительно скомпилировать все регулярные выражения заранее, но я подозреваю, что это не будет иметь большого значения:

paren_re = re.compile(r"[()]")
whitespace_re = re.compile(r"\s+")
ident_re = re.compile(r"[^A-Za-z0-9-,.x]+")
number_re = re.compile(r"([0-9]+(\.[0-9]+)?)")


def remove_special_char(x):
    if isinstance(x, str):
        x = x.replace("-", " ")
        x = paren_re.sub(",", x)
        x = whitespace_re.sub(" ", x)
        x = ident_re.sub("", x).lower()
        x = number_re.sub(r" \1 ", x).strip()
        x = x.replace(",,", ",")
    return x

Профилировали ли вы свою программу, чтобы увидеть, что это узкое место?

...