bertrend 0.3.24__tar.gz → 0.4.0__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.24 → bertrend-0.4.0}/PKG-INFO +131 -98
- {bertrend-0.3.24 → bertrend-0.4.0}/README.md +118 -85
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/BERTopicModel.py +14 -16
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/BERTrend.py +11 -13
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/__init__.py +1 -2
- bertrend-0.4.0/bertrend/article_scoring/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/article_scoring.py +5 -5
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/prompts.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/scoring_agent.py +7 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/__init__.py +3 -5
- bertrend-0.4.0/bertrend/bertrend_apps/common/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/apscheduler_utils.py +8 -9
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/crontab_utils.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/date_utils.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/mail_utils.py +2 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/scheduler_utils.py +4 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__init__.py +1 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__main__.py +5 -6
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/arxiv_provider.py +5 -6
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/atom_feed_provider.py +4 -4
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/bing_news_provider.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider.py +8 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider_utils.py +12 -10
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/google_news_provider.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/newscatcher_provider.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/rss_feed_provider.py +4 -4
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/utils.py +1 -1
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/__init__.py +4 -0
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/curebot/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app.py +6 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app_utils.py +17 -9
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +1 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/prompts.py +5 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +1 -1
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +5 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab1.py +7 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab2.py +6 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab3.py +8 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/dataviz/Main_page.py +2 -2
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/dataviz/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +5 -5
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/dataviz/pages/__init__.py +5 -0
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/geolocalization/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/entity_utils.py +5 -5
- bertrend-0.4.0/bertrend/bertrend_apps/exploration/geolocalization/spacy/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +4 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/utils.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/start_apps.sh +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/stop_apps.sh +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/install_feeds_and_newsletters.py +3 -2
- bertrend-0.4.0/bertrend/bertrend_apps/newsletters/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/__main__.py +4 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/newsletter_generation.py +20 -21
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/utils.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/__init__.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/app.py +23 -19
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/authentication.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/automated_report_generation.py +22 -20
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_analysis.py +13 -11
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_common.py +4 -4
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_comparative.py +17 -17
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_signals.py +21 -17
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/data_model.py +2 -2
- bertrend-0.4.0/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +451 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_common.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_config.py +29 -15
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_data.py +5 -5
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n_translations.py +1 -3
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/llm_utils.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/models_info.py +15 -16
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/perf_utils.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/process_new_data.py +16 -15
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation.py +27 -25
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation_utils.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/start_demo.sh +1 -2
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/utils.py +1 -1
- bertrend-0.4.0/bertrend/bertrend_apps/services/__init__.py +4 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/__init__.py +5 -0
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/bertrend_service.py +4 -4
- bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/config/__init__.py +5 -0
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/config/settings.py +3 -2
- bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/models/__init__.py +4 -0
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/bertrend_app_models.py +2 -1
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/data_provider_models.py +5 -3
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/newsletters_models.py +1 -1
- bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +4 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +124 -0
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/data_provider.py +75 -54
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/info.py +3 -3
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/newsletters.py +27 -26
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/start.py +5 -5
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/status.py +4 -3
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/stop.py +2 -2
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/__init__.py +5 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +299 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/client.py +337 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +15 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/queue_manager.py +208 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +40 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +8 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +6 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/__init__.py +5 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/app.py +603 -0
- bertrend-0.4.0/bertrend/bertrend_apps/services/utils/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/services/utils/logging_utils.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/data_loading_component.py +13 -31
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/parameters_component.py +10 -12
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/state_utils.py +0 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/clickable_df_component.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/input_with_pills_component.py +3 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +10 -11
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +9 -10
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +15 -15
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/training_page.py +11 -11
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/i18n_translations.py +0 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/app.py +32 -29
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/visualizations_utils.py +10 -11
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/agent_utils.py +9 -21
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_features.py +9 -9
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/openai_client.py +52 -100
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/metrics/temporal_metrics_embedding.py +8 -7
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/metrics/topic_metrics.py +4 -4
- bertrend-0.4.0/bertrend/services/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/authentication.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_client.py +8 -10
- bertrend-0.4.0/bertrend/services/embedding_server/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/config/settings.py +3 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/main.py +2 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/models.py +1 -1
- bertrend-0.4.0/bertrend/services/embedding_server/routers/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/authentication.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/embeddings.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/info.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/security.py +11 -7
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/start.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/status.py +3 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/stop.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_service.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/Dockerfile +1 -1
- bertrend-0.4.0/bertrend/services/scheduling/__init__.py +4 -0
- bertrend-0.4.0/bertrend/services/scheduling/dashboard.html +699 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/docker-compose.yml +5 -3
- bertrend-0.4.0/bertrend/services/scheduling/job_utils/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/job_utils/job_functions.py +1 -1
- bertrend-0.4.0/bertrend/services/scheduling/models/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/models/scheduling_models.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/routers/info.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/routers/scheduling.py +16 -24
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/scheduling_service.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summarizer.py +1 -1
- bertrend-0.4.0/bertrend/services/summary/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/abstractive_summarizer.py +2 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/chatgpt_summarizer.py +2 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/extractive_summarizer.py +8 -8
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/lexrank.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/prompts.py +1 -2
- bertrend-0.4.0/bertrend/tests/__init__.py +4 -0
- bertrend-0.4.0/bertrend/tests/apps/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_bertrend_service.py +109 -22
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_lazy_scheduler.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_models.py +11 -10
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_multiworker.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_process_new_data.py +74 -60
- bertrend-0.4.0/bertrend/tests/apps/test_routers_bertrend_app.py +339 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_routers_info.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/conftest.py +1 -1
- bertrend-0.4.0/bertrend/tests/core/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_bertrend.py +6 -8
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_data_structure.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_representative_docs.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_temporal_metrics_embedding.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_description.py +5 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_metrics.py +5 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_model.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_data_structure.py +6 -6
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_prompts.py +17 -16
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_visualizations.py +8 -7
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_weak_signals.py +12 -13
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_visualizations.py +8 -7
- bertrend-0.4.0/bertrend/tests/llm/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_agent_utils.py +17 -10
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring.py +6 -5
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring_models.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_newsletter_features.py +13 -12
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_newsletter_model.py +6 -5
- bertrend-0.4.0/bertrend/tests/llm/test_openai_client.py +264 -0
- bertrend-0.4.0/bertrend/tests/services/__init__.py +4 -0
- bertrend-0.4.0/bertrend/tests/services/embedding/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/embedding/test_embedding_client.py +6 -5
- bertrend-0.4.0/bertrend/tests/services/queue/__init__.py +4 -0
- bertrend-0.4.0/bertrend/tests/services/queue/test_bertrend_worker.py +176 -0
- bertrend-0.4.0/bertrend/tests/services/queue/test_client.py +103 -0
- bertrend-0.4.0/bertrend/tests/services/queue/test_queue_manager.py +152 -0
- bertrend-0.4.0/bertrend/tests/services/scheduling/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_job_exception_fix.py +10 -12
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_scheduling_service.py +5 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_stress_test.py +12 -15
- bertrend-0.4.0/bertrend/tests/services/summarizer/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +5 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +5 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_summarizer.py +4 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/test_installation.py +6 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/test_integration.py +7 -7
- bertrend-0.4.0/bertrend/tests/utils/__init__.py +4 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_apscheduler_utils.py +50 -45
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_cache_utils.py +3 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_config_utils.py +3 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_crontab_utils.py +61 -34
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_data_loading.py +9 -8
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_date_utils.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_mail_utils.py +34 -34
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_scheduler_utils.py +8 -8
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_utils_init.py +3 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/visualizations.py +2 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/prompts.py +3 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/visualizations.py +0 -3
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/weak_signals.py +2 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/__init__.py +1 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/cache_utils.py +1 -2
- {bertrend-0.3.24 → bertrend-0.4.0}/pyproject.toml +12 -19
- bertrend-0.3.24/bertrend/services/embedding_server/__init__.py +0 -4
- bertrend-0.3.24/bertrend/services/embedding_server/routers/__init__.py +0 -4
- bertrend-0.3.24/bertrend/services/scheduling/__init__.py +0 -4
- bertrend-0.3.24/bertrend/services/scheduling/dashboard.html +0 -698
- bertrend-0.3.24/bertrend/services/scheduling/job_utils/__init__.py +0 -4
- bertrend-0.3.24/bertrend/services/scheduling/models/__init__.py +0 -4
- bertrend-0.3.24/bertrend/services/summary/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/apps/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/apps/test_routers_bertrend_app.py +0 -285
- bertrend-0.3.24/bertrend/tests/core/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/llm/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/llm/test_openai_client.py +0 -210
- bertrend-0.3.24/bertrend/tests/services/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/services/embedding/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/services/scheduling/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/services/summarizer/__init__.py +0 -4
- bertrend-0.3.24/bertrend/tests/utils/__init__.py +0 -4
- bertrend-0.3.24/bertrend/topic_analysis/__init__.py +0 -4
- bertrend-0.3.24/bertrend/trend_analysis/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/common/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/exploration/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/exploration/curebot/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/exploration/dataviz/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/exploration/geolocalization/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/newsletters/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/prospective_demo/detailed_report_template.html +0 -438
- bertrend-0.3.24/bertrend_apps/prospective_demo/docs/architecture.md +0 -82
- bertrend-0.3.24/bertrend_apps/prospective_demo/docs/automated_report_generation.md +0 -289
- bertrend-0.3.24/bertrend_apps/services/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/services/models/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/services/routers/__init__.py +0 -4
- bertrend-0.3.24/bertrend_apps/services/routers/bertrend_app.py +0 -140
- bertrend-0.3.24/bertrend_apps/services/utils/__init__.py +0 -4
- {bertrend-0.3.24 → bertrend-0.4.0}/AUTHORS.txt +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/LICENSE.md +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
- {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/config/default_config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/bertopic_default_config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/bertrend_default_config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/parameters.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/services_default_config.toml +0 -0
- {bertrend-0.3.24/bertrend/article_scoring → bertrend-0.4.0/bertrend/demos}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/icons.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_summarizer_app.sh +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_topic_analysis_app.sh +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_weak_signals_app.sh +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/__init__.py +0 -0
- {bertrend-0.3.24/bertrend/demos → bertrend-0.4.0/bertrend/demos/summarization}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/summarization/summarizer_app.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
- {bertrend-0.3.24/bertrend/demos/summarization → bertrend-0.4.0/bertrend/demos/topic_analysis}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app.py +6 -6
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app_utils.py +2 -2
- {bertrend-0.3.24/bertrend/demos/topic_analysis → bertrend-0.4.0/bertrend/demos/topic_analysis/demo_pages}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
- {bertrend-0.3.24/bertrend/demos/topic_analysis/demo_pages → bertrend-0.4.0/bertrend/demos/weak_signals}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
- {bertrend-0.3.24/bertrend/demos/weak_signals → bertrend-0.4.0/bertrend/llm_utils}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter.css +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_model.py +1 -1
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_template.html +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/prompts.py +0 -0
- {bertrend-0.3.24/bertrend/llm_utils → bertrend-0.4.0/bertrend/metrics}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/common_ngrams.json +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-en.json +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-fr.json +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-rte.json +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/cert.pem +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/README.md +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/config/default_config.toml +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/requirements.txt +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/key.pem +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/.dockerignore +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/Docker_setup.md +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/requirements.txt +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/README_integration_tests.md +0 -0
- {bertrend-0.3.24/bertrend/metrics → bertrend-0.4.0/bertrend/topic_analysis}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/data_structure.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/prompts.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/representative_docs.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/topic_description.py +0 -0
- {bertrend-0.3.24/bertrend/services → bertrend-0.4.0/bertrend/trend_analysis}/__init__.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/data_structure.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/config_utils.py +0 -0
- {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/data_loading.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bertrend
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
|
|
5
5
|
License: LICENSE.md
|
|
6
6
|
License-File: AUTHORS.txt
|
|
@@ -12,12 +12,12 @@ Maintainer: Jérôme Picault
|
|
|
12
12
|
Maintainer-email: jerome.picault@rte-france.com
|
|
13
13
|
Requires-Python: >=3.12,<4.0
|
|
14
14
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
15
|
-
Provides-Extra: apps
|
|
16
15
|
Requires-Dist: APScheduler (>=3.11.0)
|
|
17
16
|
Requires-Dist: PyJWT (>=2.10.1)
|
|
18
17
|
Requires-Dist: Pyqtree (==1.0.0)
|
|
19
18
|
Requires-Dist: SQLAlchemy (>=2.0.40)
|
|
20
|
-
Requires-Dist:
|
|
19
|
+
Requires-Dist: aio-pika (>=9.5.5)
|
|
20
|
+
Requires-Dist: arxiv (>=2.2.0)
|
|
21
21
|
Requires-Dist: bertopic (==0.16.2)
|
|
22
22
|
Requires-Dist: black (>=24.10.0)
|
|
23
23
|
Requires-Dist: coverage (>=7.6.9)
|
|
@@ -27,12 +27,12 @@ Requires-Dist: datamapplot (==0.3.0)
|
|
|
27
27
|
Requires-Dist: dateparser (>=1.2.0)
|
|
28
28
|
Requires-Dist: dill (>=0.4.0)
|
|
29
29
|
Requires-Dist: fastapi (>=0.120.0)
|
|
30
|
-
Requires-Dist: feedparser (>=6.0.11)
|
|
30
|
+
Requires-Dist: feedparser (>=6.0.11)
|
|
31
31
|
Requires-Dist: gensim (>=4.3.3)
|
|
32
|
-
Requires-Dist: google-api-python-client (>=2.148.0)
|
|
33
|
-
Requires-Dist: google-auth-oauthlib (>=1.2.1)
|
|
34
|
-
Requires-Dist: googlenewsdecoder (>=0.1.7)
|
|
35
|
-
Requires-Dist: goose3 (>=3.1.19)
|
|
32
|
+
Requires-Dist: google-api-python-client (>=2.148.0)
|
|
33
|
+
Requires-Dist: google-auth-oauthlib (>=1.2.1)
|
|
34
|
+
Requires-Dist: googlenewsdecoder (>=0.1.7)
|
|
35
|
+
Requires-Dist: goose3 (>=3.1.19)
|
|
36
36
|
Requires-Dist: hdbscan (>=0.8.40)
|
|
37
37
|
Requires-Dist: ipython (>=8.28.0)
|
|
38
38
|
Requires-Dist: joblib (>=1.4.2)
|
|
@@ -42,20 +42,20 @@ Requires-Dist: langdetect (>=1.0.9)
|
|
|
42
42
|
Requires-Dist: loguru (>=0.7.3)
|
|
43
43
|
Requires-Dist: lxml-html-clean (>=0.2.2)
|
|
44
44
|
Requires-Dist: markdown (>=3.7)
|
|
45
|
-
Requires-Dist: newscatcher-sdk (>=1.4.0)
|
|
46
|
-
Requires-Dist: newspaper4k (>=0.9.3.1)
|
|
45
|
+
Requires-Dist: newscatcher-sdk (>=1.4.0)
|
|
46
|
+
Requires-Dist: newspaper4k (>=0.9.3.1)
|
|
47
47
|
Requires-Dist: nltk (>=3.9.1)
|
|
48
|
-
Requires-Dist: numpy (<2)
|
|
49
48
|
Requires-Dist: openai (>=1.77.0)
|
|
50
49
|
Requires-Dist: openai-agents[litellm] (>=0.4.0)
|
|
51
50
|
Requires-Dist: openpyxl (>=3.1.5)
|
|
52
51
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
|
|
53
52
|
Requires-Dist: pandas (>=2.2.2)
|
|
53
|
+
Requires-Dist: pika (>=1.3.2)
|
|
54
54
|
Requires-Dist: plotly (>=5.24.1)
|
|
55
55
|
Requires-Dist: plotly-resampler (>=0.10.0)
|
|
56
56
|
Requires-Dist: psutil (>=7.2.1)
|
|
57
57
|
Requires-Dist: pyarrow (>=21.0.0)
|
|
58
|
-
Requires-Dist: pygooglenews (>=0.1.3)
|
|
58
|
+
Requires-Dist: pygooglenews (>=0.1.3)
|
|
59
59
|
Requires-Dist: pylabeladjust (==0.1.13)
|
|
60
60
|
Requires-Dist: pytest (>=8.4.0)
|
|
61
61
|
Requires-Dist: pytest-asyncio
|
|
@@ -67,7 +67,7 @@ Requires-Dist: seaborn (>=0.13.2)
|
|
|
67
67
|
Requires-Dist: sentence-transformers (==3.0.1)
|
|
68
68
|
Requires-Dist: sentencepiece (>=0.2.0)
|
|
69
69
|
Requires-Dist: starlette (>=0.46.2)
|
|
70
|
-
Requires-Dist: streamlit (>=1.
|
|
70
|
+
Requires-Dist: streamlit (>=1.51.0)
|
|
71
71
|
Requires-Dist: streamlit-code-editor (>=0.1.22)
|
|
72
72
|
Requires-Dist: supervisor (>=4.3.0)
|
|
73
73
|
Requires-Dist: thefuzz (>=0.22.1)
|
|
@@ -95,7 +95,9 @@ Description-Content-Type: text/markdown
|
|
|
95
95
|

|
|
96
96
|
|
|
97
97
|
## News
|
|
98
|
-
|
|
98
|
+
|
|
99
|
+
2025-11-24: BERTrend has been integrated into
|
|
100
|
+
the [Netminer 5](https://netminer.gitbook.io/netminer5/module-reference/text/bertopic/bertrend) data analysis tool !
|
|
99
101
|
|
|
100
102
|
## Overview
|
|
101
103
|
|
|
@@ -103,38 +105,48 @@ Description-Content-Type: text/markdown
|
|
|
103
105
|
|
|
104
106
|
## Paper
|
|
105
107
|
|
|
106
|
-
The code in this repository is part of the work described in the paper:
|
|
108
|
+
The code in this repository is part of the work described in the paper:
|
|
107
109
|
[BERTrend: Neural Topic Modeling for Emerging Trends Detection](./BERTrend%20paper.pdf).
|
|
108
110
|
|
|
109
111
|
## Description
|
|
110
112
|
|
|
111
|
-
BERTrend is a novel framework for detecting and monitoring weak signals in large, evolving text corpora. It uses neural
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
BERTrend is a novel framework for detecting and monitoring weak signals in large, evolving text corpora. It uses neural
|
|
114
|
+
topic modeling, specifically [BERTopic](https://github.com/MaartenGr/BERTopic), in an online learning setting to
|
|
115
|
+
identify and track topic evolution over time.
|
|
114
116
|
|
|
117
|
+
BERTrend classifies topics as noise, weak signals, or strong signals based on their popularity trends, using a metric
|
|
118
|
+
that considers both the number of documents and update frequency. This method allows for real-time monitoring and
|
|
119
|
+
analysis of emerging trends while filtering out noise.
|
|
115
120
|
|
|
116
121
|
## Main Features
|
|
117
122
|
|
|
118
|
-
The BERTrend repository provides a set of metrics, methods, and visualization tools to support the analysis of dynamic
|
|
123
|
+
The BERTrend repository provides a set of metrics, methods, and visualization tools to support the analysis of dynamic
|
|
124
|
+
topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
|
|
125
|
+
topics and trends over time.
|
|
119
126
|
|
|
120
127
|
The code base is illustrated via two main demos:
|
|
121
128
|
|
|
122
129
|
### Dynamic Topic Modeling Analysis
|
|
123
130
|
|
|
124
131
|
- [bertrend/demos/topic_analysis](bertrend/demos/topic_analysis): Focuses on dynamic topic modeling analysis using:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
- Dedicated metrics, called TEMPTopic:
|
|
133
|
+
- Stability Evaluation: Measures the stability of topics over time, evaluating how consistent and coherent
|
|
134
|
+
topics remain.
|
|
135
|
+
- Volatility Assessment: Analyzes the volatility of topics, identifying how much topics change over different
|
|
136
|
+
time periods.
|
|
137
|
+
- Two Perspectives:
|
|
138
|
+
- Temporal Topic Embedding Stability: Evaluates the stability of topic embeddings over time.
|
|
139
|
+
- Temporal Topic Representation Stability: Assesses the stability of topic representations over time.
|
|
140
|
+
- Visualization tools to easily assess the results.
|
|
141
|
+
|
|
142
|
+
#### Topic Modeling Analysis Demonstrator Video
|
|
143
|
+
|
|
134
144
|
https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
|
|
135
145
|
|
|
136
146
|
#### Demonstrator Features
|
|
137
|
-
|
|
147
|
+
|
|
148
|
+
- Data management: selection of single/multiple datasets, filter by time, filter by size, split long documents by
|
|
149
|
+
paragraphs
|
|
138
150
|
- Customization of BERTopic parameters
|
|
139
151
|
- Exploration of topics by source, generate topic summaries using specific sources
|
|
140
152
|
- Generate and customize newsletters by applying LLMs on BERTopic's output topics
|
|
@@ -147,10 +159,11 @@ https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
|
|
|
147
159
|
- [bertrend/demos/weak_signals](bertrend/demos/weak_signals): Identifies and analyzes emerging trends and signals
|
|
148
160
|
|
|
149
161
|
#### Weak Signal Analysis Demonstrator Video
|
|
150
|
-
https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
151
162
|
|
|
163
|
+
https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
152
164
|
|
|
153
165
|
#### Demonstrator Features
|
|
166
|
+
|
|
154
167
|
- Exploration of signals in real time at any given timestamp
|
|
155
168
|
- Categorization of signals into three different dataframes: noise, weak and strong signals
|
|
156
169
|
(each dataframe contains useful information about the signals)
|
|
@@ -161,33 +174,38 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
161
174
|
|
|
162
175
|
### Environment Setup (.env and .venv)
|
|
163
176
|
|
|
164
|
-
BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load
|
|
177
|
+
BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load
|
|
178
|
+
environment variables automatically using `python-dotenv`.
|
|
165
179
|
|
|
166
180
|
Recommended steps:
|
|
167
181
|
|
|
168
182
|
1. Create and fill your `.env` at the repo root (a template is provided):
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
183
|
+
- Copy `.env` and set your values (do not commit secrets).
|
|
184
|
+
- Common keys:
|
|
185
|
+
- `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
|
|
186
|
+
- OpenAI/LLM:
|
|
187
|
+
- `OPENAI_API_KEY`
|
|
188
|
+
- `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
|
|
189
|
+
- `OPENAI_DEFAULT_MODEL`
|
|
190
|
+
- Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
|
|
191
|
+
- Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`,
|
|
192
|
+
`CLIENT_REGISTRY_FILE`
|
|
193
|
+
- Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
|
|
194
|
+
- Misc: `CUDA_VISIBLE_DEVICES`
|
|
180
195
|
2. Use a virtual environment and install dependencies inside it:
|
|
181
196
|
```bash
|
|
182
197
|
uv venv --python 3.13
|
|
183
198
|
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
|
|
184
|
-
uv pip install .
|
|
199
|
+
uv pip install .
|
|
185
200
|
uv pip install python-dotenv # ensures .env is auto-loaded
|
|
186
201
|
```
|
|
187
202
|
3. Notes
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
203
|
+
- If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via
|
|
204
|
+
your shell/runner.
|
|
205
|
+
- Scheduled jobs created from the apps use the exact interpreter of your active environment (`sys.executable`),
|
|
206
|
+
ensuring `.venv/bin/python` is used. Keep your venv path stable on the machine running cron.
|
|
207
|
+
- Cron entries source your shell profile and pass through any required variables. You can also rely on `.env` for
|
|
208
|
+
most settings.
|
|
191
209
|
|
|
192
210
|
### Hardware and Software Requirements
|
|
193
211
|
|
|
@@ -196,20 +214,21 @@ Recommended steps:
|
|
|
196
214
|
|
|
197
215
|
### Docker Installation
|
|
198
216
|
|
|
199
|
-
BERTrend can be run using Docker, which provides an easy way to run the application without installing dependencies
|
|
217
|
+
BERTrend can be run using Docker, which provides an easy way to run the application without installing dependencies
|
|
218
|
+
directly on your system.
|
|
200
219
|
|
|
201
220
|
For detailed instructions on using BERTrend with Docker, see the [Docker documentation](./docs/docker.md).
|
|
202
221
|
|
|
203
222
|
### Package Installation
|
|
204
223
|
|
|
205
|
-
- (Recommended): create a new python environment using `uv`:
|
|
224
|
+
- (Recommended): create a new python environment using `uv`:
|
|
206
225
|
|
|
207
226
|
`uv venv --python 3.13`
|
|
208
227
|
|
|
209
228
|
|
|
210
229
|
- Installation from pypi
|
|
211
230
|
|
|
212
|
-
`uv pip install bertrend`
|
|
231
|
+
`uv pip install bertrend`
|
|
213
232
|
|
|
214
233
|
|
|
215
234
|
- Install using pip or poetry in the BERTrend home directory:
|
|
@@ -218,9 +237,6 @@ For detailed instructions on using BERTrend with Docker, see the [Docker documen
|
|
|
218
237
|
# Basic installation with core dependencies
|
|
219
238
|
uv pip install .
|
|
220
239
|
|
|
221
|
-
# Installation with apps dependencies
|
|
222
|
-
uv pip install .[apps]
|
|
223
|
-
|
|
224
240
|
```
|
|
225
241
|
|
|
226
242
|
- (Use `uv pip install -e .` for a local installation)
|
|
@@ -237,12 +253,8 @@ BERTrend's dependencies are organized into logical groups for easier management:
|
|
|
237
253
|
- **Visualization and UI**: Tools for data visualization and user interfaces
|
|
238
254
|
- **Utilities**: General utility libraries
|
|
239
255
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- **test**: Dependencies for running tests and measuring code coverage
|
|
243
|
-
- **apps**: Additional dependencies required for BERTrend applications
|
|
244
|
-
|
|
245
|
-
This organization simplifies installation and maintenance, allowing users to install only the dependencies they need for their specific use case.
|
|
256
|
+
This organization simplifies installation and maintenance, allowing users to install only the dependencies they need for
|
|
257
|
+
their specific use case.
|
|
246
258
|
|
|
247
259
|
### Verifying Installation
|
|
248
260
|
|
|
@@ -252,35 +264,43 @@ To verify that your installation is working correctly, you can run the installat
|
|
|
252
264
|
python -m bertrend.tests.test_installation
|
|
253
265
|
```
|
|
254
266
|
|
|
255
|
-
This script will check that all dependencies are installed correctly and provide a summary of the installation status.
|
|
267
|
+
This script will check that all dependencies are installed correctly and provide a summary of the installation status.
|
|
268
|
+
If any dependencies are missing, the script will provide instructions on how to install them.
|
|
256
269
|
|
|
257
270
|
### Datasets
|
|
258
271
|
|
|
259
272
|
#### Dataset Sources
|
|
273
|
+
|
|
260
274
|
BERTrend can work with various text datasets such as:
|
|
275
|
+
|
|
261
276
|
- Scientific publications
|
|
262
277
|
- News articles
|
|
263
278
|
- Social media publications
|
|
264
279
|
|
|
265
280
|
Recommended public datasets:
|
|
281
|
+
|
|
266
282
|
- New York Times dataset: https://www.kaggle.com/datasets/aryansingh0909/nyt-articles-21m-2000-present
|
|
267
283
|
- Arxiv dataset: https://www.kaggle.com/datasets/Cornell-University/arxiv
|
|
268
284
|
|
|
269
285
|
For custom dataset creation, please refer to the documentation page about [data providers](./docs/data_provider.md).
|
|
270
286
|
|
|
271
|
-
For email configuration and newsletter sending (optional), please refer to
|
|
272
|
-
|
|
287
|
+
For email configuration and newsletter sending (optional), please refer to
|
|
288
|
+
the [mail configuration guide](./docs/mail_configuration.md).
|
|
273
289
|
|
|
274
290
|
In order to use the provided demos, datasets :
|
|
291
|
+
|
|
275
292
|
- can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
|
|
276
293
|
- or can be uploaded from the client device on which are displayed the Streamlit apps.
|
|
277
294
|
|
|
278
295
|
#### Dataset Format
|
|
296
|
+
|
|
279
297
|
Required columns:
|
|
298
|
+
|
|
280
299
|
- `text`
|
|
281
300
|
- `timestamp`
|
|
282
301
|
|
|
283
302
|
Supported formats:
|
|
303
|
+
|
|
284
304
|
- csv
|
|
285
305
|
- xlsx
|
|
286
306
|
- parquet
|
|
@@ -291,94 +311,105 @@ Supported formats:
|
|
|
291
311
|
### 1. Dynamic Topic Modeling Analysis
|
|
292
312
|
|
|
293
313
|
#### Launch the Demonstrator
|
|
314
|
+
|
|
294
315
|
```bash
|
|
295
316
|
cd bertrend/demos/topic_analysis
|
|
296
317
|
CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
|
|
297
318
|
```
|
|
298
319
|
|
|
299
320
|
#### Description of Main Pages
|
|
321
|
+
|
|
300
322
|
- `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
|
|
301
|
-
The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
|
|
323
|
+
The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
|
|
302
324
|
|
|
303
325
|
We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
|
|
304
326
|
|
|
305
|
-
The change of configuration can be done
|
|
306
|
-
|
|
307
|
-
An example of a very simple implementation to deploy a separate embedding service can be found here: `bertrend/services/embedding_server`
|
|
327
|
+
The change of configuration can be done
|
|
328
|
+
in: [services_default_config.toml](bertrend/config/services_default_config.toml).
|
|
308
329
|
|
|
330
|
+
An example of a very simple implementation to deploy a separate embedding service can be found here:
|
|
331
|
+
`bertrend/services/embedding_server`
|
|
309
332
|
|
|
310
333
|

|
|
311
334
|
|
|
312
|
-
Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for
|
|
335
|
+
Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for
|
|
336
|
+
parameter details.
|
|
313
337
|
|
|
314
338
|
The application is split into several pages:
|
|
315
339
|
|
|
316
|
-
- `Data loading & model training`: Allows to
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
340
|
+
- `Data loading & model training`: Allows to
|
|
341
|
+
- Select a dataset
|
|
342
|
+
- Select the range of timestamps
|
|
343
|
+
- Split paragraphs if needed
|
|
344
|
+
- Train a topic model
|
|
321
345
|
|
|
322
346
|

|
|
323
347
|
|
|
324
348
|
- `Topic exploration`
|
|
325
|
-
|
|
326
|
-
|
|
349
|
+
- Computes topics over time
|
|
350
|
+

|
|
327
351
|
|
|
328
|
-
|
|
329
|
-
|
|
352
|
+
- Allow selecting sources and generating short descriptions for each theme
|
|
353
|
+

|
|
330
354
|
|
|
331
355
|
- `Topic visualization`: Several visualization types available:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
356
|
+
- `Overall Results`: Standard information such as inter-topic distance map
|
|
357
|
+
- `Topics Treemap`: Block view of topics and their relative importance
|
|
358
|
+
- `Data Map`: Easy topic and data search interface
|
|
335
359
|
|
|
336
|
-

|
|
360
|
+

|
|
337
361
|
|
|
338
362
|
- `Temporal Visualization`: Focus on dynamic topic modeling:
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
363
|
+
- 3D visualization of temporal topic evolution
|
|
364
|
+
- Metrics to assess topic stability over time
|
|
365
|
+
- Overall topic stability, temporal topic stability, and temporal representation stability
|
|
342
366
|
|
|
343
|
-

|
|
367
|
+

|
|
344
368
|
|
|
345
369
|
- `Generate Newsletters`
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
370
|
+
- This is an example of an application combining topic analysis and LLMs
|
|
371
|
+
- Generates newsletters based on prominent topics
|
|
372
|
+
- Uses LLMs to generate topic descriptions and summarize representative documents
|
|
350
373
|
|
|
351
374
|
### 2. Weak Signal Analysis
|
|
352
|
-
**Weak signals** refer to early, small indicators of larger, important trends (like disruptive technologies or public health issues).
|
|
353
375
|
|
|
354
|
-
|
|
376
|
+
**Weak signals** refer to early, small indicators of larger, important trends (like disruptive technologies or public
|
|
377
|
+
health issues).
|
|
378
|
+
|
|
379
|
+
Identifying weak signals early is critical for decision-making across domains such as politics, healthcare, and
|
|
380
|
+
innovation
|
|
355
381
|
|
|
356
382
|
Key Features of the demonstrator:
|
|
383
|
+
|
|
357
384
|
- Dynamic Topic Modeling in an online learning setting
|
|
358
385
|
- Popularity-based Signal Classification
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
386
|
+
* based on their popularity trends: noise, weak signals, and strong signals
|
|
387
|
+
* **new popularity metric** considers both the number of documents within a topic and the **frequency of updates**
|
|
362
388
|
|
|
363
389
|
#### Launch the Weak Signal Analysis Demonstrator
|
|
390
|
+
|
|
364
391
|
```bash
|
|
365
392
|
cd bertrend/demos/weak_signals
|
|
366
393
|
CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
|
|
367
394
|
```
|
|
368
395
|
|
|
369
396
|
#### Data Preparation
|
|
397
|
+
|
|
370
398
|
- Choose from available datasets
|
|
371
|
-

|
|
399
|
+

|
|
372
400
|
- Click on `Embed Documents`
|
|
373
401
|
|
|
374
402
|
#### Train Model
|
|
403
|
+
|
|
375
404
|
- Select the `Model Training` tab
|
|
376
405
|
- Choose time granularity (in days)
|
|
377
406
|
- Click `Train Models` to generate topic models per time slice
|
|
378
407
|
- Click `Merge Models` for the aggregated model
|
|
379
408
|
|
|
380
409
|
#### Results Analysis
|
|
410
|
+
|
|
381
411
|
Provides various statistics about topics:
|
|
412
|
+
|
|
382
413
|
- Number of topics detected
|
|
383
414
|
- Topic size evolution
|
|
384
415
|
- Topic popularity evolution
|
|
@@ -389,13 +420,13 @@ Provides various statistics about topics:
|
|
|
389
420
|
- Lists of noise, weak, and strong signals
|
|
390
421
|
|
|
391
422
|
#### LLM-based signal interpretation
|
|
423
|
+
|
|
392
424
|
- As topics are hard to interprete by humans, we showcase how it can be
|
|
393
|
-
done using LLMs.
|
|
425
|
+
done using LLMs.
|
|
394
426
|
- Choose a specific topic and click on the button to generate an interpretation
|
|
395
427
|
- LLM-based in-depth signal analysis is done using predefined templates, for example:
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
428
|
+
- describe what's happened since the last timestamp (summary of main events)
|
|
429
|
+
- present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
|
|
399
430
|
|
|
400
431
|

|
|
401
432
|
|
|
@@ -408,6 +439,7 @@ Please use the 'Issues' section to report and discuss any problems with BERTrend
|
|
|
408
439
|
We welcome contributions. For major changes, please open an issue first to discuss your proposal.
|
|
409
440
|
|
|
410
441
|
To contribute:
|
|
442
|
+
|
|
411
443
|
1. Fork the repository at https://github.com/rte-france/BERTrend
|
|
412
444
|
2. Sync your fork with the latest development branch
|
|
413
445
|
3. Implement your changes
|
|
@@ -423,7 +455,8 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
|
|
|
423
455
|
|
|
424
456
|
Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
|
|
425
457
|
|
|
426
|
-
This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available
|
|
458
|
+
This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available
|
|
459
|
+
here: https://www.mozilla.org/en-US/MPL/2.0/
|
|
427
460
|
|
|
428
461
|
## Citation
|
|
429
462
|
|