Обучения модуля для чат-бота

Помогите пожалуйста нормально обучить модель, чтобы он мог отвечать нормально на вопросы. Он хоть и отвечает на вопросы, но очень странно. Вот сам код где создается модель

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)

Вот например, я пишу вопрос боту: Как дела? Он отвечает: Диплом или удостоверение отправим бесплатно Почтой России.


Ответы (0 шт):