Kolesnikov Dmitry commited on
Commit
6dcad4a
·
1 Parent(s): 753b589

fix: Ошибки на трёх страницах

Browse files
Files changed (1) hide show
  1. 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
- st.plotly_chart(px.scatter(proj_df, x="x", y="y", title=f"Проекция документов ({proj_method.upper()})"), use_container_width=True)
 
 
501
 
502
  # ======== Эмбеддинги (ЛР2: Word2Vec/FastText/Doc2Vec + эксперименты) ========
503
  with main_tabs[2]:
@@ -604,7 +606,8 @@ def main():
604
  )
605
 
606
  # Создание разметки (упрощенная версия - пользователь должен разметить данные заранее)
607
- st.info("💡 Для полноценной работы требуется размеченный датасет. Здесь показана демонстрация на синтетических данных.")
 
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
- model = LogisticRegression(max_iter=1000, random_state=42)
716
- model.fit(X_train, y_train)
717
- important_words = get_tfidf_important_words(vectorizer, model, class_idx=0, top_k=20)
718
- st.dataframe(important_words, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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]: