Базовая обработка текстовых данных. Решение задачи классификации тональности

  • Автор записи:
  • Рубрика записи:Notebooks

Структура скрипта

  • Анализ англоязычных текстовых данных
  • Анализ русскоязычных текстовых данных
  • Рассмотрение операций стемминга и лемматизации элементов текстового корпуса
  • Рассмотрение овер- и андер-сэмплинга: приведение выборки к сбалансированному виду
  • Токенизация на основе библиотеки Keras: обзор алгоритма “мешок слов”
  • Токенизация на основе алгоритма TF-IDF
  • Классификация текстовых данных: разметка тональности сообщений
Требуемые библиотеки

import pandas as pd
import numpy as np
import re
import tensorflow as tf
import keras
from keras import layers
from sklearn.metrics import mean_squared_error, mean_absolute_error
from tensorflow.keras.optimizers import Adam, SGD, RMSprop, Adagrad
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.layers import Bidirectional, LSTM, Dropout, Embedding, Dense
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import NearMiss
from nltk.stem import SnowballStemmer
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer
import pymorphy2
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
1. Первичная обработка текстовых данных

train2 = table['Tweet'].str.lower()
text1_test = train2.astype(str)

text1_without = text1_test.str.replace('[\([{})\]]', '')
text1_without = text1_without.str.replace('https:\/\/\S+', '')
text1_without = text1_without.str.replace('[\n/!@#$%^&*()"№;—:?=|«»,.]', ' ')
text1_without = text1_without.str.replace('[0-9+]', ' ')

ready_text1 = pd.DataFrame(text1_without)
ready_text1.columns = ['cleaned_posts']
ready_text1
2. Удаление стоп-слов из всего массива

ready_text = []

#for i in ready_text1['cleaned_posts'][:10]:
for i in ready_text1['cleaned_posts']:
  vec = [word for word in i.split() if word not in stopwords.words('english')]
  vec = ' '.join(vec)
  ready_text.append(vec)

ready_text
3. Стемминг всех элемнтов в массиве

snowball = SnowballStemmer(language="english")
tab = []

for i in ready_text:
  sent = []
  for z in i.split():
    new_word = snowball.stem(z)
    sent.append(new_word)
  new_sent = ' '.join(sent)
  tab.append(new_sent)

  print(tab)
4. Лемматизация всех элементов в массиве

nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()

for i in ready_text:
  row_lemm = []
  for z in i.split():
    lemm = lemmatizer.lemmatize(z)
    row_lemm.append(lemm)
  new_lemm = ' '.join(row_lemm)

  print(new_lemm)
5. Токенизация элементов массива на основе "мешка слов"

tokenizer = Tokenizer(num_words=num_words)
posts = new_tab1[0]
tokenizer.fit_on_texts(posts)
sequences = tokenizer.texts_to_sequences(posts)
x = pad_sequences(sequences, maxlen=max_review_len)
6. Токенизация элементов массива на основе алгоритма TF-IDF

#Токенизация элементов массива и их векторизация
count_vect = TfidfVectorizer(
    #analyzer='char',
    analyzer='word',
    ngram_range=(1, 2),
    max_df=0.9,
    min_df=2,
    norm = None
)
x_count = count_vect.fit_transform(new_tab1[0])

# Если требуется перевести в векторное пространство тестовый новый массив данных

x_test_count = count_vect1.transform(posts_test1)
x_test_tf = tfidf_transform.transform(x_test_count)



# Построение датафрейма для отображения всей матрицы токенов
x_tf1 = pd.DataFrame.sparse.from_spmatrix(x_count)
x_tf2 = x_tf1.to_numpy()



# Перевод матрицы в numpy array и удаление всех нулевых элементов построчно
matrix1 = []

z=1

for i in list(x_tf2):
  row = i[i!=0]
  matrix1.append(row)
  print(z)
  z=z+1

matrix1



# Приведение каждой строчки данных к единой длине (смотрим распределение длины векторов)
x_test2 = pad_sequences(matrix1, maxlen=max_review_len, dtype='float32')
7. Приведение выборки к сбалнсированному виду: Oversampling Case

over_sampler = SMOTE(k_neighbors=3)
x_res, y_res = over_sampler.fit_resample(x_train, y_train)
x_res, y_res = shuffle(x_res, y_res, random_state=0)
y_res.value_counts()

8. Приведение выборки к сбалнсированному виду: Undersampling Case
under_sampler = NearMiss()
x_res1, y_res1 = under_sampler.fit_resample(x_train, y_train)
y_res1.value_counts()

Доступ к тренировочному скрипту