bertrend 0.3.2__tar.gz → 0.3.3__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.3}/PKG-INFO +68 -66
- {bertrend-0.3.2 → bertrend-0.3.3}/README.md +17 -15
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/authentication.py +0 -1
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/chatgpt_summarizer.py +1 -1
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_abstractive_summarizer.py +25 -16
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_extractive_summarizer.py +34 -21
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_installation.py +1 -3
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_metrics.py +29 -23
- bertrend-0.3.3/pyproject.toml +96 -0
- bertrend-0.3.2/pyproject.toml +0 -91
- {bertrend-0.3.2 → bertrend-0.3.3}/AUTHORS.txt +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/LICENSE.md +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/BERTopicModel.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/BERTrend.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/bertopic_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/bertrend_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/parameters.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/services_default_config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/icons.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/messages.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/parameters_component.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/state_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_summarizer_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_topic_analysis_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_weak_signals_app.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/summarization/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/summarization/summarizer_app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/app_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/messages.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/messages.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/newsletter.css +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/newsletter_features.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/openai_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/topic_metrics.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/common_ngrams.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-en.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-fr.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-rte.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/embedding_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/embedding_service.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/abstractive_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/extractive_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/lexrank.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/README_integration_tests.md +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/conftest.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_bertrend.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_cache_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_config_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_data_loading.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_embedding_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_integration.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_newsletter_features.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_openai_client.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_representative_docs.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_summarizer.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_description.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_model.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_utils_init.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/representative_docs.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/topic_description.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/data_structure.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/visualizations.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/weak_signals.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/cache_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/config_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/data_loading.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/crontab_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/mail_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/gmail_credentials.json +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/__main__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/curebot_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/data_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/google_news_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/old_veille_analyse.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/prompts.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/newsletters/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/newsletters/__main__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/__init__.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/app.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/authentication.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_config.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/i18n.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/models_info.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/process_new_data.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_generation.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_template.html +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/start_apps.sh +0 -0
- {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/stop_apps.sh +0 -0
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: bertrend
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
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)
|
|
48
44
|
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
|
|
45
|
+
Requires-Dist: pandas (>=2.2.2)
|
|
46
|
+
Requires-Dist: plotly (>=5.24.1)
|
|
47
|
+
Requires-Dist: plotly-resampler (>=0.10.0)
|
|
48
|
+
Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
|
|
53
49
|
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
|
|
50
|
+
Requires-Dist: pytest (>=8.3.3)
|
|
51
|
+
Requires-Dist: requests (>=2.32.3)
|
|
52
|
+
Requires-Dist: scikit-learn (>=1.5.2)
|
|
57
53
|
Requires-Dist: scipy (==1.12)
|
|
58
|
-
Requires-Dist: seaborn (>=0.13.2
|
|
54
|
+
Requires-Dist: seaborn (>=0.13.2)
|
|
59
55
|
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:
|
|
56
|
+
Requires-Dist: sentencepiece (>=0.2.0)
|
|
57
|
+
Requires-Dist: starlette (>=0.46.2)
|
|
58
|
+
Requires-Dist: streamlit (>=1.45.0)
|
|
59
|
+
Requires-Dist: streamlit-code-editor (>=0.1.22)
|
|
60
|
+
Requires-Dist: thefuzz (>=0.22.1)
|
|
61
|
+
Requires-Dist: tiktoken (>=0.8.0)
|
|
65
62
|
Requires-Dist: tldextract (>=2.0.1)
|
|
66
63
|
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
|
|
64
|
+
Requires-Dist: torch (>=2.7.0)
|
|
65
|
+
Requires-Dist: tqdm (>=4.67.1)
|
|
66
|
+
Requires-Dist: umap-learn (>=0.5.7)
|
|
67
|
+
Project-URL: Bug Tracker, https://github.com/rte-france/BERTrend/issues
|
|
68
|
+
Project-URL: Documentation, https://github.com/rte-france/BERTrend
|
|
69
|
+
Project-URL: Homepage, https://github.com/rte-france/BERTrend
|
|
70
70
|
Project-URL: Repository, https://github.com/rte-france/BERTrend
|
|
71
71
|
Description-Content-Type: text/markdown
|
|
72
72
|
|
|
@@ -137,7 +137,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
137
137
|
- Categorization of signals into three different dataframes: noise, weak and strong signals
|
|
138
138
|
(each dataframe contains useful information about the signals)
|
|
139
139
|
- Interpretation of these signals using LLMs
|
|
140
|
-
- Inspection of topic merging process using Sankey diagram
|
|
140
|
+
- Inspection of the topic merging process using Sankey diagram
|
|
141
141
|
|
|
142
142
|
## Installation
|
|
143
143
|
|
|
@@ -174,19 +174,14 @@ BERTrend requires the following environment variables to be set:
|
|
|
174
174
|
# Basic installation with core dependencies
|
|
175
175
|
pip install . # or poetry install
|
|
176
176
|
|
|
177
|
-
|
|
178
|
-
pip install ".[
|
|
177
|
+
# Installation with apps dependencies
|
|
178
|
+
pip install ".[apps]" # or poetry install --extras apps
|
|
179
179
|
|
|
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
180
|
```
|
|
186
181
|
|
|
187
182
|
- (Use `pip install -e .` for a local installation)
|
|
188
183
|
|
|
189
|
-
NB. Due to the number of dependencies, the installation may take some time on an empty
|
|
184
|
+
NB. Due to the number of dependencies, the installation may take some time on an empty environment.
|
|
190
185
|
|
|
191
186
|
### Dependency Management
|
|
192
187
|
|
|
@@ -232,7 +227,7 @@ For custom dataset creation, please refer to the documentation page about [data
|
|
|
232
227
|
|
|
233
228
|
In order to use the provided demos, datasets :
|
|
234
229
|
- can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
|
|
235
|
-
- or can be uploaded from the client device on which
|
|
230
|
+
- or can be uploaded from the client device on which are displayed the Streamlit apps.
|
|
236
231
|
|
|
237
232
|
#### Dataset Format
|
|
238
233
|
Required columns:
|
|
@@ -259,6 +254,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
|
|
|
259
254
|
- `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
|
|
260
255
|
The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
|
|
261
256
|
|
|
257
|
+
We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
|
|
258
|
+
|
|
259
|
+
The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
|
|
260
|
+
|
|
261
|
+
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)
|
|
262
|
+
|
|
263
|
+
|
|
262
264
|

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

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

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

|
|
296
298
|
|
|
297
299
|
- `Generate Newsletters`
|
|
298
|
-
- This is an example of application combining topic analysis and LLMs
|
|
300
|
+
- This is an example of an application combining topic analysis and LLMs
|
|
299
301
|
- Generates newsletters based on prominent topics
|
|
300
302
|
- Uses LLMs to generate topic descriptions and summarize representative documents
|
|
301
303
|
|
|
@@ -344,8 +346,8 @@ Provides various statistics about topics:
|
|
|
344
346
|
- As topics are hard to interprete by humans, we showcase how it can be
|
|
345
347
|
done using LLMs.
|
|
346
348
|
- 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
|
|
349
|
+
- LLM-based in-depth signal analysis is done using predefined templates, for example:
|
|
350
|
+
- describe what's happened since the last timestamp (summary of main events)
|
|
349
351
|
- present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
|
|
350
352
|
|
|
351
353
|
|
|
@@ -373,7 +375,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
|
|
|
373
375
|
|
|
374
376
|
## License Information
|
|
375
377
|
|
|
376
|
-
Copyright 2023
|
|
378
|
+
Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
|
|
377
379
|
|
|
378
380
|
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
381
|
|
|
@@ -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
|
|
|
@@ -35,7 +35,7 @@ class GPTSummarizer(Summarizer):
|
|
|
35
35
|
prompt_language: str = "fr",
|
|
36
36
|
max_article_length: int = 1500,
|
|
37
37
|
model_name: str = None,
|
|
38
|
-
**kwargs
|
|
38
|
+
**kwargs,
|
|
39
39
|
) -> str:
|
|
40
40
|
# Limit input length in case the text is large
|
|
41
41
|
article_text = keep_first_n_words(article_text, max_article_length)
|
|
@@ -36,12 +36,15 @@ def mock_model():
|
|
|
36
36
|
@pytest.fixture
|
|
37
37
|
def mock_abstractive_summarizer(mock_tokenizer, mock_model):
|
|
38
38
|
"""Create a mock AbstractiveSummarizer with mocked dependencies."""
|
|
39
|
-
with
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
with (
|
|
40
|
+
patch(
|
|
41
|
+
"bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained",
|
|
42
|
+
return_value=mock_tokenizer,
|
|
43
|
+
),
|
|
44
|
+
patch(
|
|
45
|
+
"bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained",
|
|
46
|
+
return_value=mock_model,
|
|
47
|
+
),
|
|
45
48
|
):
|
|
46
49
|
summarizer = AbstractiveSummarizer()
|
|
47
50
|
# Set the mocks directly to ensure they're used
|
|
@@ -52,11 +55,14 @@ def mock_abstractive_summarizer(mock_tokenizer, mock_model):
|
|
|
52
55
|
|
|
53
56
|
def test_initialization():
|
|
54
57
|
"""Test that the AbstractiveSummarizer initializes with the correct model."""
|
|
55
|
-
with
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
with (
|
|
59
|
+
patch(
|
|
60
|
+
"bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
|
|
61
|
+
) as mock_tokenizer,
|
|
62
|
+
patch(
|
|
63
|
+
"bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
|
|
64
|
+
) as mock_model,
|
|
65
|
+
):
|
|
60
66
|
|
|
61
67
|
# Mock the to() method to avoid device-related issues
|
|
62
68
|
mock_model.return_value.to.return_value = mock_model.return_value
|
|
@@ -124,11 +130,14 @@ def test_custom_model():
|
|
|
124
130
|
"""Test initialization with a custom model."""
|
|
125
131
|
custom_model = "custom/model"
|
|
126
132
|
|
|
127
|
-
with
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
133
|
+
with (
|
|
134
|
+
patch(
|
|
135
|
+
"bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
|
|
136
|
+
) as mock_tokenizer,
|
|
137
|
+
patch(
|
|
138
|
+
"bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
|
|
139
|
+
) as mock_model,
|
|
140
|
+
):
|
|
132
141
|
|
|
133
142
|
# Mock the to() method to avoid device-related issues
|
|
134
143
|
mock_model.return_value.to.return_value = mock_model.return_value
|
|
@@ -55,12 +55,15 @@ def mock_openai_client():
|
|
|
55
55
|
@pytest.fixture
|
|
56
56
|
def mock_enhanced_summarizer(mock_sentence_transformer, mock_openai_client):
|
|
57
57
|
"""Create a mock EnhancedExtractiveSummarizer with mocked dependencies."""
|
|
58
|
-
with
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
with (
|
|
59
|
+
patch(
|
|
60
|
+
"bertrend.services.summary.extractive_summarizer.SentenceTransformer",
|
|
61
|
+
return_value=mock_sentence_transformer,
|
|
62
|
+
),
|
|
63
|
+
patch(
|
|
64
|
+
"bertrend.services.summary.extractive_summarizer.OpenAI_Client",
|
|
65
|
+
return_value=mock_openai_client,
|
|
66
|
+
),
|
|
64
67
|
):
|
|
65
68
|
summarizer = EnhancedExtractiveSummarizer(
|
|
66
69
|
api_key="test_key", endpoint="test_endpoint"
|
|
@@ -82,11 +85,14 @@ def test_extractive_summarizer_initialization():
|
|
|
82
85
|
|
|
83
86
|
def test_enhanced_summarizer_initialization():
|
|
84
87
|
"""Test that the EnhancedExtractiveSummarizer initializes correctly."""
|
|
85
|
-
with
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
with (
|
|
89
|
+
patch(
|
|
90
|
+
"bertrend.services.summary.extractive_summarizer.SentenceTransformer"
|
|
91
|
+
) as mock_transformer,
|
|
92
|
+
patch(
|
|
93
|
+
"bertrend.services.summary.extractive_summarizer.OpenAI_Client"
|
|
94
|
+
) as mock_client,
|
|
95
|
+
):
|
|
90
96
|
summarizer = EnhancedExtractiveSummarizer(
|
|
91
97
|
api_key="test_key", endpoint="test_endpoint"
|
|
92
98
|
)
|
|
@@ -128,13 +134,17 @@ def test_get_sentences_embeddings(
|
|
|
128
134
|
def test_summarize_text(mock_extractive_summarizer):
|
|
129
135
|
"""Test the summarize_text method."""
|
|
130
136
|
# Mock the necessary methods
|
|
131
|
-
with
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
with (
|
|
138
|
+
patch.object(
|
|
139
|
+
mock_extractive_summarizer,
|
|
140
|
+
"get_sentences",
|
|
141
|
+
return_value=["Sentence 1.", "Sentence 2.", "Sentence 3."],
|
|
142
|
+
),
|
|
143
|
+
patch.object(mock_extractive_summarizer, "get_sentences_embeddings"),
|
|
144
|
+
patch(
|
|
145
|
+
"bertrend.services.summary.extractive_summarizer.summarize_embeddings",
|
|
146
|
+
return_value=[0, 2],
|
|
147
|
+
),
|
|
138
148
|
):
|
|
139
149
|
|
|
140
150
|
summary = mock_extractive_summarizer.summarize_text("This is a test text.")
|
|
@@ -207,9 +217,12 @@ def test_summarize_embeddings():
|
|
|
207
217
|
def test_summarize_chunks(mock_extractive_summarizer):
|
|
208
218
|
"""Test the summarize_chunks method."""
|
|
209
219
|
# Mock the necessary methods
|
|
210
|
-
with
|
|
211
|
-
|
|
212
|
-
|
|
220
|
+
with (
|
|
221
|
+
patch.object(mock_extractive_summarizer, "get_chunks_embeddings"),
|
|
222
|
+
patch(
|
|
223
|
+
"bertrend.services.summary.extractive_summarizer.summarize_embeddings",
|
|
224
|
+
return_value=np.array([0, 2]),
|
|
225
|
+
),
|
|
213
226
|
):
|
|
214
227
|
|
|
215
228
|
chunks = ["Chunk 1", "Chunk 2", "Chunk 3", "Chunk 4", "Chunk 5"]
|
|
@@ -47,9 +47,7 @@ def test_nlp_dependencies():
|
|
|
47
47
|
def test_llm_dependencies():
|
|
48
48
|
"""Test that LLM integration dependencies are installed correctly."""
|
|
49
49
|
try:
|
|
50
|
-
import
|
|
51
|
-
import langchain_chroma
|
|
52
|
-
import langchain_openai
|
|
50
|
+
import langchain_core
|
|
53
51
|
import openai
|
|
54
52
|
import tiktoken
|
|
55
53
|
|
|
@@ -166,13 +166,15 @@ def test_get_diversity_value_invalid_type(mock_bertopic, sample_data):
|
|
|
166
166
|
|
|
167
167
|
def test_compute_cluster_metrics(mock_bertopic, sample_data):
|
|
168
168
|
"""Test the compute_cluster_metrics function."""
|
|
169
|
-
with
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
with (
|
|
170
|
+
patch(
|
|
171
|
+
"bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
|
|
172
|
+
) as mock_coherence,
|
|
173
|
+
patch(
|
|
174
|
+
"bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
|
|
175
|
+
) as mock_diversity,
|
|
176
|
+
patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
|
|
177
|
+
):
|
|
176
178
|
|
|
177
179
|
compute_cluster_metrics(
|
|
178
180
|
mock_bertopic, sample_data["topics"], sample_data["docs"]
|
|
@@ -197,14 +199,16 @@ def test_compute_cluster_metrics(mock_bertopic, sample_data):
|
|
|
197
199
|
|
|
198
200
|
def test_compute_cluster_metrics_coherence_error(mock_bertopic, sample_data):
|
|
199
201
|
"""Test the compute_cluster_metrics function when coherence calculation raises an error."""
|
|
200
|
-
with
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
with (
|
|
203
|
+
patch(
|
|
204
|
+
"bertrend.metrics.topic_metrics.get_coherence_value",
|
|
205
|
+
side_effect=IndexError("Test error"),
|
|
206
|
+
) as mock_coherence,
|
|
207
|
+
patch(
|
|
208
|
+
"bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
|
|
209
|
+
) as mock_diversity,
|
|
210
|
+
patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
|
|
211
|
+
):
|
|
208
212
|
|
|
209
213
|
compute_cluster_metrics(
|
|
210
214
|
mock_bertopic, sample_data["topics"], sample_data["docs"]
|
|
@@ -216,14 +220,16 @@ def test_compute_cluster_metrics_coherence_error(mock_bertopic, sample_data):
|
|
|
216
220
|
|
|
217
221
|
def test_compute_cluster_metrics_diversity_error(mock_bertopic, sample_data):
|
|
218
222
|
"""Test the compute_cluster_metrics function when diversity calculation raises an error."""
|
|
219
|
-
with
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
with (
|
|
224
|
+
patch(
|
|
225
|
+
"bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
|
|
226
|
+
) as mock_coherence,
|
|
227
|
+
patch(
|
|
228
|
+
"bertrend.metrics.topic_metrics.get_diversity_value",
|
|
229
|
+
side_effect=IndexError("Test error"),
|
|
230
|
+
) as mock_diversity,
|
|
231
|
+
patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
|
|
232
|
+
):
|
|
227
233
|
|
|
228
234
|
compute_cluster_metrics(
|
|
229
235
|
mock_bertopic, sample_data["topics"], sample_data["docs"]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "bertrend"
|
|
3
|
+
version = "0.3.3"
|
|
4
|
+
description = "BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM"
|
|
5
|
+
license = "LICENSE.md"
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
requires-python = ">=3.12,<4.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Jérôme Picault", email = "jerome.picault@rte-france.com" },
|
|
10
|
+
{ name="Guillaume Grosjean", email="guillaume.grosjean@rte-france.com>" },
|
|
11
|
+
{ name="Allaa Boutaleb", email="allaa.boutaleb@lip6.fr>"}
|
|
12
|
+
]
|
|
13
|
+
maintainers = [
|
|
14
|
+
{ name = "Jérôme Picault", email = "jerome.picault@rte-france.com" },
|
|
15
|
+
{ name="Guillaume Grosjean", email="guillaume.grosjean@rte-france.com>" },
|
|
16
|
+
]
|
|
17
|
+
keywords = ["topics", "BERTopic", "transformers", "weak signals", "LLM"]
|
|
18
|
+
classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence"]
|
|
19
|
+
|
|
20
|
+
dependencies = [
|
|
21
|
+
"ipython (>=8.28.0)",
|
|
22
|
+
"bertopic (==0.16.2)", # not fully tested with more recent versions
|
|
23
|
+
"black (>=24.10.0)",
|
|
24
|
+
"coverage>=7.6.9",
|
|
25
|
+
"cron-descriptor (>=1.4.5)",
|
|
26
|
+
"datamapplot (==0.3.0)",
|
|
27
|
+
"dateparser (>=1.2.0)",
|
|
28
|
+
"dask (==2024.12.0)", # issues with >=2025.x (https://github.com/dask/dask/issues/11678)
|
|
29
|
+
"dill (>=0.4.0)",
|
|
30
|
+
"gensim (>=4.3.3)",
|
|
31
|
+
"hdbscan (>=0.8.40)",
|
|
32
|
+
"joblib (>=1.4.2)",
|
|
33
|
+
"jsonlines (>=4.0.0)",
|
|
34
|
+
"langdetect (>=1.0.9)",
|
|
35
|
+
"langchain-core (>=0.3.59)",
|
|
36
|
+
"loguru (>=0.7.3)",
|
|
37
|
+
"lxml-html-clean (>=0.2.2)",
|
|
38
|
+
"markdown (>=3.7)",
|
|
39
|
+
"nltk (>=3.9.1)",
|
|
40
|
+
"numpy (<2)",
|
|
41
|
+
"openai (>=1.77.0)",
|
|
42
|
+
"opentelemetry-exporter-otlp-proto-grpc (==1.25.0)", # to avoid error chroma with protobuf
|
|
43
|
+
"pandas (>=2.2.2)",
|
|
44
|
+
"plotly (>=5.24.1)",
|
|
45
|
+
"plotly-resampler (>=0.10.0)",
|
|
46
|
+
"pylabeladjust (==0.1.13)",
|
|
47
|
+
"Pyqtree (==1.0.0)",
|
|
48
|
+
"pytest>=8.3.3",
|
|
49
|
+
"scipy (==1.12)",
|
|
50
|
+
"scikit-learn (>=1.5.2)",
|
|
51
|
+
"sentence-transformers (==3.0.1)",
|
|
52
|
+
"starlette (>=0.46.2)",
|
|
53
|
+
"requests (>=2.32.3)",
|
|
54
|
+
"seaborn (>=0.13.2)",
|
|
55
|
+
"sentencepiece (>=0.2.0)",
|
|
56
|
+
"streamlit (>=1.45.0)",
|
|
57
|
+
"streamlit-code-editor (>=0.1.22)",
|
|
58
|
+
"tldextract (>=2.0.1)",
|
|
59
|
+
"thefuzz (>=0.22.1)",
|
|
60
|
+
"torch (>=2.7.0)",
|
|
61
|
+
"tqdm (>=4.67.1)",
|
|
62
|
+
"tiktoken (>=0.8.0)",
|
|
63
|
+
"tokenizers (<0.20.0)",
|
|
64
|
+
"umap-learn (>=0.5.7)"
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
[project.optional-dependencies]
|
|
68
|
+
apps = [
|
|
69
|
+
"arxiv>=2.2.0",
|
|
70
|
+
"feedparser>=6.0.11",
|
|
71
|
+
"googlenewsdecoder>=0.1.7",
|
|
72
|
+
"google-api-python-client>=2.148.0",
|
|
73
|
+
"google-auth-oauthlib>=1.2.1",
|
|
74
|
+
"goose3>=3.1.19",
|
|
75
|
+
"newscatcherapi>=0.7.3",
|
|
76
|
+
"newspaper4k>=0.9.3.1",
|
|
77
|
+
"pygooglenews>=0.1.3"
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
[project.urls]
|
|
81
|
+
homepage = "https://github.com/rte-france/BERTrend"
|
|
82
|
+
repository = "https://github.com/rte-france/BERTrend"
|
|
83
|
+
documentation = "https://github.com/rte-france/BERTrend"
|
|
84
|
+
"Bug Tracker" = "https://github.com/rte-france/BERTrend/issues"
|
|
85
|
+
|
|
86
|
+
[tool.poetry]
|
|
87
|
+
packages = [
|
|
88
|
+
{ include = "bertrend" },
|
|
89
|
+
{ include = "bertrend_apps" },
|
|
90
|
+
]
|
|
91
|
+
exclude = [ "data" ]
|
|
92
|
+
requires-poetry = ">=2.0"
|
|
93
|
+
|
|
94
|
+
[build-system]
|
|
95
|
+
requires = ["poetry-core>=1.0.0"]
|
|
96
|
+
build-backend = "poetry.core.masonry.api"
|