рдирдорд╕реНрддреЗ!
рдХреНрдпрд╛ рдЖрдк рдЕрдХреНрд╕рд░ рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рд╖рд╛рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦрддреЗ рд╣реИрдВ? рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдирдлрд░рдд рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд▓рдХреНрд╖реНрдп рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдЖрдХреНрд░рд╛рдордХ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рдо рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдПрдХ рд╕рд░рд▓ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╣рдо рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдореИрдВ Google Colab рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд╕реЗрд╡рд╛ рдЖрдкрдХреЛ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рдореБрдлреНрдд рдореЗрдВ GPU (NVidia Tesla K80) рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реАрдЦрдиреЗ рдХреА рдЧрддрд┐ рдмрдврд╝реЗрдЧреАред рдореИрдВ TendorFlow рдмреИрдХрдПрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреЛрд▓рд╛рдм рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрд╕реНрдХрд░рдг 1.15.0, рдЗрд╕рд▓рд┐рдП рд╕рд┐рд░реНрдл 2.0.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВред
рд╣рдо рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЕрдкрдбреЗрдЯ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf !tf_upgrade_v2 -h
рдЖрдк рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
print(tf.__version__)
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
import os import numpy as np
рдкреНрд░рдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг
- рдУрдПрд╕ - рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рд╕реБрдиреНрди - рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рдкрд╛рдВрдбрд╛ - рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп
- рдХреЗрд░рд╕ - рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
- keras.preprocessing.Text - рдкрд╛рда рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- sklearn.train_test_split - рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- matplotlib - рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- sklearn.normalize - рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдХрд╛рдЧрд▓ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛
рдореИрдВ рд╕реАрдзреЗ рдХреЛрд▓рд╛рдм рд▓реИрдкрдЯреЙрдк рдореЗрдВ рд╣реА рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред
path = 'labeled.csv' df = pd.read_csv(path) df.head()

рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рд╣реЗрдбрд┐рдВрдЧ рд╣реИ ... рдореИрдВ рднреА рдХрд┐рд╕реА рддрд░рд╣ "рд░рд┐рдлреНрд░реЗрд╢ рдкреЗрдЬ, рдореЛрд░рди" рд╕реЗ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реИ, рд╣рдо рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ: рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдкрд╛рда рд╣реИ, рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдиреНрдпреВрд▓рд╛рдЗрди рд╡рд░реНрдг рдирд┐рдХрд╛рд▓реЗрдВред
def delete_new_line_symbols(text): text = text.replace('\n', ' ') return text
df['comment'] = df['comment'].apply(delete_new_line_symbols) df.head()
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдЧрд▓рд╛, рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред
target = np.array(df['toxic'].astype('uint8')) target[:5]
рдЕрдм рд╣рдо рдЯреЛрдХрдирд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
tokenizer = Tokenizer(num_words=30000, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', lower=True, split=' ', char_level=False)
рдЬрд▓реНрджреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ- num_words - рдирд┐рд╢реНрдЪрд┐рдд рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп)
- рдлрд╝рд┐рд▓реНрдЯрд░ - рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо
- рдирд┐рдЪрд▓рд╛ - рдПрдХ рдмреВрд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкрд╛рда рд▓реЛрдЕрд░рдХреЗрд╕ рд╣реЛрдЧрд╛
- рд╕реНрдкреНрд▓рд┐рдЯ - рд╕реНрдкреНрд▓рд┐рдЯ рдСрдлрд░ рдХрд╛ рдореБрдЦреНрдп рдкреНрд░рддреАрдХ
- char_level - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдПрдХрд▓ рд╡рд░реНрдг рдХреЛ рдПрдХ рд╢рдмреНрдж рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛
рдФрд░ рдЕрдм рд╣рдо рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
tokenizer.fit_on_texts(df['comment']) matrix = tokenizer.texts_to_matrix(df['comment'], mode='count') matrix.shape
рд╣рдореЗрдВ 14k рдирдореВрдирд╛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ 30k рдлрд╝реАрдЪрд░ рдХреЙрд▓рдо рдорд┐рд▓реЗред

рдореИрдВ рджреЛ рдкрд░рддреЛрдВ рд╕реЗ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рдШрдиреЗ рдФрд░ рдбреНрд░реЙрдкрдЖрдЙрдЯред
def get_model(): model = Sequential() model.add(Dense(32, activation='relu')) model.add(Dropout(0.3)) model.add(Dense(16, activation='relu')) model.add(Dropout(0.3)) model.add(Dense(16, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer=RMSprop(lr=0.0001), loss='binary_crossentropy', metrics=['accuracy']) return model
рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╣рдорддрд┐ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг)ред
X = normalize(matrix) y = target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) X_train.shape, y_train.shape
рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг
model = get_model() history = model.fit(X_train, y_train, epochs=150, batch_size=500, validation_data=(X_test, y_test)) history
рдореИрдВ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред

рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рджреГрд╢реНрдп
history = history.history fig = plt.figure(figsize=(20, 10)) ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(223) x = range(150) ax1.plot(x, history['acc'], 'b-', label='Accuracy') ax1.plot(x, history['val_acc'], 'r-', label='Validation accuracy') ax1.legend(loc='lower right') ax2.plot(x, history['loss'], 'b-', label='Losses') ax2.plot(x, history['val_loss'], 'r-', label='Validation losses') ax2.legend(loc='upper right')


рдирд┐рд╖реНрдХрд░реНрд╖
рдореЙрдбрд▓ 75 рд╡реЗрдВ рдпреБрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдпрд╣ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред 0.85 рдХреА рд╕рдЯреАрдХрддрд╛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЖрдк рдкрд░рддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд╣рд╛рдЗрдкрд░рдкрд░рдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдордЬрд╝реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдиреМрдХрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдХрд┐рддрдиреА рдЯреЛрдкрд┐рдпрд╛рдБ рдорд┐рд▓реЗрдВрдЧреАред