bertrend 0.3.2__tar.gz → 0.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bertrend-0.3.2 → bertrend-0.3.4}/PKG-INFO +70 -67
- {bertrend-0.3.2 → bertrend-0.3.4}/README.md +18 -16
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/data_loading_component.py +76 -36
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/embed_documents_component.py +4 -4
- bertrend-0.3.4/bertrend/demos/demos_utils/i18n.py +95 -0
- bertrend-0.3.4/bertrend/demos/demos_utils/i18n_translations.py +140 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/parameters_component.py +10 -10
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app.py +16 -9
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +34 -35
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +14 -13
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +62 -54
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +13 -13
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/training_page.py +24 -32
- bertrend-0.3.4/bertrend/demos/topic_analysis/i18n_translations.py +359 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/app.py +77 -80
- bertrend-0.3.4/bertrend/demos/weak_signals/i18n_translations.py +287 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/visualizations_utils.py +37 -31
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/authentication.py +0 -1
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/embedding_client.py +1 -1
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/chatgpt_summarizer.py +1 -1
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_abstractive_summarizer.py +25 -16
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_extractive_summarizer.py +34 -21
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_installation.py +1 -3
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_metrics.py +29 -23
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/data_loading.py +28 -2
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/__main__.py +3 -3
- bertrend-0.3.2/bertrend_apps/data_provider/curebot_provider.py → bertrend-0.3.4/bertrend_apps/data_provider/atom_feed_provider.py +1 -1
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +15 -8
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/old_veille_analyse.py +3 -3
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/app.py +8 -4
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_analysis.py +10 -6
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_common.py +6 -7
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_signals.py +6 -4
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_config.py +7 -7
- bertrend-0.3.2/bertrend_apps/prospective_demo/i18n.py → bertrend-0.3.4/bertrend_apps/prospective_demo/i18n_translations.py +23 -68
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/process_new_data.py +20 -2
- bertrend-0.3.4/pyproject.toml +97 -0
- bertrend-0.3.2/bertrend/demos/demos_utils/messages.py +0 -11
- bertrend-0.3.2/bertrend/demos/topic_analysis/messages.py +0 -13
- bertrend-0.3.2/bertrend/demos/weak_signals/messages.py +0 -32
- bertrend-0.3.2/pyproject.toml +0 -91
- {bertrend-0.3.2 → bertrend-0.3.4}/AUTHORS.txt +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/LICENSE.md +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/BERTopicModel.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/BERTrend.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/bertopic_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/bertrend_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/parameters.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/services_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/icons.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/state_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_summarizer_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_topic_analysis_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_weak_signals_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/summarization/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/summarization/summarizer_app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/newsletter.css +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/newsletter_features.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/openai_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/topic_metrics.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/common_ngrams.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-en.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-fr.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-rte.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/embedding_service.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/abstractive_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/extractive_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/lexrank.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/README_integration_tests.md +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/conftest.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_bertrend.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_cache_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_config_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_data_loading.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_embedding_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_integration.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_newsletter_features.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_openai_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_representative_docs.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_description.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_model.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_utils_init.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/representative_docs.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/topic_description.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/weak_signals.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/cache_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/config_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/crontab_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/mail_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/gmail_credentials.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/data_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/google_news_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/newsletters/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/newsletters/__main__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/authentication.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/models_info.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_generation.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_template.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/start_apps.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/stop_apps.sh +0 -0
|
@@ -1,72 +1,73 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: bertrend
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
|
|
5
|
-
Home-page: https://github.com/rte-france/BERTrend
|
|
6
5
|
License: LICENSE.md
|
|
7
|
-
Keywords: topics,BERTopic,transformers,weak signals
|
|
6
|
+
Keywords: topics,BERTopic,transformers,weak signals,LLM
|
|
8
7
|
Author: Jérôme Picault
|
|
9
8
|
Author-email: jerome.picault@rte-france.com
|
|
9
|
+
Maintainer: Jérôme Picault
|
|
10
|
+
Maintainer-email: jerome.picault@rte-france.com
|
|
10
11
|
Requires-Python: >=3.12,<4.0
|
|
11
|
-
Classifier:
|
|
12
|
-
Classifier: Programming Language :: Python :: 3
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
14
13
|
Provides-Extra: apps
|
|
15
|
-
Provides-Extra: tests
|
|
16
14
|
Requires-Dist: Pyqtree (==1.0.0)
|
|
17
|
-
Requires-Dist: arxiv (>=2.2.0
|
|
15
|
+
Requires-Dist: arxiv (>=2.2.0) ; extra == "apps"
|
|
18
16
|
Requires-Dist: bertopic (==0.16.2)
|
|
19
|
-
Requires-Dist: black (>=24.10.0
|
|
20
|
-
Requires-Dist: coverage (>=7.6.9
|
|
21
|
-
Requires-Dist: cron-descriptor (>=1.4.5
|
|
17
|
+
Requires-Dist: black (>=24.10.0)
|
|
18
|
+
Requires-Dist: coverage (>=7.6.9)
|
|
19
|
+
Requires-Dist: cron-descriptor (>=1.4.5)
|
|
22
20
|
Requires-Dist: dask (==2024.12.0)
|
|
23
21
|
Requires-Dist: datamapplot (==0.3.0)
|
|
24
|
-
Requires-Dist: dateparser (>=1.2.0
|
|
25
|
-
Requires-Dist: dill (>=0.4.0
|
|
26
|
-
Requires-Dist: feedparser (>=6.0.11
|
|
27
|
-
Requires-Dist: gensim (
|
|
28
|
-
Requires-Dist: google-api-python-client (>=2.148.0
|
|
29
|
-
Requires-Dist: google-auth-oauthlib (>=1.2.1
|
|
30
|
-
Requires-Dist: googlenewsdecoder (>=0.1.7
|
|
31
|
-
Requires-Dist: goose3 (>=3.1.19
|
|
32
|
-
Requires-Dist: hdbscan (>=0.8.40
|
|
33
|
-
Requires-Dist: ipython (>=8.28.0
|
|
34
|
-
Requires-Dist: joblib (>=1.4.2
|
|
35
|
-
Requires-Dist: jsonlines (>=4.0.0
|
|
36
|
-
Requires-Dist: langchain-
|
|
37
|
-
Requires-Dist:
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
Requires-Dist: newspaper4k (>=0.9.3.1,<0.10.0.0) ; extra == "apps"
|
|
45
|
-
Requires-Dist: nltk (>=3.9.1,<4.0.0)
|
|
22
|
+
Requires-Dist: dateparser (>=1.2.0)
|
|
23
|
+
Requires-Dist: dill (>=0.4.0)
|
|
24
|
+
Requires-Dist: feedparser (>=6.0.11) ; extra == "apps"
|
|
25
|
+
Requires-Dist: gensim (>=4.3.3)
|
|
26
|
+
Requires-Dist: google-api-python-client (>=2.148.0) ; extra == "apps"
|
|
27
|
+
Requires-Dist: google-auth-oauthlib (>=1.2.1) ; extra == "apps"
|
|
28
|
+
Requires-Dist: googlenewsdecoder (>=0.1.7) ; extra == "apps"
|
|
29
|
+
Requires-Dist: goose3 (>=3.1.19) ; extra == "apps"
|
|
30
|
+
Requires-Dist: hdbscan (>=0.8.40)
|
|
31
|
+
Requires-Dist: ipython (>=8.28.0)
|
|
32
|
+
Requires-Dist: joblib (>=1.4.2)
|
|
33
|
+
Requires-Dist: jsonlines (>=4.0.0)
|
|
34
|
+
Requires-Dist: langchain-core (>=0.3.59)
|
|
35
|
+
Requires-Dist: langdetect (>=1.0.9)
|
|
36
|
+
Requires-Dist: loguru (>=0.7.3)
|
|
37
|
+
Requires-Dist: lxml-html-clean (>=0.2.2)
|
|
38
|
+
Requires-Dist: markdown (>=3.7)
|
|
39
|
+
Requires-Dist: newscatcherapi (>=0.7.3) ; extra == "apps"
|
|
40
|
+
Requires-Dist: newspaper4k (>=0.9.3.1) ; extra == "apps"
|
|
41
|
+
Requires-Dist: nltk (>=3.9.1)
|
|
46
42
|
Requires-Dist: numpy (<2)
|
|
47
|
-
Requires-Dist: openai (>=1.77.0
|
|
43
|
+
Requires-Dist: openai (>=1.77.0)
|
|
44
|
+
Requires-Dist: openpyxl (>=3.1.5)
|
|
48
45
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
|
|
49
|
-
Requires-Dist: pandas (>=2.2.2
|
|
50
|
-
Requires-Dist: plotly (>=5.24.1
|
|
51
|
-
Requires-Dist: plotly-resampler (>=0.10.0
|
|
52
|
-
Requires-Dist: pygooglenews (>=0.1.3
|
|
46
|
+
Requires-Dist: pandas (>=2.2.2)
|
|
47
|
+
Requires-Dist: plotly (>=5.24.1)
|
|
48
|
+
Requires-Dist: plotly-resampler (>=0.10.0)
|
|
49
|
+
Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
|
|
53
50
|
Requires-Dist: pylabeladjust (==0.1.13)
|
|
54
|
-
Requires-Dist: pytest (>=8.3.3
|
|
55
|
-
Requires-Dist: requests (>=2.32.3
|
|
56
|
-
Requires-Dist: scikit-learn (>=1.5.2
|
|
51
|
+
Requires-Dist: pytest (>=8.3.3)
|
|
52
|
+
Requires-Dist: requests (>=2.32.3)
|
|
53
|
+
Requires-Dist: scikit-learn (>=1.5.2)
|
|
57
54
|
Requires-Dist: scipy (==1.12)
|
|
58
|
-
Requires-Dist: seaborn (>=0.13.2
|
|
55
|
+
Requires-Dist: seaborn (>=0.13.2)
|
|
59
56
|
Requires-Dist: sentence-transformers (==3.0.1)
|
|
60
|
-
Requires-Dist: sentencepiece (>=0.2.0
|
|
61
|
-
Requires-Dist:
|
|
62
|
-
Requires-Dist: streamlit
|
|
63
|
-
Requires-Dist:
|
|
64
|
-
Requires-Dist:
|
|
57
|
+
Requires-Dist: sentencepiece (>=0.2.0)
|
|
58
|
+
Requires-Dist: starlette (>=0.46.2)
|
|
59
|
+
Requires-Dist: streamlit (>=1.45.0)
|
|
60
|
+
Requires-Dist: streamlit-code-editor (>=0.1.22)
|
|
61
|
+
Requires-Dist: thefuzz (>=0.22.1)
|
|
62
|
+
Requires-Dist: tiktoken (>=0.8.0)
|
|
65
63
|
Requires-Dist: tldextract (>=2.0.1)
|
|
66
64
|
Requires-Dist: tokenizers (<0.20.0)
|
|
67
|
-
Requires-Dist: torch (
|
|
68
|
-
Requires-Dist: tqdm (>=4.67.1
|
|
69
|
-
Requires-Dist: umap-learn (>=0.5.7
|
|
65
|
+
Requires-Dist: torch (>=2.7.0)
|
|
66
|
+
Requires-Dist: tqdm (>=4.67.1)
|
|
67
|
+
Requires-Dist: umap-learn (>=0.5.7)
|
|
68
|
+
Project-URL: Bug Tracker, https://github.com/rte-france/BERTrend/issues
|
|
69
|
+
Project-URL: Documentation, https://github.com/rte-france/BERTrend
|
|
70
|
+
Project-URL: Homepage, https://github.com/rte-france/BERTrend
|
|
70
71
|
Project-URL: Repository, https://github.com/rte-france/BERTrend
|
|
71
72
|
Description-Content-Type: text/markdown
|
|
72
73
|
|
|
@@ -78,7 +79,7 @@ Description-Content-Type: text/markdown
|
|
|
78
79
|
[](https://github.com/rte-france/BERTrend/issues)
|
|
79
80
|
[](https://pepy.tech/project/bertrend)
|
|
80
81
|
[](https://pypi.org/project/bertrend/)
|
|
81
|
-
|
|
82
|
+

|
|
82
83
|

|
|
83
84
|
|
|
84
85
|

|
|
@@ -137,7 +138,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
137
138
|
- Categorization of signals into three different dataframes: noise, weak and strong signals
|
|
138
139
|
(each dataframe contains useful information about the signals)
|
|
139
140
|
- Interpretation of these signals using LLMs
|
|
140
|
-
- Inspection of topic merging process using Sankey diagram
|
|
141
|
+
- Inspection of the topic merging process using Sankey diagram
|
|
141
142
|
|
|
142
143
|
## Installation
|
|
143
144
|
|
|
@@ -174,19 +175,14 @@ BERTrend requires the following environment variables to be set:
|
|
|
174
175
|
# Basic installation with core dependencies
|
|
175
176
|
pip install . # or poetry install
|
|
176
177
|
|
|
177
|
-
|
|
178
|
-
pip install ".[
|
|
178
|
+
# Installation with apps dependencies
|
|
179
|
+
pip install ".[apps]" # or poetry install --extras apps
|
|
179
180
|
|
|
180
|
-
# Installation with apps dependencies
|
|
181
|
-
pip install ".[apps]" # or poetry install --with apps
|
|
182
|
-
|
|
183
|
-
# Installation with all optional dependencies
|
|
184
|
-
pip install ".[tests,apps]" # or poetry install --with test,apps
|
|
185
181
|
```
|
|
186
182
|
|
|
187
183
|
- (Use `pip install -e .` for a local installation)
|
|
188
184
|
|
|
189
|
-
NB. Due to the number of dependencies, the installation may take some time on an empty
|
|
185
|
+
NB. Due to the number of dependencies, the installation may take some time on an empty environment.
|
|
190
186
|
|
|
191
187
|
### Dependency Management
|
|
192
188
|
|
|
@@ -232,7 +228,7 @@ For custom dataset creation, please refer to the documentation page about [data
|
|
|
232
228
|
|
|
233
229
|
In order to use the provided demos, datasets :
|
|
234
230
|
- can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
|
|
235
|
-
- or can be uploaded from the client device on which
|
|
231
|
+
- or can be uploaded from the client device on which are displayed the Streamlit apps.
|
|
236
232
|
|
|
237
233
|
#### Dataset Format
|
|
238
234
|
Required columns:
|
|
@@ -259,6 +255,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
|
|
|
259
255
|
- `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
|
|
260
256
|
The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
|
|
261
257
|
|
|
258
|
+
We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
|
|
259
|
+
|
|
260
|
+
The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
|
|
261
|
+
|
|
262
|
+
An example of a very simple implementation to deploy a separate embedding service can be found here: https://github.com/rte-france/wattelse/tree/main/wattelse/api/embedding. (this implementation is compatible with our code)
|
|
263
|
+
|
|
264
|
+
|
|
262
265
|

|
|
263
266
|
|
|
264
267
|
Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
|
|
@@ -277,7 +280,7 @@ The application is split into several pages:
|
|
|
277
280
|
- Computes topics over time
|
|
278
281
|

|
|
279
282
|
|
|
280
|
-
- Allow
|
|
283
|
+
- Allow selecting sources and generating short descriptions for each theme
|
|
281
284
|

|
|
282
285
|
|
|
283
286
|
- `Topic visualization`: Several visualization types available:
|
|
@@ -295,7 +298,7 @@ The application is split into several pages:
|
|
|
295
298
|

|
|
296
299
|
|
|
297
300
|
- `Generate Newsletters`
|
|
298
|
-
- This is an example of application combining topic analysis and LLMs
|
|
301
|
+
- This is an example of an application combining topic analysis and LLMs
|
|
299
302
|
- Generates newsletters based on prominent topics
|
|
300
303
|
- Uses LLMs to generate topic descriptions and summarize representative documents
|
|
301
304
|
|
|
@@ -344,8 +347,8 @@ Provides various statistics about topics:
|
|
|
344
347
|
- As topics are hard to interprete by humans, we showcase how it can be
|
|
345
348
|
done using LLMs.
|
|
346
349
|
- Choose a specific topic and click on the button to generate an interpretation
|
|
347
|
-
- LLM-based in-depth signal analysis is done using predefined templates for example:
|
|
348
|
-
- describe what
|
|
350
|
+
- LLM-based in-depth signal analysis is done using predefined templates, for example:
|
|
351
|
+
- describe what's happened since the last timestamp (summary of main events)
|
|
349
352
|
- present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
|
|
350
353
|
|
|
351
354
|
|
|
@@ -373,7 +376,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
|
|
|
373
376
|
|
|
374
377
|
## License Information
|
|
375
378
|
|
|
376
|
-
Copyright 2023
|
|
379
|
+
Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
|
|
377
380
|
|
|
378
381
|
This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available here: https://www.mozilla.org/en-US/MPL/2.0/
|
|
379
382
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](https://github.com/rte-france/BERTrend/issues)
|
|
7
7
|
[](https://pepy.tech/project/bertrend)
|
|
8
8
|
[](https://pypi.org/project/bertrend/)
|
|
9
|
-
|
|
9
|
+

|
|
10
10
|

|
|
11
11
|
|
|
12
12
|

|
|
@@ -65,7 +65,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
65
65
|
- Categorization of signals into three different dataframes: noise, weak and strong signals
|
|
66
66
|
(each dataframe contains useful information about the signals)
|
|
67
67
|
- Interpretation of these signals using LLMs
|
|
68
|
-
- Inspection of topic merging process using Sankey diagram
|
|
68
|
+
- Inspection of the topic merging process using Sankey diagram
|
|
69
69
|
|
|
70
70
|
## Installation
|
|
71
71
|
|
|
@@ -102,19 +102,14 @@ BERTrend requires the following environment variables to be set:
|
|
|
102
102
|
# Basic installation with core dependencies
|
|
103
103
|
pip install . # or poetry install
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
pip install ".[
|
|
105
|
+
# Installation with apps dependencies
|
|
106
|
+
pip install ".[apps]" # or poetry install --extras apps
|
|
107
107
|
|
|
108
|
-
# Installation with apps dependencies
|
|
109
|
-
pip install ".[apps]" # or poetry install --with apps
|
|
110
|
-
|
|
111
|
-
# Installation with all optional dependencies
|
|
112
|
-
pip install ".[tests,apps]" # or poetry install --with test,apps
|
|
113
108
|
```
|
|
114
109
|
|
|
115
110
|
- (Use `pip install -e .` for a local installation)
|
|
116
111
|
|
|
117
|
-
NB. Due to the number of dependencies, the installation may take some time on an empty
|
|
112
|
+
NB. Due to the number of dependencies, the installation may take some time on an empty environment.
|
|
118
113
|
|
|
119
114
|
### Dependency Management
|
|
120
115
|
|
|
@@ -160,7 +155,7 @@ For custom dataset creation, please refer to the documentation page about [data
|
|
|
160
155
|
|
|
161
156
|
In order to use the provided demos, datasets :
|
|
162
157
|
- can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
|
|
163
|
-
- or can be uploaded from the client device on which
|
|
158
|
+
- or can be uploaded from the client device on which are displayed the Streamlit apps.
|
|
164
159
|
|
|
165
160
|
#### Dataset Format
|
|
166
161
|
Required columns:
|
|
@@ -187,6 +182,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
|
|
|
187
182
|
- `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
|
|
188
183
|
The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
|
|
189
184
|
|
|
185
|
+
We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
|
|
186
|
+
|
|
187
|
+
The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
|
|
188
|
+
|
|
189
|
+
An example of a very simple implementation to deploy a separate embedding service can be found here: https://github.com/rte-france/wattelse/tree/main/wattelse/api/embedding. (this implementation is compatible with our code)
|
|
190
|
+
|
|
191
|
+
|
|
190
192
|

|
|
191
193
|
|
|
192
194
|
Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
|
|
@@ -205,7 +207,7 @@ The application is split into several pages:
|
|
|
205
207
|
- Computes topics over time
|
|
206
208
|

|
|
207
209
|
|
|
208
|
-
- Allow
|
|
210
|
+
- Allow selecting sources and generating short descriptions for each theme
|
|
209
211
|

|
|
210
212
|
|
|
211
213
|
- `Topic visualization`: Several visualization types available:
|
|
@@ -223,7 +225,7 @@ The application is split into several pages:
|
|
|
223
225
|

|
|
224
226
|
|
|
225
227
|
- `Generate Newsletters`
|
|
226
|
-
- This is an example of application combining topic analysis and LLMs
|
|
228
|
+
- This is an example of an application combining topic analysis and LLMs
|
|
227
229
|
- Generates newsletters based on prominent topics
|
|
228
230
|
- Uses LLMs to generate topic descriptions and summarize representative documents
|
|
229
231
|
|
|
@@ -272,8 +274,8 @@ Provides various statistics about topics:
|
|
|
272
274
|
- As topics are hard to interprete by humans, we showcase how it can be
|
|
273
275
|
done using LLMs.
|
|
274
276
|
- Choose a specific topic and click on the button to generate an interpretation
|
|
275
|
-
- LLM-based in-depth signal analysis is done using predefined templates for example:
|
|
276
|
-
- describe what
|
|
277
|
+
- LLM-based in-depth signal analysis is done using predefined templates, for example:
|
|
278
|
+
- describe what's happened since the last timestamp (summary of main events)
|
|
277
279
|
- present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
|
|
278
280
|
|
|
279
281
|
|
|
@@ -301,7 +303,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
|
|
|
301
303
|
|
|
302
304
|
## License Information
|
|
303
305
|
|
|
304
|
-
Copyright 2023
|
|
306
|
+
Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
|
|
305
307
|
|
|
306
308
|
This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available here: https://www.mozilla.org/en-US/MPL/2.0/
|
|
307
309
|
|
|
@@ -11,6 +11,10 @@ import streamlit as st
|
|
|
11
11
|
from streamlit.runtime.uploaded_file_manager import UploadedFile
|
|
12
12
|
|
|
13
13
|
from bertrend import DATA_PATH
|
|
14
|
+
from bertrend.demos.demos_utils.i18n import (
|
|
15
|
+
translate,
|
|
16
|
+
get_current_internationalization_language,
|
|
17
|
+
)
|
|
14
18
|
from bertrend.demos.demos_utils.icons import (
|
|
15
19
|
WARNING_ICON,
|
|
16
20
|
JSON_ICON,
|
|
@@ -20,7 +24,6 @@ from bertrend.demos.demos_utils.icons import (
|
|
|
20
24
|
CLIENT_STORAGE_ICON,
|
|
21
25
|
SERVER_STORAGE_ICON,
|
|
22
26
|
)
|
|
23
|
-
from bertrend.demos.demos_utils.messages import NO_DATA_AFTER_PREPROCESSING_MESSAGE
|
|
24
27
|
from bertrend.demos.demos_utils.state_utils import (
|
|
25
28
|
save_widget_state,
|
|
26
29
|
register_widget,
|
|
@@ -33,9 +36,9 @@ from bertrend.utils.data_loading import (
|
|
|
33
36
|
load_data,
|
|
34
37
|
split_data,
|
|
35
38
|
TIMESTAMP_COLUMN,
|
|
39
|
+
DataLoadingError,
|
|
36
40
|
)
|
|
37
41
|
|
|
38
|
-
NO_DATASET_WARNING = "Please select at least one dataset to proceed."
|
|
39
42
|
FORMAT_ICONS = {
|
|
40
43
|
"xlsx": XLSX_ICON,
|
|
41
44
|
"csv": CSV_ICON,
|
|
@@ -47,6 +50,7 @@ FORMAT_ICONS = {
|
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
|
|
53
|
+
@st.cache_data(ttl=60 * 60 * 24)
|
|
50
54
|
def _process_uploaded_files(
|
|
51
55
|
files: list[UploadedFile],
|
|
52
56
|
) -> list[pd.DataFrame]:
|
|
@@ -57,15 +61,25 @@ def _process_uploaded_files(
|
|
|
57
61
|
with open(tmpdir + "/" + f.name, "wb") as tmp_file:
|
|
58
62
|
tmp_file.write(f.getvalue())
|
|
59
63
|
if tmp_file is not None:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
try:
|
|
65
|
+
df = load_data(
|
|
66
|
+
Path(tmp_file.name),
|
|
67
|
+
SessionStateManager.get("language", "French"),
|
|
68
|
+
)
|
|
69
|
+
except DataLoadingError as dle:
|
|
70
|
+
st.warning(
|
|
71
|
+
translate("error_loading_file").format(
|
|
72
|
+
file_name=f.name, error=dle
|
|
73
|
+
),
|
|
74
|
+
icon=WARNING_ICON,
|
|
75
|
+
)
|
|
76
|
+
df = None
|
|
64
77
|
if df is not None:
|
|
65
78
|
dataframes.append(df)
|
|
66
79
|
return dataframes
|
|
67
80
|
|
|
68
81
|
|
|
82
|
+
@st.cache_data(ttl=60 * 60 * 24)
|
|
69
83
|
def _load_files(
|
|
70
84
|
files: list[Path],
|
|
71
85
|
) -> list[pd.DataFrame]:
|
|
@@ -73,10 +87,19 @@ def _load_files(
|
|
|
73
87
|
dfs = []
|
|
74
88
|
for selected_file in files:
|
|
75
89
|
file_path = DATA_PATH / selected_file
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
90
|
+
try:
|
|
91
|
+
df = load_data(
|
|
92
|
+
file_path,
|
|
93
|
+
SessionStateManager.get("language", "French"),
|
|
94
|
+
)
|
|
95
|
+
except DataLoadingError as dle:
|
|
96
|
+
st.warning(
|
|
97
|
+
translate("error_loading_file").format(
|
|
98
|
+
file_name=file_path.name, error=dle
|
|
99
|
+
),
|
|
100
|
+
icon=WARNING_ICON,
|
|
101
|
+
)
|
|
102
|
+
df = None
|
|
80
103
|
if df is not None:
|
|
81
104
|
dfs.append(df)
|
|
82
105
|
return dfs
|
|
@@ -85,7 +108,7 @@ def _load_files(
|
|
|
85
108
|
# TODO: if loaded data column names do not match our default values, show a popup for column data mapping
|
|
86
109
|
def display_data_loading_component():
|
|
87
110
|
"""
|
|
88
|
-
Component for a streamlit app about topic
|
|
111
|
+
Component for a streamlit app about topic modeling. It allows choosing data to load and preprocess data.
|
|
89
112
|
Preprocessing of data includes:
|
|
90
113
|
- concatenation of data from different files
|
|
91
114
|
- adding potentially missing columns to make all datasets homogeneous
|
|
@@ -100,23 +123,23 @@ def display_data_loading_component():
|
|
|
100
123
|
state variable "time_filtered_df".
|
|
101
124
|
"""
|
|
102
125
|
# Data loading section
|
|
103
|
-
st.header("
|
|
126
|
+
st.header(translate("data_loading"))
|
|
104
127
|
|
|
105
128
|
# Find files in the current directory and subdirectories
|
|
106
129
|
tab1, tab2 = st.tabs(
|
|
107
130
|
[
|
|
108
|
-
CLIENT_STORAGE_ICON + "
|
|
109
|
-
SERVER_STORAGE_ICON + "
|
|
131
|
+
CLIENT_STORAGE_ICON + " " + translate("local_data"),
|
|
132
|
+
SERVER_STORAGE_ICON + " " + translate("remote_data"),
|
|
110
133
|
]
|
|
111
134
|
)
|
|
112
135
|
compatible_extensions = FORMAT_ICONS.keys()
|
|
113
136
|
|
|
114
137
|
with tab1:
|
|
115
138
|
st.file_uploader(
|
|
116
|
-
label="
|
|
139
|
+
label=translate("select_from_local_storage"),
|
|
117
140
|
type=compatible_extensions,
|
|
118
141
|
accept_multiple_files=True,
|
|
119
|
-
help="
|
|
142
|
+
help=translate("drag_drop_help"),
|
|
120
143
|
on_change=save_widget_state,
|
|
121
144
|
key="uploaded_files",
|
|
122
145
|
)
|
|
@@ -124,7 +147,7 @@ def display_data_loading_component():
|
|
|
124
147
|
with tab2:
|
|
125
148
|
register_widget("selected_files")
|
|
126
149
|
st.multiselect(
|
|
127
|
-
label="
|
|
150
|
+
label=translate("select_from_remote_storage"),
|
|
128
151
|
options=find_compatible_files(DATA_PATH, compatible_extensions),
|
|
129
152
|
default=SessionStateManager.get("selected_files", []),
|
|
130
153
|
key="selected_files",
|
|
@@ -137,7 +160,7 @@ def display_data_loading_component():
|
|
|
137
160
|
and not SessionStateManager.get("selected_files")
|
|
138
161
|
and "initial_df" not in st.session_state
|
|
139
162
|
):
|
|
140
|
-
st.warning(
|
|
163
|
+
st.warning(translate("no_dataset_warning"), icon=WARNING_ICON)
|
|
141
164
|
st.stop()
|
|
142
165
|
|
|
143
166
|
# Load each selected file, then concatenate them
|
|
@@ -159,10 +182,10 @@ def display_data_loading_component():
|
|
|
159
182
|
|
|
160
183
|
# Save state of initial DF (before split and data selection)
|
|
161
184
|
st.session_state["initial_df"] = df.copy()
|
|
162
|
-
# If dfs is None and there is no 'initial_df' in session_state, show
|
|
185
|
+
# If dfs is None and there is no 'initial_df' in session_state, show a warning
|
|
163
186
|
elif "initial_df" not in st.session_state:
|
|
164
187
|
st.warning(
|
|
165
|
-
|
|
188
|
+
translate("no_data_after_preprocessing_message"),
|
|
166
189
|
icon=WARNING_ICON,
|
|
167
190
|
)
|
|
168
191
|
st.stop()
|
|
@@ -172,54 +195,69 @@ def display_data_loading_component():
|
|
|
172
195
|
|
|
173
196
|
# Show raw data info
|
|
174
197
|
st.write(
|
|
175
|
-
|
|
198
|
+
translate("raw_documents_count").format(
|
|
199
|
+
count=len(st.session_state["initial_df"])
|
|
200
|
+
)
|
|
176
201
|
)
|
|
177
202
|
|
|
178
203
|
# Data filtering section
|
|
179
|
-
st.header("
|
|
204
|
+
st.header(translate("data_filtering"))
|
|
180
205
|
|
|
181
206
|
# Display number input and checkbox for preprocessing options
|
|
182
207
|
col1, col2, col3 = st.columns(3)
|
|
183
208
|
with col1:
|
|
184
209
|
register_widget("min_chars")
|
|
185
210
|
st.number_input(
|
|
186
|
-
"
|
|
211
|
+
translate("minimum_characters"),
|
|
187
212
|
value=MIN_CHARS_DEFAULT,
|
|
188
213
|
min_value=0,
|
|
189
214
|
max_value=1000,
|
|
190
215
|
key="min_chars",
|
|
191
216
|
on_change=save_widget_state,
|
|
192
|
-
help="
|
|
217
|
+
help=translate("minimum_characters_help"),
|
|
193
218
|
)
|
|
194
219
|
with col2:
|
|
195
220
|
register_widget("sample_size")
|
|
196
221
|
sample_size = st.number_input(
|
|
197
|
-
"
|
|
222
|
+
translate("sample_ratio"),
|
|
198
223
|
value=SAMPLE_SIZE_DEFAULT,
|
|
199
224
|
min_value=0.0,
|
|
200
225
|
max_value=1.0,
|
|
201
226
|
key="sample_size",
|
|
202
227
|
on_change=save_widget_state,
|
|
203
|
-
help="
|
|
228
|
+
help=translate("sample_ratio_help"),
|
|
204
229
|
)
|
|
205
230
|
with col3:
|
|
206
231
|
register_widget("split_by_paragraph")
|
|
207
232
|
SessionStateManager.get_or_set("split_by_paragraph", "no")
|
|
208
233
|
st.segmented_control(
|
|
209
|
-
"
|
|
234
|
+
translate("split_by_paragraph"),
|
|
210
235
|
key="split_by_paragraph",
|
|
211
|
-
options=["
|
|
236
|
+
options=["yes", "no", "enhanced"],
|
|
212
237
|
selection_mode="single",
|
|
213
|
-
help="
|
|
214
|
-
"'Enhanced split': uses a more advanced but slower method for splitting that considers the embedding "
|
|
215
|
-
"model's maximum input length.",
|
|
238
|
+
help=translate("split_help"),
|
|
216
239
|
on_change=save_widget_state,
|
|
240
|
+
format_func=lambda x: translate("split_option_" + x),
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if get_current_internationalization_language() == "en":
|
|
244
|
+
split_by_paragraph_param = SessionStateManager.get("split_by_paragraph")
|
|
245
|
+
else:
|
|
246
|
+
# option has been translated
|
|
247
|
+
split_by_paragraph_param = (
|
|
248
|
+
"no"
|
|
249
|
+
if SessionStateManager.get("split_by_paragraph") == "non"
|
|
250
|
+
else (
|
|
251
|
+
"enhanced"
|
|
252
|
+
if SessionStateManager.get("split_by_paragraph") == "amélioré"
|
|
253
|
+
else "yes"
|
|
254
|
+
)
|
|
217
255
|
)
|
|
218
256
|
|
|
219
257
|
df = split_data(
|
|
220
|
-
df,
|
|
221
|
-
SessionStateManager.get("min_chars"),
|
|
222
|
-
SessionStateManager.get("split_by_paragraph"),
|
|
258
|
+
df=df,
|
|
259
|
+
min_chars=SessionStateManager.get("min_chars"),
|
|
260
|
+
split_by_paragraph=SessionStateManager.get("split_by_paragraph"),
|
|
223
261
|
embedding_model_name=SessionStateManager.get("embedding_model_name"),
|
|
224
262
|
)
|
|
225
263
|
|
|
@@ -235,7 +273,7 @@ def display_data_loading_component():
|
|
|
235
273
|
)
|
|
236
274
|
register_widget("timeframe_slider")
|
|
237
275
|
start_date, end_date = st.slider(
|
|
238
|
-
"
|
|
276
|
+
translate("select_timeframe"),
|
|
239
277
|
min_value=min_date,
|
|
240
278
|
max_value=max_date,
|
|
241
279
|
value=(min_date, max_date),
|
|
@@ -257,7 +295,9 @@ def display_data_loading_component():
|
|
|
257
295
|
|
|
258
296
|
SessionStateManager.set("time_filtered_df", df_filtered)
|
|
259
297
|
st.write(
|
|
260
|
-
|
|
298
|
+
translate("filtered_documents_count").format(
|
|
299
|
+
count=len(SessionStateManager.get_dataframe("time_filtered_df"))
|
|
300
|
+
)
|
|
261
301
|
)
|
|
262
302
|
st.dataframe(
|
|
263
303
|
SessionStateManager.get_dataframe("time_filtered_df")[
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
# This file is part of BERTrend.
|
|
5
5
|
import streamlit as st
|
|
6
6
|
|
|
7
|
+
from bertrend.demos.demos_utils.i18n import translate
|
|
7
8
|
from bertrend.demos.demos_utils.icons import SUCCESS_ICON
|
|
8
|
-
from bertrend.demos.demos_utils.messages import EMBEDDINGS_CALCULATED_MESSAGE
|
|
9
9
|
from bertrend.demos.demos_utils.state_utils import SessionStateManager
|
|
10
10
|
from bertrend.services.embedding_service import EmbeddingService
|
|
11
11
|
from bertrend.utils.data_loading import TEXT_COLUMN
|
|
@@ -16,8 +16,8 @@ def display_embed_documents_component():
|
|
|
16
16
|
Common Streamlit UI component for embedding documents.
|
|
17
17
|
"""
|
|
18
18
|
# Embed documents
|
|
19
|
-
if st.button("
|
|
20
|
-
with st.spinner("
|
|
19
|
+
if st.button(translate("embed_documents")):
|
|
20
|
+
with st.spinner(translate("embedding_documents")):
|
|
21
21
|
embedding_dtype = SessionStateManager.get("embedding_dtype")
|
|
22
22
|
embedding_model_name = SessionStateManager.get("embedding_model_name")
|
|
23
23
|
if SessionStateManager.get("embedding_service_type", "remote") == "local":
|
|
@@ -49,4 +49,4 @@ def display_embed_documents_component():
|
|
|
49
49
|
|
|
50
50
|
SessionStateManager.set("data_embedded", True)
|
|
51
51
|
|
|
52
|
-
st.success(
|
|
52
|
+
st.success(translate("embeddings_calculated_message"), icon=SUCCESS_ICON)
|