Обобщенный метод очистки данных для классификации текста - PullRequest
0 голосов
/ 28 января 2020

При поиске метода классификации текста я наткнулся на этот код Python, который использовался на этапе предварительной обработки

REPLACE_BY_SPACE_RE = re.compile('[/(){}\[\]\|@,;]')
BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')
STOPWORDS = set(stopwords.words('english'))

def clean_text(text):
    """
        text: a string 
        return: modified initial string
    """
    text = text.lower() # lowercase text
    text = REPLACE_BY_SPACE_RE.sub(' ', text) # replace REPLACE_BY_SPACE_RE symbols by space in text. substitute the matched string in REPLACE_BY_SPACE_RE with space.
    text = BAD_SYMBOLS_RE.sub('', text) # remove symbols which are in BAD_SYMBOLS_RE from text. substitute the matched string in BAD_SYMBOLS_RE with nothing. 
    text = text.replace('x', '')
    text = ' '.join(word for word in text.split() if word not in STOPWORDS) # remove stopwords from text
    return text

OP

Затем я проверил этот раздел кода, чтобы понять синтаксис и его назначение

BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')
text = '[0a;m]'
BAD_SYMBOLS_RE.sub(' ', text)
# returns ' 0a m ' whilst I thought it would return '   ;  '

Вопрос: почему код не заменил 0, a и m хотя 0-9a-z был указан внутри [ ]? Почему он заменил ;, хотя этот символ не был указан?

Редактировать, чтобы избежать пометки как дубликата:

Мое восприятие кода:

  1. Строка BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]') сбивает с толку. Включение символов #, + и _ в [ ] заставило меня подумать, что строка пытается удалить символы из списка (потому что ни одно слово в словаре Engli sh не будет содержать эти плохо символов #+_, я полагаю?). Следовательно, это заставило меня интерпретировать ^ как начало строки (вместо отрицания). Итак, оригинальный пост (на который любезно ответили Тим Пицкер и Рэймонд Хеттингер). Две строки REPLACE_BY_SPACE_RE и BAD_SYMBOLS_RE должны были быть объединены в одну, такую ​​как
REMOVE_PUNCT = re.compile('[^0-9a-z]')
text = REMOVE_PUNCT.sub('', text)
Я также думаю, что код text = text.replace('x', '') (который предназначался для удаления идентификаторов, которые были замаскированы как XXX-XXXX .... в необработанных данных) приведет к плохому результату, например, слово next станет net.

Дополнительные вопросы :

  1. Являются ли мои представления разумными?

  2. Должны ли цифры / цифры быть удалены из текста?

  3. Не могли бы вы порекомендовать общую / общую стратегию / код для предварительной обработки текста для (Engli sh) классификации текста?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вот некоторая документация о классах символов .

По сути, [abc] означает «любой из a, b или c», тогда как [^abc] означает «любой символ, который не a, b или c».

Таким образом, ваша операция регулярного выражения удаляет все не-di git, не буквенные символы, кроме пробел, #, + и _ из строки, что объясняет полученный результат.

1 голос
/ 28 января 2020

Общие правила

В квадратных скобках указан любой отдельный символ.

Примерно [xyz] - это сокращение для (x|y|z), но без создания группы .

Аналогично [a-z] - это сокращение для (a|b|c|...|y|z).

Интерпретация наборов символов может быть немного хитрой. Начальная и конечная точки преобразуются в их порядковые позиции , и отсюда выводится диапазон совпадающих символов. Например, [A-z] преобразует A в 65 и z в 122, поэтому все от 65 до 122 включено. Это означает, что он также соответствует символам, таким как ^ , которые конвертируются в 94. Это также означает, что такие символы, как ö , не будут совпадать, потому что они конвертируются в 246, что находится за пределами диапазона.

Другая интересная форма для классов символов использует ^ , чтобы инвертировать выделение. Например, [^a-z] означает «любой символ, не находящийся в диапазоне от a до z .

Полная информация приведена в разделе« Наборы символов » re docs .

Специфика c Задача

В примере OP, BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]'), символ ^ в начале инвертирует диапазон так, чтобы перечисленные символы были исключены из поиска.

Именно поэтому код не не заменил 0 , a и m , хотя в [ ] был указан 0-9a-z. По сути, он рассматривал указанные символы как хорошие символы.

Надеюсь, это поможет : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...