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

Нормализация текста – это приведение каждого слова текста к его словарной форме: в именительном падеже, единственном числе (если есть) или в инфинитив для глаголов.

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

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

import pandas as pd
from string import punctuation #сборник символов пунктуации
from nltk.tokenize import word_tokenize #для токенизации по словам
from nltk.corpus import stopwords #сборник стоп-слов
import pymorphy2 #для морфологическтого анализа текста
from nltk.probability import FreqDist #используется для кодирования «частотных распределений»

Создадим два массива для наглядности, в одном мы будет хранить начальную версию текста, а в другом итоговую.

df = pd.read_excel("file.xlsx")
df2 = pd.DataFrame(columns=['Статья'])

В дальнейшем с помощью цикла for переберем все элементы dataframe столбца «Статья» для работы с каждым элементом. Приведем все к малому регистру для удобства работы, т.к. в сборниках всё приведено к нему же.

for i in range(len(df)):
    text = str(df['Статья'][i]).lower()

Для токенизации по словам, мы используем функцию word_tokenize, применив её к элементу массива. В данном случае, мы сможем разбить предложение на список слов с которыми в последствии можем работать.

token = word_tokenize(text)

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

stopword = stopwords.words('russian') + [a for a in punctuation]
token_2 = [word for word in token if word not in stopword]

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

morph = pymorphy2.MorphAnalyzer()
for ii in range(len(token_2)):
token_2[ii] = morph.parse(token_2[ii])[0].normal_form

В дальнейшем добавляем наш итог в dataframe №2 для просмотра результатов нашей работы.

df2.loc[i]=' '.join(token_2)

А также в разрезе каждого элемента dataframe, основываясь на словах после проделанных ранее действий, мы можем подсчитать частоту каждого слова. Это даст нам возможность создания на их основе другими методами – меток.

fdist = FreqDist(token_2)
fdist1 = fdist.most_common(10)

Пример работы (до и после):

  1. Сижу за решеткой в темнице сырой. Вскормленный в неволе орел молодой, Мой грустный товарищ, махая крылом, Кровавую пищу клюет под окном, Клюет, и бросает, и смотрит в окно, Как будто со мною задумал одно; Зовет меня взглядом и криком своим И вымолвить хочет: «Давай улетим! Мы вольные птицы; пора, брат, пора! Туда, где за тучей белеет гора, Туда, где синеют морские края, Туда, где гуляем лишь ветер… да я!»
  2. cидеть решётка темница сырой вскормить неволя орёл молодая грустный товарищ махать крыло кровавый пища клевать окно клевать бросать смотреть окно я задумать один звать взгляд крик свой вымолвить хотеть « давать улететь вольный птица пора брат пора туда туча белеть гора туда синеть морской край туда гулять лишь ветер… »

Пример (топ 10 слов):