ISilgiz/finecode-cpp
2
1import streamlit as st2from transformers import RobertaForSequenceClassification, RobertaTokenizer3import torch4import re5import streamlit as st6from PIL import Image7 8# Функция для загрузки модели9@st.cache_resource10def load_model():11 model_name = "models_cpp" # Замените на путь к вашей модели12 model = RobertaForSequenceClassification.from_pretrained(model_name)13 tokenizer = RobertaTokenizer.from_pretrained(model_name)14 return model, tokenizer15 16# Функция для удаления комментариев из кода17def remove_comments(content):18 content = re.sub(r'//.*', '', content)19 content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)20 return content21 22# Функция для форматирования кода23def format_code(code):24 content = remove_comments(code)25 lines = content.splitlines()26 joined_instructions = []27 current_instruction = []28 open_braces = 029 open_parentheses = 030 31 for line in lines:32 stripped_line = line.strip()33 if not stripped_line:34 continue35 36 open_braces += stripped_line.count('{')37 open_braces -= stripped_line.count('}')38 open_parentheses += stripped_line.count('(')39 open_parentheses -= stripped_line.count(')')40 41 current_instruction.append(stripped_line)42 43 if open_braces == 0 and open_parentheses == 0 and (stripped_line.endswith(';') or stripped_line.endswith('}') or stripped_line.endswith('{')):44 instruction = ' '.join(current_instruction).strip()45 joined_instructions.append(re.sub(r'\s+', ' ', instruction))46 current_instruction = []47 48 if current_instruction:49 instruction = ' '.join(current_instruction).strip()50 joined_instructions.append(re.sub(r'\s+', ' ', instruction))51 52 return '\n'.join(joined_instructions)53 54# Функция для классификации кода55def classify_code(model, tokenizer, code):56 formatted_code = format_code(code)57 inputs = tokenizer(formatted_code, return_tensors="pt")58 outputs = model(**inputs)59 prediction = torch.argmax(outputs.logits, dim=1).item()60 result = "Правильный" if prediction == 1 else "Неправильный"61 return result62 63# Интерфейс Streamlit64st.title("Классификатор кода")65st.markdown("Введите свой код в текстовое поле ниже и нажмите кнопку для классификации.")66 67# Ввод кода через текстовое поле68code_input = st.text_area("Введите ваш код здесь", height=300)69 70# Кнопка для классификации71if st.button("Классифицировать код"):72 model, tokenizer = load_model() # Загрузка модели73 result = classify_code(model, tokenizer, code_input)74 st.write(f"Классификация: **{result}**")75 76st.markdown("---") # Добавляет еще одну горизонтальную линию77 78# Заголовок и описание модели79st.title("Оценка модели для классификации кода")80st.markdown("""81Это приложение демонстрирует основные метрики качества обученной модели для классификации корректности кода.82Здесь представлены метрики, такие как Accuracy, Precision, Recall, F1-Score, ROC-кривая и матрица ошибок.83""")84 85st.header("Метрики модели")86metrics = {87 "Ошибка на обучающей выборке (Train Loss)": 0.2648,88 "Ошибка на тестовой выборке (Eval Loss)": 0.1514,89 "Точность (Accuracy)": 0.9545,90 "Полнота (Recall)": 0.9390,91 "Точность предсказаний (Precision)": 0.9694,92 "F1-мера (F1 Score)": 0.9539,93 "Логарифмическая потеря (Log Loss)": 1.3854,94 "Коэффициент корреляции Мэтьюса (MCC)": 0.9095,95 "Среднеквадратичная ошибка (MSE)": 7.9419,96 "Корень из среднеквадратичной ошибки (RMSE)": 2.8181,97 "Каппа Коэна (Cohen's Kappa)": 0.9090,98 "Точность в топ-5 (Top-5 Accuracy)": 1.0000,99 "Площадь под PR-кривой (PR AUC)": 0.9917,100 "Сбалансированная точность (Balanced Accuracy)": 0.9546,101 "Индекс Жаккара (Jaccard Index)": 0.9119102}103 104# Отображение метрик105for metric_name, value in metrics.items():106 st.write(f"**{metric_name}:** {value:.4f}")107 108# Вставка изображения ROC-кривой109st.header("ROC-кривая")110roc_image = Image.open("img_2.png") # Замените на ваш путь к файлу изображения111st.image(roc_image, caption='ROC-кривая', use_column_width=True)112 113# Вставка изображения матрицы ошибок114st.header("Матрица ошибок")115confusion_image = Image.open("img_1.png") # Замените на ваш путь к файлу изображения116st.image(confusion_image, caption='Матрица ошибок', use_column_width=True)117 118 119# Personal information at the bottom of the interface120st.markdown("---") # Adds a horizontal line for separation121st.markdown("**Full Name:** ilgiz Sulaymanov")122st.markdown("**Place of Study:** Zhusup Balasagyn Kyrgyz National University")123st.markdown("**Email:** sulaymanovilgiz00@gmail.com")