Обучения модуля для чат-бота
Помогите пожалуйста нормально обучить модель, чтобы он мог отвечать нормально на вопросы. Он хоть и отвечает на вопросы, но очень странно. Вот сам код где создается модель
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
train_data = pd.read_csv('train_SecondPilot/train_data.csv')
answer_class = pd.read_csv('train_SecondPilot/answer_class.csv')
# Объединение данных из train_data и answer_class по столбцу 'answer_class' для получения меток классов для обучения
train_data = pd.merge(train_data, answer_class, on='answer_class')
# Подготовка данных для обучения
X_train = train_data['Question']
y_train = train_data['Category']
# Создание векторизатора текста
vectorizer = CountVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)
# Преобразование разреженной матрицы в плотный массив numpy
X_train_dense = X_train_vectorized.toarray()
# Преобразование данных в тензоры PyTorch
X_train_tensor = torch.tensor(X_train_dense, dtype=torch.float32)
label_encoder = LabelEncoder()
# Преобразование категориальных меток в числовые значения
y_train_encoded = label_encoder.fit_transform(y_train)
# Преобразование в тензор PyTorch
y_train_tensor = torch.tensor(y_train_encoded, dtype=torch.long)
# Определение архитектуры нейронной сети
class NeuralNetwork(nn.Module):
def __init__(self, input_size, output_size):
super(NeuralNetwork, self).__init__()
self.fc1 = nn.Linear(input_size, 64)
self.fc2 = nn.Linear(64, output_size)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# Инициализация модели, функции потерь и оптимизатора
input_size = X_train_tensor.shape[1]
output_size = len(y_train.unique())
model = NeuralNetwork(input_size, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Обучение модели
num_epochs = 10
for epoch in range(num_epochs):
optimizer.zero_grad()
outputs = model(X_train_tensor)
loss = criterion(outputs, y_train_tensor)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
# Сохранение обученной модели
torch.save(model.state_dict(), 'model.pth')
Вот сам код, где есть ответы на вопросы для бота
import torch
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
import torch.nn as nn
import re
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
nltk.download('puntk')
nltk.download('stopwords')
class NeuralNetwork(nn.Module):
def __init__(self, input_size, output_size):
super(NeuralNetwork, self).__init__()
self.fc1 = nn.Linear(input_size, 64)
self.fc2 = nn.Linear(64, output_size)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# Предположим, что input_size и output_size известны из вашего обучения модели
input_size = 270 # Замените это на реальное значение
output_size = 10 # Замените это на реальное значение
# Создание экземпляра модели
model = NeuralNetwork(input_size, output_size)
model.load_state_dict(torch.load('model.pth'))
model.eval() # Установите модель в режим оценки
vectorizer = CountVectorizer()
train_data = pd.read_csv('train_SecondPilot/train_data.csv')
# Получение текстовых данных из столбца "Question"
X_train = train_data['Question']
# Создание экземпляра векторизатора текста
vectorizer = CountVectorizer()
# Обучение векторизатора на текстовых данных
vectorizer.fit(X_train)
# Преобразование текстовых данных в числовое представление
X_train_vectorized = vectorizer.transform(X_train)
# Преобразование разреженной матрицы в плотный массив numpy
X_train_dense = X_train_vectorized.toarray()
# Печать размерности X_train для проверки
print("Размерность X_train:", X_train_dense.shape)
def preprocess_question(question):
question_vectorized = vectorizer.transform([question])
return question_vectorized.toarray()[0]
def predict_answer(question):
# Предобработка вопроса
processed_question = preprocess_question(question)
# Преобразование вопроса в тензор PyTorch
X_question_tensor = torch.tensor(processed_question, dtype=torch.float32)
# Получение предсказанного класса от модели
output = model(X_question_tensor.unsqueeze(0)) # Добавляем размерность пакета (batch dimension)
predicted_class = torch.argmax(output).item()
# Декодирование предсказанного класса (если необходимо)
# Здесь вы можете выполнить обратное преобразование, если использовали кодирование меток
# decoded_answer = label_encoder.inverse_transform([predicted_class])[0]
# Возвращение предсказанного класса или ответа
return predicted_class
answer_class_data = pd.read_csv('train_SecondPilot/answer_class.csv')
# Функция для получения текста ответа по предсказанному классу
def get_answer_text(predicted_class):
answer_text = answer_class_data.loc[answer_class_data['answer_class'] == predicted_class, 'Answer'].values[0]
return answer_text
# Функция для предсказания ответа на вопрос с текстом ответа
def predict_answer_with_text(question):
# Предобработка вопроса и предсказание класса
predicted_class = predict_answer(question)
# Получение текста ответа по предсказанному классу
answer_text = get_answer_text(predicted_class)
return answer_text
# Пример использования
question = "Как дела"
answer_text = predict_answer_with_text(question)
print("Предсказанный ответ:", answer_text)
Вот например, я пишу вопрос боту: Как дела? Он отвечает: Диплом или удостоверение отправим бесплатно Почтой России.