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


Я создал следующий скрипт для очистки текста, что я наскреб. Чистый текст, в идеале бы слова, набранные строчными буквами, без цифр и может быть, только запятые и точку в конце предложения. Она должна иметь пробелы между словами и удалить все "\Н" элементов в тексте.

В частности, я заинтересован в обратной связи со следующим кодом:

def cleaning(text):

    import string
    exclude = set(string.punctuation)

    import re
    # remove new line and digits with regular expression
    text = re.sub(r'\n', '', text)
    text = re.sub(r'\d', '', text)
    # remove patterns matching url format
    url_pattern = r'((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
    text = re.sub(url_pattern, ' ', text)
    # remove non-ascii characters
    text = ''.join(character for character in text if ord(character) < 128)
    # remove punctuations
    text = ''.join(character for character in text if character not in exclude)
    # standardize white space
    text = re.sub(r'\s+', ' ', text)
    # drop capitalization
    text = text.lower()
    #remove white space
    text = text.strip()

    return text

Сценарий очищается через

cleaner = lambda x: cleaning(x)
df['text_clean'] = df['text'].apply(cleaner)
# Replace and remove empty rows
df['text_clean'] = df['text_clean'].replace('', np.nan)
df = df.dropna(how='any')

Пока скрипт работает, и это здорово. Однако, как выше сценарий быть улучшены, или быть написано чище?

Непонятно, кажется, что разница между

text = re.sub(r'\n', '', text)
text = re.sub('\n', '', text)

и будет ли

text = re.sub(r'\s+', ' ', text)
...
text = text.strip()

имеет смысл.



3844
6
задан 2 февраля 2018 в 04:02 Источник Поделиться
Комментарии
1 ответ

На самом деле, ваш подход заключается в том, чтобы удалить или заменить с пространством все, что не слово (URL и символы, которые не Буквы в ASCII). Тогда вы закончите работу, удаляя повторяющиеся пробелы, пробелы в начале или конце строки, и превращая все в нижнем регистре.

Идея имеет смысл.

Но конкретно, каков результат этого скрипта?
Он возвращает все слова в нижнем регистре, разделенных пробелом.

Описано как, что, вы легко поймете, что вы можете извлечь слова и соединить их с места. Для этого, простой re.findall(r'[a-z]+', text) достаточно, но вы должны Удалить URL-адреса, если вы не хотите, чтобы поймать письмо последовательностей, содержащихся в них.

Шаблон url

Если Вы читаете шаблон URL, можно увидеть, что единственная часть, которая не факультатив на самом деле [\w-]+(?:\.[\w-]+)+ (написано [\w\-_]+(\.[\w\-_]+)+ в вашем скрипте: _ уже внутри \wможно поставить - в конце героя без того, чтобы избежать этого, группа захвата-это бесполезно).Все что идет после этой части рисунка не требует точного описания и могут быть заменены \S* (ноль или более не-пробелы). Даже если он ловит закрывающую скобку или запятую, не важно, для чего вы хотите сделать (мы увидим, как обращаться с запятыми или точками позже).

Одним из недостатков шаблона URL-адреса является то, что она начинается с чередованием в дополнительную группу. Это означает, что на каждую неудачу позицию строки, регулярное выражение двигателя, чтобы проверить три варианта (http|ftp|https) и без целой группы даром.
Это можно улучшить, что немного, если вы начинаете шаблон со словом граница, и если вы замените последнюю альтернативу (HTTPS) с дополнительным s в первом.

Шаблон URL-адреса может быть переписан следующим образом:

\b(?:(?:https|ftp)://)?\w[\w-]*(?:\.[\w-]+)+\S*

и вся функция:

import re

def cleaning2(text):
text = re.sub(r'\b(?:(?:https?|ftp)://)?\w[\w-]*(?:\.[\w-]+)+\S*', ' ', text.lower())
words = re.findall(r'[a-z]+', text)
return ' '.join(words)

Обратите внимание, что синтаксис URL-адрес может быть особенно сложным, и что это не всегда возможно, чтобы извлечь URL из не-отформатированную строку.

Если вы хотите сохранить запятых и точек:
Несколько изменений, вы только должны быть уверены, что \S* в шаблон url не ест запятую или точку в конце URL-адреса с отрицательного просмотра назад (?<!...)и добавить их в символ класса в re.findall шаблон:

import re

def cleaning2(text):
text = re.sub(r'\b(?:(?:https?|ftp)://)?\w[\w-]*(?:\.[\w-]+)+\S*(?<![.,])', ' ', text.lower())
words = re.findall(r'[a-z.,]+', text)
return ' '.join(words)

2
ответ дан 4 февраля 2018 в 05:02 Источник Поделиться