Spaces:
Sleeping
Sleeping
File size: 4,230 Bytes
1867879 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
import streamlit as st
import pandas as pd
import torch
import torch.nn as nn
import nltk
nltk.download('stopwords')
nltk.download('punkt_tab')
nltk.download('wordnet')
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
stop_words = set(stopwords.words('russian'))
from nltk.tokenize import word_tokenize
import re
import string
from collections import Counter
import numpy as np
from typing import List
import time
from models.rest.model_lstm import LSTM_Word2Vec_Attention
# # Добавление цвета для значений F1-Macro
def color_high(val):
color = 'lightgreen' if val > 0.80 else ''
return f'background-color: {color}'
# Данные для первой таблицы
data1 = {
"Модель": ["Линейная регрессия", "Дерево решений"],
"F1-Macro": [0.2235, 0.1688]
}
# Данные для второй таблицы
data2 = {
"Модель": ["Линейная регрессия", "Наивный Байес", "Деревья", "XGBoost", "CatBoost"],
"F1-Macro": [0.7821, 0.7313, 0.8170, 0.7785, 0.7693]
}
# Создание DataFrame
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
st.title(":blue[_Классификация отзывов на рестораны_]")
st.image('images/53896.jpg')
# Отображение заголовков и таблиц
st.subheader("Сравнение моделей по метрике F1-Macro")
st.subheader("Начало. До понимания, что данные хуже чем можно было представить")
st.table(df1)
st.subheader("После всего... Работа классических ML-моделей")
df2 = df2.style.applymap(color_high, subset=['F1-Macro'])
st.table(df2)
# Загрузка модели и весов
@st.cache_data()
def load_model():
hidden_size = 32
vocab_size = 310
embedding_dim = 50
model = LSTM_Word2Vec_Attention(hidden_size, vocab_size, embedding_dim)
model.load_state_dict(torch.load('models/rest/model_weights_3000cl.pt', map_location=torch.device('cpu')))
model.eval()
return model
model = load_model()
# Предобработка текста
def preprocess_text(text: str) -> List[str]:
text = text.lower()
text = re.sub(r'<.*?>', '', text)
text = re.sub(r"[…–”—]", "", text)
text = re.sub(r'\d+', '', text)
text = re.sub(r'\b[a-zA-Z]+\b', '', text)
text = re.sub(r'\s+', ' ', text).strip()
text = ''.join([c for c in text if c not in string.punctuation])
tokens = word_tokenize(text, language='russian')
tokens = [word for word in tokens if word not in stopwords.words('russian')]
return tokens
# Словарь
# Предположим, что у вас есть словарь, который вы использовали для обучения модели
vocab_to_int = np.load('models/rest/vocab_to_int.npy', allow_pickle=True).item()
# Функция для преобразования текста в индексы
def text_to_indices(text: str) -> torch.Tensor:
tokens = preprocess_text(text)
indices = [vocab_to_int.get(token, 0) for token in tokens] # 0 для неизвестных слов
return torch.tensor([indices[:200] + [0]*(200 - len(indices))]) # Пэддинг до 200
st.title("Классификация отзывов о ресторанах")
st.image('images/grafic.jpg')
review = st.text_area("Введите ваш отзыв о ресторане:")
if st.button("Предсказать"):
if review.strip() == "":
st.write("Пожалуйста, введите отзыв.")
else:
start_time = time.time()
input_data = text_to_indices(review)
with torch.no_grad():
output, attention_weights = model(input_data)
prediction = torch.argmax(output, dim=1).item()
end_time = time.time()
elapsed_time = end_time - start_time
st.write(f"Предсказанный класс: {prediction} (Положительный: 2, Отрицательный: 1, Нейтральный: 0)")
st.write(f"Время предсказания: {elapsed_time:.3f} секунд")
|