Создаем свою нейросеть для оценки отзыва на товар

Создаем свою нейросеть для оценки отзыва на товар

Задумывались ли вы, как создать свою нейросеть для работы с текстом? Если да, то в этом посте мы будем создавать свою нейросеть, которая будет сокращать текст и выставлять оценку товару. Эта статья рассчитана на людей, которые могут читать код на языке python и знают как можно установить нужный пакет. Для остальных есть больше постов у меня в телеграм канале, которые помогут понять этот материал, так же там есть все файлы и небольшой набор отзывов для обучения модели.

Для упрощения работы нейросеть будет выставлять оценку от 0.0 до 1.0 при этом "хороший" отзыв будет если вернется больше или равно 0.5, всё что меньше будет означать что отзыв "плохой".

Чтобы обучить модель нейросети нам нужен набор отзывов, датасет тут разместить не могу, его можно взять в телеграмме. Так же нам нужно написать код для обучения модели, для этого создаем файл с названием, например train.py, и в самое начало добавляем туда

import pandas as pd from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense

Затем добавляем блок для обработки нашего датасета, в моем примере у нас 2 колонки в файле product_review - текст отзыва и product_rating - оценка отзыва, обратите внимание, что разделитель ";". А чтобы нейросети было проще обрабатывать оценки мы их преобразуем из 1,2,3 в 0 и 4,5 в 1.

# Загрузка данных df = pd.read_csv('train_reviews.csv', sep=';') texts = df['product_review'].values ratings = df['product_rating'].values # Если нужно вывести значения из файла #print(texts) #print(ratings) # Преобразование оценок в бинарные метки (0 - плохой, 1 - хороший) labels = (ratings >= 4).astype(int) # 4-5 = хороший, 1-3 = плохой

Затем добавляем блок с обработкой текста.

# Токенизация tokenizer = Tokenizer(num_words=1000) tokenizer.fit_on_texts(texts) sequences = tokenizer.texts_to_sequences(texts) padded = pad_sequences(sequences, maxlen=1000) # Разделение на train/test X_train, X_test, y_train, y_test = train_test_split(padded, labels, test_size=0.2)

tokenizer.texts_to_sequences преобразует слова в числовые последовательности

pad_sequences выравнивает все тексты до длины 1000, параметром maxlen можно менять эту длину, главное чтобы эта цифра совпадала в блоке создания модели input_length и в файле сервера, иначе будет вылезать ошибка.

Затем добавляем блок создания модели:

# Создание модели model = Sequential([ Embedding(1000, 32, input_length=1000), LSTM(64), Dense(1, activation='sigmoid') ]) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Обучение model.fit(X_train, y_train, epochs=30, validation_data=(X_test, y_test))

Немного про модель:

- Использует Embedding для преобразования текста в числовые векторы

- LSTM для анализа последовательности слов

- Sigmoid для бинарного предсказания (0-1)

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

Еще можно усложнить модель и заменить например на:

model = Sequential([ Embedding(1000, 64, input_length=100), LSTM(128, return_sequences=True), LSTM(64), Dense(1, activation='sigmoid') ])

И теперь нам нужно указать куда и в каком формате сохранять нашу модель:

# Сохранение модели и токенизатора model.save('review_model.h5') pd.to_pickle(tokenizer, 'tokenizer.pkl')

Теперь нужно запустить наш файл train.py командой:

python3 train.py

Файл с отзывами должен быть расположен рядом с train.py.

Теперь перейдем к запуску обученной нами модели, для этого можно сделать простой сервер на flask, для этого сохраняем код в файл server.py

from flask import Flask, request, jsonify import numpy as np import pandas as pd from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing.sequence import pad_sequences app = Flask(__name__) # Загрузка модели и токенизатора model = load_model('review_model.h5') tokenizer = pd.read_pickle('tokenizer.pkl') @app.route('/predict', methods=['POST']) def predict(): text = request.json['text'] text = text.lower().replace('[^\w\s]', '') # Предобработка текста seq = tokenizer.texts_to_sequences([text]) padded = pad_sequences(seq, maxlen=1000) # Предсказание prediction = model.predict(padded)[0][0] is_positive = "Хороший" if prediction >= 0.5 else "Плохой" return jsonify({ "probability_good": float(prediction), "prediction": is_positive }) if __name__ == '__main__': app.run(debug=True)

Модель и файл сервера должны находиться в одной папке, запускаем наш сервер командой:

python3 server.py

Теперь отправляем запрос например через терминал, командой:

curl -X POST http://localhost:5000/predict \ -H "Content-Type: application/json" \ -d '{"text": "Телефон работает без проблем"}'

Теперь модель работает, мы это сделали, мы молодцы!

1
1 комментарий