Spaces:
Sleeping
Sleeping
Kolesnikov Dmitry commited on
Commit ·
6dcad4a
1
Parent(s): 753b589
fix: Ошибки на трёх страницах
Browse files- src/streamlit_app.py +42 -7
src/streamlit_app.py
CHANGED
|
@@ -497,7 +497,9 @@ def main():
|
|
| 497 |
# Проекция документов
|
| 498 |
coords = embed_2d(lsa["X_reduced"], method=proj_method)
|
| 499 |
proj_df = pd.DataFrame({"x": coords[:,0], "y": coords[:,1]})
|
| 500 |
-
|
|
|
|
|
|
|
| 501 |
|
| 502 |
# ======== Эмбеддинги (ЛР2: Word2Vec/FastText/Doc2Vec + эксперименты) ========
|
| 503 |
with main_tabs[2]:
|
|
@@ -604,7 +606,8 @@ def main():
|
|
| 604 |
)
|
| 605 |
|
| 606 |
# Создание разметки (упрощенная версия - пользователь должен разметить данные заранее)
|
| 607 |
-
st.
|
|
|
|
| 608 |
|
| 609 |
# Генерация синтетических меток для демонстрации
|
| 610 |
if "labels" not in st.session_state or st.session_state.get("task_type") != task_type:
|
|
@@ -706,16 +709,48 @@ def main():
|
|
| 706 |
st.dataframe(st.session_state["classification_results"], use_container_width=True)
|
| 707 |
|
| 708 |
# Важность признаков
|
| 709 |
-
if "vectorizer_classification" in st.session_state:
|
| 710 |
st.subheader("🔍 Важные слова")
|
| 711 |
vectorizer = st.session_state["vectorizer_classification"]
|
| 712 |
if "Logistic Regression" in selected_models:
|
| 713 |
# Создаем простую модель для демонстрации
|
| 714 |
from sklearn.linear_model import LogisticRegression
|
| 715 |
-
|
| 716 |
-
|
| 717 |
-
|
| 718 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 719 |
|
| 720 |
# ======== Кластеризация (ЛР4) ========
|
| 721 |
with main_tabs[4]:
|
|
|
|
| 497 |
# Проекция документов
|
| 498 |
coords = embed_2d(lsa["X_reduced"], method=proj_method)
|
| 499 |
proj_df = pd.DataFrame({"x": coords[:,0], "y": coords[:,1]})
|
| 500 |
+
import plotly.express as px_plot
|
| 501 |
+
fig = px_plot.scatter(proj_df, x="x", y="y", title=f"Проекция документов ({proj_method.upper()})")
|
| 502 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 503 |
|
| 504 |
# ======== Эмбеддинги (ЛР2: Word2Vec/FastText/Doc2Vec + эксперименты) ========
|
| 505 |
with main_tabs[2]:
|
|
|
|
| 606 |
)
|
| 607 |
|
| 608 |
# Создание разметки (упрощенная версия - пользователь должен разметить данные заранее)
|
| 609 |
+
with st.expander("ℹ️ Информация о данных", expanded=False):
|
| 610 |
+
st.info("💡 Для полноценной работы требуется размеченный датасет. Здесь показана демонстрация на синтетических данных, сгенерированных случайным образом.")
|
| 611 |
|
| 612 |
# Генерация синтетических меток для демонстрации
|
| 613 |
if "labels" not in st.session_state or st.session_state.get("task_type") != task_type:
|
|
|
|
| 709 |
st.dataframe(st.session_state["classification_results"], use_container_width=True)
|
| 710 |
|
| 711 |
# Важность признаков
|
| 712 |
+
if "vectorizer_classification" in st.session_state and "X_classification" in st.session_state:
|
| 713 |
st.subheader("🔍 Важные слова")
|
| 714 |
vectorizer = st.session_state["vectorizer_classification"]
|
| 715 |
if "Logistic Regression" in selected_models:
|
| 716 |
# Создаем простую модель для демонстрации
|
| 717 |
from sklearn.linear_model import LogisticRegression
|
| 718 |
+
from sklearn.multioutput import MultiOutputClassifier
|
| 719 |
+
|
| 720 |
+
# Получаем данные из session_state
|
| 721 |
+
X_full = st.session_state["X_classification"]
|
| 722 |
+
y_full = labels[:len(processed_texts)]
|
| 723 |
+
|
| 724 |
+
# Для multilabel используем MultiOutputClassifier
|
| 725 |
+
if task_type == "Многометочная":
|
| 726 |
+
# Проверяем, что y_full - это 2D массив
|
| 727 |
+
if len(y_full.shape) == 1:
|
| 728 |
+
y_full = y_full.reshape(-1, 1)
|
| 729 |
+
# Используем только часть данных для быстрой демонстрации
|
| 730 |
+
X_demo = X_full[:min(100, len(X_full))]
|
| 731 |
+
y_demo = y_full[:min(100, len(y_full))]
|
| 732 |
+
model = MultiOutputClassifier(LogisticRegression(max_iter=1000, random_state=42))
|
| 733 |
+
else:
|
| 734 |
+
# Для бинарной и многоклассовой классификации используем обычную модель
|
| 735 |
+
# Убеждаемся, что y_full - это 1D массив
|
| 736 |
+
if len(y_full.shape) > 1:
|
| 737 |
+
y_full = y_full.flatten() if y_full.shape[1] == 1 else y_full.argmax(axis=1)
|
| 738 |
+
# Используем только часть данных для быстрой демонстрации
|
| 739 |
+
X_demo = X_full[:min(100, len(X_full))]
|
| 740 |
+
y_demo = y_full[:min(100, len(y_full))]
|
| 741 |
+
model = LogisticRegression(max_iter=1000, random_state=42)
|
| 742 |
+
|
| 743 |
+
try:
|
| 744 |
+
model.fit(X_demo, y_demo)
|
| 745 |
+
# Для multilabel берем первый классификатор
|
| 746 |
+
if task_type == "Многометочная":
|
| 747 |
+
base_model = model.estimators_[0] if hasattr(model, 'estimators_') and len(model.estimators_) > 0 else model
|
| 748 |
+
else:
|
| 749 |
+
base_model = model
|
| 750 |
+
important_words = get_tfidf_important_words(vectorizer, base_model, class_idx=0, top_k=20)
|
| 751 |
+
st.dataframe(important_words, use_container_width=True)
|
| 752 |
+
except Exception as e:
|
| 753 |
+
st.warning(f"Не удалось показать важные слова: {e}")
|
| 754 |
|
| 755 |
# ======== Кластеризация (ЛР4) ========
|
| 756 |
with main_tabs[4]:
|