Spaces:
Sleeping
Sleeping
import streamlit as st | |
import torch.nn.functional as F | |
from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
import torch | |
import re | |
from nltk.tokenize import RegexpTokenizer | |
from bs4 import BeautifulSoup as bs | |
from nltk.corpus import stopwords | |
import nltk | |
nltk.download('stopwords') | |
nltk.download('punkt') | |
import pandas as pd | |
# Замените 'username/имя-вашей-модели' на путь к вашей модели на Hugging Face | |
model_name = 'Yerzhxn/class_vac' | |
# Загрузка токенизатора и модели | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
model = AutoModelForSequenceClassification.from_pretrained(model_name) | |
# Перемещение модели на устройство (если есть GPU) | |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
model.to(device) | |
def preprocess(sentence): | |
soup = bs(sentence, features="html.parser") | |
sentence = soup.get_text() | |
soup = bs(sentence, features="html.parser") | |
sentence = soup.get_text() | |
sentence = str(sentence) | |
sentence = sentence.lower() | |
sentence = sentence.replace('{html}',"") | |
cleanr = re.compile('<.*?>') | |
cleantext = re.sub(cleanr, '', sentence) | |
rem_url = re.sub(r'http\S+', '',cleantext) | |
rem_num = re.sub('[0-9]+', '', rem_url) | |
tokenizer = RegexpTokenizer(r'\w+') | |
tokens = tokenizer.tokenize(rem_num) | |
filtered_words = [w for w in tokens if not w in stopwords.words('russian')] | |
return " ".join(filtered_words) | |
# Интерфейс Streamlit | |
st.title("Тестирование классификации текста") | |
st.write("Введите текст, чтобы узнать предсказанный класс.") | |
# Поле ввода текста | |
input_text = st.text_area("Введите текст здесь", "") | |
df = pd.read_excel('me.xlsx') | |
if st.button("Предсказать"): | |
if input_text: | |
input_text = preprocess(input_text) | |
# Преобразование текста в формат, подходящий для модели | |
inputs = tokenizer(input_text, return_tensors="pt", truncation=True, padding=True) | |
inputs = {key: value.to(device) for key, value in inputs.items()} | |
# Прогон текста через модель и получение предсказания | |
with torch.no_grad(): | |
outputs = model(**inputs) | |
# Преобразование выходных данных в вероятности | |
logits = outputs.logits | |
probabilities = F.softmax(logits, dim=1) | |
# Определение класса и его вероятности | |
max_prob, predicted_class = torch.max(probabilities, dim=1) | |
# Проверка вероятности для отображения результата | |
if max_prob.item() > 0.35: | |
st.write(f"Предсказанный класс: {predicted_class.item()}, вероятность: {max_prob.item():.2f}") | |
dataframe = df[df['label']==predicted_class.item()] | |
str1 = dataframe['PROF_NAME'] | |
st.write(str1.iloc[0]) | |
else: | |
st.write("Модель не уверена в предсказании (вероятность меньше 35%).") | |
else: | |
st.write("Пожалуйста, введите текст для классификации.") | |