Практические шаги по предварительной обработке данных, которым нужно следовать при работе с текстовыми данными для моделирования НЛП.

Обзор

Предварительная обработка текста традиционно является важным этапом в задачах обработки естественного языка (NLP). Он преобразует текст в более удобоваримую форму, чтобы алгоритмы машинного обучения могли работать лучше.

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

Зачем нужна предварительная обработка данных?

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

Таким образом, прежде чем использовать эти данные по назначению, вам необходимо, чтобы они были как можно более организованными и «чистыми». Это можно сделать несколькими способами, в зависимости от того, какую проблему вы решаете. В идеале вы должны использовать все следующие методы, чтобы получить более точный набор данных.

Шаги для предварительной обработки данных

В этом разделе мы запрограммируем общие шаги, связанные с предварительной обработкой текста.

1) нижний регистр

Преобразование текста в строчные буквы.

sent_0 =sent_0.lower()

2) Удаление всех URL-адресов из данных

мы удаляем URL-адреса («http \») из текста, используя регулярное выражение Python.

sent_0 = re.sub(r"http\S+", "", sent_1000)

3) Удаление всех тегов из данных

Для удаления тегов мы используем пакет Python Beautiful Soup.

soup = BeautifulSoup(sent_0, 'lxml')
text = soup.get_text()

4) Удаление слов с цифрами из данных

мы удаляем слова, содержащие числа, из текста, используя регулярное выражение Python.

sent_0 = re.sub("\S*\d\S*", "", sent_0).strip()

5) Удаление специального символа из данных

мы удаляем из текста все специальные символы («*, &, #, @…»).

sent_0 = re.sub('[^A-Za-z0-9]+', ' ', sent_0)

6) Удаление слов

На этом этапе мы расширяем англоязычные сокращения с помощью python.

def decontracted(phrase):
    phrase = re.sub(r"won't", "will not", phrase)
    phrase = re.sub(r"can\'t", "can not", phrase)
    phrase = re.sub(r"n\'t", " not", phrase)
    phrase = re.sub(r"\'re", " are", phrase)
    phrase = re.sub(r"\'s", " is", phrase)
    phrase = re.sub(r"\'d", " would", phrase)
    phrase = re.sub(r"\'ll", " will", phrase)
    phrase = re.sub(r"\'t", " not", phrase)
    phrase = re.sub(r"\'ve", " have", phrase)
    phrase = re.sub(r"\'m", " am", phrase)
    return phrase

7) Удаление стоп-слов

стоп-слова - это слова, которые отфильтровываются до или после обработки данных естественного языка. Хотя «стоп-слова» обычно относятся к наиболее распространенным словам в языке, не существует единого универсального списка стоп-слов, используемого всеми инструментами обработки естественного языка.

nltk.download('stopwords')
eng_stopwords = set(stopwords.words('english'))

8) Основание

Построение - это процесс сокращения слова до его основы, которая присоединяется к суффиксам и префиксам или к корням слов, известная как лемма. Построение важно для понимания естественного языка (NLU) и обработки естественного языка (NLP).

def stemmer(data):
  review_clean_ps = []
  ps = PorterStemmer()
  for sentance in tqdm(data['review'].values):
    ps_stems = []
    for w in sentance.split():
      if w == 'oed':
        continue
      ps_stems.append(ps.stem(w))  
     
    review_clean_ps.append(' '.join(ps_stems))   
  data['review']=review_clean_ps
  return data

9) Лемматизация

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

def get_wordnet_pos(treebank_tag):

    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return 'n'
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')
def lemmatization(data):
  review_clean_wnl = []
  wnl = WordNetLemmatizer()
  for sentance in tqdm(data['review'].values):
     wnl_stems = []
     token_tag = pos_tag(sentance.split())
     for pair in token_tag:
       res = wnl.lemmatize(pair[0],pos=get_wordnet_pos(pair[1]))
       wnl_stems.append(res)
     review_clean_wnl.append(' '.join(wnl_stems))
  data['review']=review_clean_wnl
  return data

10) Векторизация

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

Существуют разные методы векторизации, в основном речь идет о сумке слов и векторизаторе tfidf.

#bag of words
vectorizer_bow = CountVectorizer(min_df=10,ngram_range=(1,4), max_features=5000)
vectorizer_bow.fit(X_train.values)  #fitting
x_train_bow= vectorizer_bow.transform(X_train.values) 
x_test_bow= vectorizer_bow.transform(X_test.values)

#tfidf
tfidfvectorizer = TfidfVectorizer(min_df=10,max_features=5000)
text_tfidf = tfidfvectorizer.fit(X_train.values) #fitting

X_train_tfidf =tfidfvectorizer.transform(X_train.values) 
X_test_tfidf =tfidfvectorizer.transform(X_test.values)

Вы можете найти мое полное решение в моем репозитории Github, и если у вас есть какие-либо предложения, свяжитесь со мной через Linkedin