Структура скрипта
- Анализ англоязычных текстовых данных
- Анализ русскоязычных текстовых данных
- Рассмотрение операций стемминга и лемматизации элементов текстового корпуса
- Рассмотрение овер- и андер-сэмплинга: приведение выборки к сбалансированному виду
- Токенизация на основе библиотеки 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()