Время прочтения: 4 мин.

Сегодня активно развиваются методы машинного обучения, которые в качестве входных данных используют различные тексты – от комментариев в социальных сетях до официальных документов. Для использования алгоритмов машинного обучения для текста используются алгоритмы NLP (Natural Language Processing).

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

Для начала импортируем все необходимые библиотеки:

import re
import nltk
from nltk.corpus import stopwords
import pandas as pd
import pymorphy2
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

В качестве примера будем использовать отрывок из произведения М.Ю. Лермонтова – «Бородино».

Считаем эти данные из текстового файла:

file = open('test.txt','r',encoding='utf-8')
text = file.readlines()
print(text)

Первым шагом в обработке данных является приведение всех символов текста к нижнему регистру:

text = [line.lower() for line in text]
print(text)

Далее из текста удаляются знаки пунктуации, различные небуквенные символы и цифры. Сделать это можно, применив функцию re.sub и указав в качестве параметра шаблон для поиска всех небуквенных символов:

text = [re.sub(r'[^\w\s]',' ',line,flags=re.UNICODE) for line in text]
print(text)

Для применения последующих методов имеет смысл разбить каждую строку на список составляющих её слов. Для этого можно воспользоваться возможностями библиотеки nltk:

tokenizedText = [nltk.word_tokenize(line) for line in text]
print(tokenizedText)

Существуют слова, которые в процессе применения алгоритмов машинного обучения добавляют шум и влияют на качество модели (стоп-слова). Список стоп-слов можно увидеть, воспользовавшись командой:

from nltk.corpus import stopwords
stopWords = stopwords.words("russian")
print(stopWords)

Теперь удалим стоп-слова из наших данных:

def lineWithoutStopWords(line):
    return [word for word in line if word not in stopWords]
withoutStopWords = [lineWithoutStopWords(line) for line in tokenizedText]
print(withoutStopWords)

Обычно тексты содержат различные грамматические формы одного и того же слова либо однокоренные слова. Для приведения встречающихся словоформ к одной (нормальной форме) используется лемматизация.

Лемматизация – процесс, который использует морфологический анализ и словарь, для приведения слова к его канонической форме – лемме.

 Для этой задачи будем применять библиотеку pymorphy2:

def normalForm(line):
    return [morph.parse(word)[0].normal_form for word in line if len(word)>2]
normalForm = [normalForm(line) for line in withoutStopWords]
print(normalForm)

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

count_vectorizer = CountVectorizer()
string = [''.join(line) for line in normalForm]
bag_of_words = count_vectorizer.fit_transform(string)
feature_names = count_vectorizer.get_feature_names()
pd.DataFrame(bag_of_words.toarray(),columns=feature_names[:9])

Сформированная последовательность (вектор) из нулей и единиц может использоваться в качестве набора фичей при обучении моделей.