bertrend 0.4.6__tar.gz → 0.4.8__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.
Files changed (341) hide show
  1. {bertrend-0.4.6 → bertrend-0.4.8}/PKG-INFO +27 -2
  2. {bertrend-0.4.6 → bertrend-0.4.8}/README.md +25 -1
  3. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/BERTrend.py +1 -1
  4. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/apscheduler_utils.py +41 -8
  5. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider.py +39 -14
  6. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab1.py +1 -1
  7. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab3.py +2 -2
  8. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/authentication.py +18 -1
  9. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_config.py +3 -1
  10. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n_translations.py +10 -2
  11. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/models_info.py +21 -10
  12. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/process_new_data.py +38 -28
  13. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/logging_utils.py +1 -1
  14. {bertrend-0.4.6/bertrend/services/summary_server → bertrend-0.4.8/bertrend/services/article_scoring_server}/config/default_config.toml +1 -1
  15. bertrend-0.4.8/bertrend/services/article_scoring_server/config/settings.py +32 -0
  16. bertrend-0.4.8/bertrend/services/article_scoring_server/models.py +21 -0
  17. bertrend-0.4.8/bertrend/services/article_scoring_server/routers/info.py +19 -0
  18. bertrend-0.4.8/bertrend/services/article_scoring_server/routers/scoring.py +43 -0
  19. bertrend-0.4.8/bertrend/services/article_scoring_server/scoring_service.py +12 -0
  20. bertrend-0.4.8/bertrend/services/article_scoring_server/start.py +18 -0
  21. bertrend-0.4.8/bertrend/services/summary_server/config/default_config.toml +3 -0
  22. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/routers/info.py +7 -0
  23. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_bing_news_provider.py +1 -1
  24. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_base.py +40 -15
  25. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_provider.py +1 -2
  26. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_newscatcher_provider.py +1 -1
  27. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/demos/summarization/test_summarizer_app.py +0 -1
  28. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_openai_client.py +1 -1
  29. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_security.py +1 -2
  30. bertrend-0.4.8/bertrend/tests/services/summarizer/__init__.py +4 -0
  31. bertrend-0.4.8/bertrend/tests/services/summary/__init__.py +4 -0
  32. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_client.py +1 -1
  33. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_config.py +1 -1
  34. bertrend-0.4.8/bertrend/tests/utils/__init__.py +4 -0
  35. {bertrend-0.4.6 → bertrend-0.4.8}/pyproject.toml +6 -3
  36. {bertrend-0.4.6 → bertrend-0.4.8}/AUTHORS.txt +0 -0
  37. {bertrend-0.4.6 → bertrend-0.4.8}/LICENSE.md +0 -0
  38. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/BERTopicModel.py +0 -0
  39. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/__init__.py +0 -0
  40. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/__init__.py +0 -0
  41. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/article_scoring.py +0 -0
  42. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/prompts.py +0 -0
  43. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/scoring_agent.py +0 -0
  44. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/__init__.py +0 -0
  45. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/__init__.py +0 -0
  46. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/crontab_utils.py +0 -0
  47. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/date_utils.py +0 -0
  48. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/mail_utils.py +0 -0
  49. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/scheduler_utils.py +0 -0
  50. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  51. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  52. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/feed_deep_research_example.toml +0 -0
  53. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  54. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  55. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  56. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  57. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  58. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  59. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  60. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  61. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  62. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  63. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__init__.py +0 -0
  64. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__main__.py +0 -0
  65. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  66. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  67. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  68. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider_utils.py +0 -0
  69. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/deep_research_provider.py +0 -0
  70. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/google_news_provider.py +0 -0
  71. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  72. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/rss_feed_provider.py +0 -0
  73. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/utils.py +0 -0
  74. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/__init__.py +0 -0
  75. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  76. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/__init__.py +0 -0
  77. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app.py +0 -0
  78. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  79. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/config.toml +0 -0
  80. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  81. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/prompts.py +0 -0
  82. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  83. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +0 -0
  84. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  85. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/.streamlit/config.toml +0 -0
  86. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/__init__.py +0 -0
  87. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/app.py +0 -0
  88. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/backend.py +0 -0
  89. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/start_apps.sh +0 -0
  90. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/stop_apps.sh +0 -0
  91. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  92. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__init__.py +0 -0
  93. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__main__.py +0 -0
  94. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/newsletter_generation.py +0 -0
  95. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/utils.py +0 -0
  96. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  97. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
  98. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/__init__.py +0 -0
  99. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/app.py +0 -0
  100. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/automated_report_generation.py +0 -0
  101. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  102. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  103. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_comparative.py +0 -0
  104. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  105. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/data_model.py +0 -0
  106. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +0 -0
  107. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  108. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  109. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n.py +0 -0
  110. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  111. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  112. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation.py +0 -0
  113. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation_utils.py +0 -0
  114. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  115. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/utils.py +0 -0
  116. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/__init__.py +0 -0
  117. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/__init__.py +0 -0
  118. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/bertrend_service.py +0 -0
  119. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/__init__.py +0 -0
  120. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/default_config.toml +0 -0
  121. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/settings.py +0 -0
  122. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/__init__.py +0 -0
  123. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/bertrend_app_models.py +0 -0
  124. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/data_provider_models.py +0 -0
  125. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/newsletters_models.py +0 -0
  126. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +0 -0
  127. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +0 -0
  128. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/data_provider.py +0 -0
  129. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/info.py +0 -0
  130. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/newsletters.py +0 -0
  131. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/start.py +0 -0
  132. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/status.py +0 -0
  133. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/stop.py +0 -0
  134. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/__init__.py +0 -0
  135. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +0 -0
  136. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/client.py +0 -0
  137. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +0 -0
  138. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/queue_manager.py +0 -0
  139. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +0 -0
  140. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +0 -0
  141. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +0 -0
  142. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/__init__.py +0 -0
  143. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/app.py +0 -0
  144. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/__init__.py +0 -0
  145. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/bertopic_default_config.toml +0 -0
  146. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/bertrend_default_config.toml +0 -0
  147. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/parameters.py +0 -0
  148. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/services_default_config.toml +0 -0
  149. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/__init__.py +0 -0
  150. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/__init__.py +0 -0
  151. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
  152. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  153. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n.py +0 -0
  154. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  155. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/icons.py +0 -0
  156. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  157. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/state_utils.py +0 -0
  158. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_summarizer_app.sh +0 -0
  159. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  160. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_weak_signals_app.sh +0 -0
  161. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/__init__.py +0 -0
  162. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/clickable_df_component.py +0 -0
  163. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/input_with_pills_component.py +0 -0
  164. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/summarization/__init__.py +0 -0
  165. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/summarization/summarizer_app.py +0 -0
  166. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  167. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/__init__.py +0 -0
  168. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app.py +0 -0
  169. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  170. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  171. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
  172. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
  173. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  174. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  175. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
  176. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  177. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  178. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/__init__.py +0 -0
  179. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/app.py +0 -0
  180. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  181. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  182. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/__init__.py +0 -0
  183. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/agent_utils.py +0 -0
  184. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter.css +0 -0
  185. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_features.py +0 -0
  186. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_model.py +0 -0
  187. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  188. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_template.html +0 -0
  189. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/openai_client.py +0 -0
  190. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/prompts.py +0 -0
  191. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/__init__.py +0 -0
  192. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  193. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/topic_metrics.py +0 -0
  194. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/common_ngrams.json +0 -0
  195. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-en.json +0 -0
  196. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-fr.json +0 -0
  197. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-rte.json +0 -0
  198. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/__init__.py +0 -0
  199. {bertrend-0.4.6/bertrend/services/embedding_server → bertrend-0.4.8/bertrend/services/article_scoring_server}/__init__.py +0 -0
  200. {bertrend-0.4.6/bertrend/services/embedding_server/routers → bertrend-0.4.8/bertrend/services/article_scoring_server/config}/__init__.py +0 -0
  201. {bertrend-0.4.6/bertrend/services/scheduling → bertrend-0.4.8/bertrend/services/article_scoring_server/routers}/__init__.py +0 -0
  202. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/authentication.py +0 -0
  203. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/cert.pem +0 -0
  204. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_client.py +0 -0
  205. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/README.md +0 -0
  206. {bertrend-0.4.6/bertrend/services/scheduling/job_utils → bertrend-0.4.8/bertrend/services/embedding_server}/__init__.py +0 -0
  207. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  208. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  209. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/config/settings.py +0 -0
  210. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/main.py +0 -0
  211. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/models.py +0 -0
  212. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/requirements.txt +0 -0
  213. {bertrend-0.4.6/bertrend/services/scheduling/models → bertrend-0.4.8/bertrend/services/embedding_server/routers}/__init__.py +0 -0
  214. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  215. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  216. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/info.py +0 -0
  217. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/security.py +0 -0
  218. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/start.py +0 -0
  219. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/status.py +0 -0
  220. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/stop.py +0 -0
  221. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_service.py +0 -0
  222. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/key.pem +0 -0
  223. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/.dockerignore +0 -0
  224. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/Docker_setup.md +0 -0
  225. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/Dockerfile +0 -0
  226. {bertrend-0.4.6/bertrend/services/summary → bertrend-0.4.8/bertrend/services/scheduling}/__init__.py +0 -0
  227. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/dashboard_scheduling.py +0 -0
  228. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/docker-compose.yml +0 -0
  229. {bertrend-0.4.6/bertrend/services/summary_server → bertrend-0.4.8/bertrend/services/scheduling/job_utils}/__init__.py +0 -0
  230. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/job_utils/job_functions.py +0 -0
  231. {bertrend-0.4.6/bertrend/services/summary_server/config → bertrend-0.4.8/bertrend/services/scheduling/models}/__init__.py +0 -0
  232. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/models/scheduling_models.py +0 -0
  233. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/requirements.txt +0 -0
  234. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/routers/info.py +0 -0
  235. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/routers/scheduling.py +0 -0
  236. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/scheduling_service.py +0 -0
  237. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/start_docker_scheduling_service.sh +0 -0
  238. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summarizer.py +0 -0
  239. {bertrend-0.4.6/bertrend/services/summary_server/routers → bertrend-0.4.8/bertrend/services/summary}/__init__.py +0 -0
  240. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  241. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  242. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/extractive_summarizer.py +0 -0
  243. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/lexrank.py +0 -0
  244. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/prompts.py +0 -0
  245. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_client.py +0 -0
  246. {bertrend-0.4.6/bertrend/tests → bertrend-0.4.8/bertrend/services/summary_server}/__init__.py +0 -0
  247. {bertrend-0.4.6/bertrend/tests/apps → bertrend-0.4.8/bertrend/services/summary_server/config}/__init__.py +0 -0
  248. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/config/settings.py +0 -0
  249. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/main.py +0 -0
  250. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/models.py +0 -0
  251. {bertrend-0.4.6/bertrend/tests/core → bertrend-0.4.8/bertrend/services/summary_server/routers}/__init__.py +0 -0
  252. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/routers/summarize.py +0 -0
  253. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/start.py +0 -0
  254. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/README_integration_tests.md +0 -0
  255. {bertrend-0.4.6/bertrend/tests/data_provider → bertrend-0.4.8/bertrend/tests}/__init__.py +0 -0
  256. {bertrend-0.4.6/bertrend/tests/demos → bertrend-0.4.8/bertrend/tests/apps}/__init__.py +0 -0
  257. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/apps/test_process_new_data.py +0 -0
  258. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/conftest.py +0 -0
  259. {bertrend-0.4.6/bertrend/tests/demos/summarization → bertrend-0.4.8/bertrend/tests/core}/__init__.py +0 -0
  260. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_bertrend.py +0 -0
  261. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_data_structure.py +0 -0
  262. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_representative_docs.py +0 -0
  263. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_temporal_metrics_embedding.py +0 -0
  264. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_description.py +0 -0
  265. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_metrics.py +0 -0
  266. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_model.py +0 -0
  267. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_data_structure.py +0 -0
  268. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_prompts.py +0 -0
  269. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_visualizations.py +0 -0
  270. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_weak_signals.py +0 -0
  271. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_visualizations.py +0 -0
  272. {bertrend-0.4.6/bertrend/tests/llm → bertrend-0.4.8/bertrend/tests/data_provider}/__init__.py +0 -0
  273. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_arxiv_provider.py +0 -0
  274. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_utils.py +0 -0
  275. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_live.py +0 -0
  276. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_google_news_provider.py +0 -0
  277. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_rss_atom_provider.py +0 -0
  278. {bertrend-0.4.6/bertrend/tests/services → bertrend-0.4.8/bertrend/tests/demos}/__init__.py +0 -0
  279. {bertrend-0.4.6/bertrend/tests/services/embedding → bertrend-0.4.8/bertrend/tests/demos/summarization}/__init__.py +0 -0
  280. {bertrend-0.4.6/bertrend/tests/services/embedding_server → bertrend-0.4.8/bertrend/tests/llm}/__init__.py +0 -0
  281. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_agent_utils.py +0 -0
  282. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring.py +0 -0
  283. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring_models.py +0 -0
  284. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_features.py +0 -0
  285. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_model.py +0 -0
  286. {bertrend-0.4.6/bertrend/tests/services/queue → bertrend-0.4.8/bertrend/tests/services}/__init__.py +0 -0
  287. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/__init__.py +0 -0
  288. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_bertrend_service.py +0 -0
  289. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_models.py +0 -0
  290. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_bertrend_app.py +0 -0
  291. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_info.py +0 -0
  292. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_newsletters.py +0 -0
  293. {bertrend-0.4.6/bertrend/tests/services/scheduling → bertrend-0.4.8/bertrend/tests/services/embedding}/__init__.py +0 -0
  294. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding/test_embedding_client.py +0 -0
  295. {bertrend-0.4.6/bertrend/tests/services/summarizer → bertrend-0.4.8/bertrend/tests/services/embedding_server}/__init__.py +0 -0
  296. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_models.py +0 -0
  297. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_routers.py +0 -0
  298. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_settings.py +0 -0
  299. {bertrend-0.4.6/bertrend/tests/services/summary → bertrend-0.4.8/bertrend/tests/services/queue}/__init__.py +0 -0
  300. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_bertrend_worker.py +0 -0
  301. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_client.py +0 -0
  302. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_queue_manager.py +0 -0
  303. {bertrend-0.4.6/bertrend/tests/utils → bertrend-0.4.8/bertrend/tests/services/scheduling}/__init__.py +0 -0
  304. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_job_exception_fix.py +0 -0
  305. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_scheduling_service.py +0 -0
  306. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_stress_test.py +0 -0
  307. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +0 -0
  308. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +0 -0
  309. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +0 -0
  310. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_summarizer.py +0 -0
  311. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_server.py +0 -0
  312. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/test_installation.py +0 -0
  313. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/test_integration.py +0 -0
  314. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_apscheduler_utils.py +0 -0
  315. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_cache_utils.py +0 -0
  316. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_config_utils.py +0 -0
  317. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_crontab_utils.py +0 -0
  318. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_data_loading.py +0 -0
  319. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_date_utils.py +0 -0
  320. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_lazy_scheduler.py +0 -0
  321. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_mail_utils.py +0 -0
  322. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_multiworker.py +0 -0
  323. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_scheduler_utils.py +0 -0
  324. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_utils_init.py +0 -0
  325. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/__init__.py +0 -0
  326. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/data_structure.py +0 -0
  327. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/prompts.py +0 -0
  328. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/representative_docs.py +0 -0
  329. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/topic_description.py +0 -0
  330. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/visualizations.py +0 -0
  331. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/__init__.py +0 -0
  332. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/data_structure.py +0 -0
  333. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/prompts.py +0 -0
  334. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  335. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  336. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/visualizations.py +0 -0
  337. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/weak_signals.py +0 -0
  338. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/__init__.py +0 -0
  339. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/cache_utils.py +0 -0
  340. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/config_utils.py +0 -0
  341. {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/data_loading.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bertrend
3
- Version: 0.4.6
3
+ Version: 0.4.8
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,6 +12,7 @@ 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
+ Classifier: Development Status :: 4 - Beta
15
16
  Requires-Dist: APScheduler (>=3.11.2)
16
17
  Requires-Dist: PyJWT (>=2.11.0)
17
18
  Requires-Dist: SQLAlchemy (>=2.0.46)
@@ -91,6 +92,7 @@ Description-Content-Type: text/markdown
91
92
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
92
93
  ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
93
94
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
95
+ [![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Frte-france%2FBERTrend%2Flines)](https://tokei.kojix2.net/github/rte-france/BERTrend)
94
96
 
95
97
  ## News
96
98
 
@@ -122,7 +124,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
122
124
  topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
123
125
  topics and trends over time.
124
126
 
125
- The code base is illustrated via two main demos:
127
+ The code base is illustrated via three main demos:
126
128
 
127
129
  ### Dynamic Topic Modeling Analysis
128
130
 
@@ -168,6 +170,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
168
170
  - Interpretation of these signals using LLMs
169
171
  - Inspection of the topic merging process using Sankey diagram
170
172
 
173
+ ### Prospective Analysis
174
+
175
+ - [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
176
+ Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
177
+
178
+ #### Prospective Analysis Demonstrator Video
179
+
180
+ (Coming soon)
181
+
182
+ #### Demonstrator Features
183
+
184
+ - Data flow configuration and collection status monitoring
185
+ - Model status and monitoring by information source
186
+ - Real-time signal analysis and trend exploration
187
+ - Detailed topic analysis and interpretation
188
+ - Automated report and newsletter generation
189
+ - Comparative analysis between different periods
190
+
171
191
  ## Installation
172
192
 
173
193
  ### Environment Setup (.env and .venv)
@@ -428,6 +448,11 @@ Provides various statistics about topics:
428
448
 
429
449
  ![llm_interpretation](docs/images/llm_interpretation.png)
430
450
 
451
+ ## Article Scoring Service
452
+
453
+ For service setup and API details, see:
454
+ [`docs/services/article_scoring_service.md`](docs/services/article_scoring_service.md).
455
+
431
456
  ## Support
432
457
 
433
458
  Please use the 'Issues' section to report and discuss any problems with BERTrend.
@@ -8,6 +8,7 @@
8
8
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
9
9
  ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
10
10
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
11
+ [![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Frte-france%2FBERTrend%2Flines)](https://tokei.kojix2.net/github/rte-france/BERTrend)
11
12
 
12
13
  ## News
13
14
 
@@ -39,7 +40,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
39
40
  topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
40
41
  topics and trends over time.
41
42
 
42
- The code base is illustrated via two main demos:
43
+ The code base is illustrated via three main demos:
43
44
 
44
45
  ### Dynamic Topic Modeling Analysis
45
46
 
@@ -85,6 +86,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
85
86
  - Interpretation of these signals using LLMs
86
87
  - Inspection of the topic merging process using Sankey diagram
87
88
 
89
+ ### Prospective Analysis
90
+
91
+ - [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
92
+ Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
93
+
94
+ #### Prospective Analysis Demonstrator Video
95
+
96
+ (Coming soon)
97
+
98
+ #### Demonstrator Features
99
+
100
+ - Data flow configuration and collection status monitoring
101
+ - Model status and monitoring by information source
102
+ - Real-time signal analysis and trend exploration
103
+ - Detailed topic analysis and interpretation
104
+ - Automated report and newsletter generation
105
+ - Comparative analysis between different periods
106
+
88
107
  ## Installation
89
108
 
90
109
  ### Environment Setup (.env and .venv)
@@ -345,6 +364,11 @@ Provides various statistics about topics:
345
364
 
346
365
  ![llm_interpretation](docs/images/llm_interpretation.png)
347
366
 
367
+ ## Article Scoring Service
368
+
369
+ For service setup and API details, see:
370
+ [`docs/services/article_scoring_service.md`](docs/services/article_scoring_service.md).
371
+
348
372
  ## Support
349
373
 
350
374
  Please use the 'Issues' section to report and discuss any problems with BERTrend.
@@ -364,7 +364,7 @@ class BERTrend:
364
364
  # Check if both timestamps exist in topic models
365
365
  if new_model is None or self.last_topic_model is None:
366
366
  raise ValueError(
367
- f"At least one topic model is not valid. You must fit the BERTrend model before merging models."
367
+ "At least one topic model is not valid. You must fit the BERTrend model before merging models."
368
368
  )
369
369
 
370
370
  # Get default BERTrend config if argument is not provided
@@ -7,6 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  import hashlib
9
9
  import os
10
+ import re
10
11
  from contextlib import contextmanager
11
12
  from datetime import datetime
12
13
  from pathlib import Path
@@ -293,11 +294,15 @@ class APSchedulerUtils(SchedulerUtils):
293
294
 
294
295
  def remove_scrapping_for_user(self, feed_id: str, user: str | None = None):
295
296
  """Removes from the scheduler service the job matching the provided feed_id"""
297
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
296
298
  try:
297
299
  job_ids = self.find_jobs(
298
300
  patterns={
299
301
  "url": ".*/scrape-feed.*",
300
- "json_data": {"user": user, "model_id": feed_id},
302
+ "json_data": {
303
+ "user": re.escape(user),
304
+ "model_id": re.escape(feed_id),
305
+ },
301
306
  }
302
307
  )
303
308
  self.remove_jobs(job_ids)
@@ -308,11 +313,15 @@ class APSchedulerUtils(SchedulerUtils):
308
313
 
309
314
  def remove_scheduled_training_for_user(self, model_id: str, user: str):
310
315
  """Removes from the crontab the training job matching the provided model_id"""
316
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
311
317
  try:
312
318
  job_ids = self.find_jobs(
313
319
  patterns={
314
320
  "url": ".*/train-new-model.*",
315
- "json_data": {"user": user, "model_id": model_id},
321
+ "json_data": {
322
+ "user": re.escape(user),
323
+ "model_id": re.escape(model_id),
324
+ },
316
325
  }
317
326
  )
318
327
  self.remove_jobs(job_ids)
@@ -325,11 +334,15 @@ class APSchedulerUtils(SchedulerUtils):
325
334
  self, model_id: str, user: str
326
335
  ) -> bool:
327
336
  """Removes from the crontab the report generation job matching the provided model_id"""
337
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
328
338
  try:
329
339
  job_ids = self.find_jobs(
330
340
  patterns={
331
341
  "url": ".*/generate-report.*",
332
- "json_data": {"user": user, "model_id": model_id},
342
+ "json_data": {
343
+ "user": re.escape(user),
344
+ "model_id": re.escape(model_id),
345
+ },
333
346
  }
334
347
  )
335
348
  self.remove_jobs(job_ids)
@@ -342,11 +355,15 @@ class APSchedulerUtils(SchedulerUtils):
342
355
  self, feed_id: str, user: str | None = None
343
356
  ) -> bool:
344
357
  """Checks if a given scrapping feed is active (registered with the service)."""
358
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
345
359
  try:
346
360
  job_ids = self.find_jobs(
347
361
  patterns={
348
362
  "url": ".*/scrape-feed.*",
349
- "json_data": {"user": user, "model_id": feed_id},
363
+ "json_data": {
364
+ "user": re.escape(user),
365
+ "model_id": re.escape(feed_id),
366
+ },
350
367
  }
351
368
  )
352
369
  return len(job_ids) > 0
@@ -358,11 +375,15 @@ class APSchedulerUtils(SchedulerUtils):
358
375
 
359
376
  def check_if_learning_active_for_user(self, model_id: str, user: str) -> bool:
360
377
  """Checks if a given scrapping feed is active (registered in the crontab"""
378
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
361
379
  try:
362
380
  job_ids = self.find_jobs(
363
381
  patterns={
364
382
  "url": ".*/train-new-model.*",
365
- "json_data": {"user": user, "model_id": model_id},
383
+ "json_data": {
384
+ "user": re.escape(user),
385
+ "model_id": re.escape(model_id),
386
+ },
366
387
  }
367
388
  )
368
389
  return len(job_ids) > 0
@@ -376,11 +397,15 @@ class APSchedulerUtils(SchedulerUtils):
376
397
  self, model_id: str, user: str
377
398
  ) -> bool:
378
399
  """Checks if automated report generation is active (registered in the crontab)"""
400
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
379
401
  try:
380
402
  job_ids = self.find_jobs(
381
403
  patterns={
382
404
  "url": ".*/generate-report.*",
383
- "json_data": {"user": user, "model_id": model_id},
405
+ "json_data": {
406
+ "user": re.escape(user),
407
+ "model_id": re.escape(model_id),
408
+ },
384
409
  }
385
410
  )
386
411
  return len(job_ids) > 0
@@ -394,11 +419,15 @@ class APSchedulerUtils(SchedulerUtils):
394
419
  self, feed_id: str, user: str | None = None
395
420
  ) -> datetime | None:
396
421
  """Return the next scrapping date for the given feed_id and user"""
422
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
397
423
  try:
398
424
  jobs = self.find_jobs_description(
399
425
  patterns={
400
426
  "url": ".*/scrape-feed.*",
401
- "json_data": {"user": user, "model_id": feed_id},
427
+ "json_data": {
428
+ "user": re.escape(user),
429
+ "model_id": re.escape(feed_id),
430
+ },
402
431
  }
403
432
  )
404
433
  if len(jobs) == 0:
@@ -414,11 +443,15 @@ class APSchedulerUtils(SchedulerUtils):
414
443
  self, model_id: str, user: str | None = None
415
444
  ) -> datetime | None:
416
445
  """Return the next scrapping date for the given feed_id and user"""
446
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
417
447
  try:
418
448
  jobs = self.find_jobs_description(
419
449
  patterns={
420
450
  "url": ".*/train-new-model.*",
421
- "json_data": {"user": user, "model_id": model_id},
451
+ "json_data": {
452
+ "user": re.escape(user),
453
+ "model_id": re.escape(model_id),
454
+ },
422
455
  }
423
456
  )
424
457
  if len(jobs) == 0:
@@ -2,7 +2,6 @@
2
2
  # See AUTHORS.txt
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
- import asyncio
6
5
  import os
7
6
  from abc import ABC, abstractmethod
8
7
  from pathlib import Path
@@ -10,6 +9,7 @@ from pathlib import Path
10
9
  import jsonlines
11
10
  import langdetect
12
11
  import pandas as pd
12
+ import requests
13
13
  from dateutil import parser
14
14
  from goose3 import Goose
15
15
  from joblib import Parallel, delayed
@@ -17,12 +17,11 @@ from loguru import logger
17
17
  from newspaper import Article
18
18
 
19
19
  from bertrend.article_scoring.article_scoring import QualityLevel
20
- from bertrend.article_scoring.scoring_agent import score_articles
21
- from bertrend.utils.data_loading import TEXT_COLUMN
22
20
  from bertrend.bertrend_apps.data_provider.utils import (
23
21
  decode_google_news_url,
24
22
  wait_if_seen_url,
25
23
  )
24
+ from bertrend.utils.data_loading import TEXT_COLUMN
26
25
 
27
26
  # Ensures to write with +rw for both user and groups
28
27
  os.umask(0o002)
@@ -85,27 +84,53 @@ class DataProvider(ABC):
85
84
 
86
85
  @staticmethod
87
86
  def evaluate_quality(
88
- articles: list[dict], minimum_quality_level: QualityLevel
87
+ articles: list[dict], minimum_quality_level: QualityLevel = QualityLevel.AVERAGE
89
88
  ) -> list[dict]:
90
89
  texts = [article[TEXT_COLUMN] for article in articles]
90
+ article_scoring_service_url = os.getenv("ARTICLE_SCORING_SERVICE_URL")
91
+
92
+ if not article_scoring_service_url:
93
+ logger.warning(
94
+ "ARTICLE_SCORING_SERVICE_URL is not set; skipping article quality filtering."
95
+ )
96
+ return articles
97
+
98
+ try:
99
+ response = requests.post(
100
+ f"{article_scoring_service_url.rstrip('/')}/score",
101
+ json={"articles": texts},
102
+ timeout=300,
103
+ )
104
+ response.raise_for_status()
105
+ payload = response.json()
106
+ results = payload.get("results", [])
107
+ except requests.RequestException as exc:
108
+ logger.warning(
109
+ f"Article scoring service unavailable at {article_scoring_service_url}: {exc}. "
110
+ "Skipping article quality filtering."
111
+ )
112
+ return articles
91
113
 
92
- # Evaluate quality of articles using a LLM agent
93
- results = asyncio.run(score_articles(texts))
114
+ if len(results) != len(texts):
115
+ logger.warning(
116
+ "Article scoring service returned an unexpected number of results; "
117
+ "skipping article quality filtering."
118
+ )
119
+ return articles
94
120
 
95
- # Filter out articles with quality < minimum_quality
121
+ # Filter out articles with quality < minimum_quality_level
96
122
  filtered_articles = [
97
123
  {
98
124
  **article,
99
- "quality_metrics": results[i].output.model_dump(),
100
- "overall_quality": results[i].output.quality_level.name,
125
+ "quality_metrics": results[i]["quality_metrics"],
126
+ "overall_quality": results[i]["overall_quality"],
101
127
  }
102
- # 1. Ensure output is NOT None before proceeding
103
128
  for i, article in enumerate(articles)
104
- if results[i].output is not None
105
- # 2. Then, check the quality level
106
- and results[i].output.quality_level >= minimum_quality_level
129
+ if results[i].get("overall_quality") in QualityLevel.__members__
130
+ and QualityLevel[results[i]["overall_quality"]] >= minimum_quality_level
131
+ and not results[i].get("error")
107
132
  ]
108
- assert len(results) == len(texts)
133
+
109
134
  logger.info(
110
135
  f"Filtered out {len(articles) - len(filtered_articles)} articles with quality < {minimum_quality_level.name}"
111
136
  )
@@ -31,7 +31,7 @@ def show() -> None:
31
31
  except Exception as e:
32
32
  logger.error(e)
33
33
  st.error(
34
- f"Erreur lors du chargement des données. Vérifiez que vos données respectent le format Curebot attendu."
34
+ "Erreur lors du chargement des données. Vérifiez que vos données respectent le format Curebot attendu."
35
35
  )
36
36
 
37
37
  # If data is loaded
@@ -45,7 +45,7 @@ def show() -> None:
45
45
  st.button(
46
46
  "Éditer",
47
47
  on_click=edit_newsletter,
48
- disabled=not "newsletter_text" in st.session_state,
48
+ disabled="newsletter_text" not in st.session_state,
49
49
  )
50
50
 
51
51
  # Show newsletter download button
@@ -65,7 +65,7 @@ def show() -> None:
65
65
  file_name="newsletters.html",
66
66
  mime="text/html",
67
67
  data=data,
68
- disabled=not "newsletter_text" in st.session_state,
68
+ disabled="newsletter_text" not in st.session_state,
69
69
  )
70
70
 
71
71
  # Show newsletter
@@ -3,14 +3,17 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
  import hmac
6
+ import os
6
7
 
7
8
  import streamlit as st
8
9
 
9
- from bertrend.demos.demos_utils.icons import UNHAPPY_ICON
10
+ from bertrend.bertrend_apps.prospective_demo.i18n import translate
11
+ from bertrend.demos.demos_utils.icons import EMAIL_ICON, UNHAPPY_ICON
10
12
 
11
13
 
12
14
  def login_form():
13
15
  """Form with widgets to collect user information"""
16
+ st.header("")
14
17
  with st.form("Credentials"):
15
18
  st.text_input("Username", key="username")
16
19
  st.text_input("Password", type="password", key="password")
@@ -38,6 +41,16 @@ def logout():
38
41
  del st.session_state["username"]
39
42
 
40
43
 
44
+ def show_contact_info():
45
+ contact = os.getenv("BERTREND_CONTACT_EMAIL", "contact@bertrend.com")
46
+ st.link_button(translate("contact_msg"), f"mailto:{contact}", icon=EMAIL_ICON)
47
+
48
+
49
+ def show_project_info():
50
+ st.write("")
51
+ st.markdown(translate("project_info_msg"))
52
+
53
+
41
54
  def check_password() -> str | None:
42
55
  """Returns the user name if the user had a correct password, otherwise None."""
43
56
 
@@ -49,4 +62,8 @@ def check_password() -> str | None:
49
62
  login_form()
50
63
  if "password_correct" in st.session_state:
51
64
  st.error(f"{UNHAPPY_ICON} User not known or password incorrect")
65
+
66
+ show_contact_info()
67
+
68
+ show_project_info()
52
69
  return None
@@ -20,6 +20,7 @@ from bertrend.bertrend_apps.prospective_demo.feeds_common import (
20
20
  read_user_feeds,
21
21
  )
22
22
  from bertrend.bertrend_apps.prospective_demo.i18n import translate
23
+ from bertrend.bertrend_apps.prospective_demo.models_info import delete_model_config
23
24
  from bertrend.config.parameters import LANGUAGES
24
25
  from bertrend.demos.demos_utils.icons import (
25
26
  ADD_ICON,
@@ -337,7 +338,6 @@ def handle_delete(row_dict: dict):
337
338
  feed_id=feed_id, user=st.session_state.username
338
339
  )
339
340
  delete_feed_config(feed_id)
340
- logger.info(f"Flux {feed_id} supprimé !")
341
341
  # Remove from crontab associated training
342
342
  SCHEDULER_UTILS.remove_scheduled_training_for_user(
343
343
  model_id=feed_id, user=st.session_state.username
@@ -349,6 +349,8 @@ def handle_delete(row_dict: dict):
349
349
  SCHEDULER_UTILS.remove_scheduled_report_generation_for_user(
350
350
  model_id=feed_id, user=st.session_state.username
351
351
  )
352
+ delete_model_config(feed_id)
353
+ logger.info(f"Flux {feed_id} supprimé !")
352
354
  time.sleep(0.2)
353
355
  st.rerun()
354
356
  with col2:
@@ -3,10 +3,18 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
  TRANSLATIONS = {
6
+ "project_info_msg": {
7
+ "fr": "BERTrend est un projet open-source développé par RTE. Visitez notre github pour plus d'informations: https://github.com/rte-france/BERTrend",
8
+ "en": "BERTrend is an open-source project developed by RTE. Visit our github for more information: https://github.com/rte-france/BERTrend",
9
+ },
10
+ "contact_msg": {
11
+ "en": "Questions, new account or bug reports? Contact us !",
12
+ "fr": "Des questions, un nouveau compte ou des rapports de bugs ? Contactez-nous !",
13
+ },
6
14
  # App.py translations
7
15
  "app_title": {
8
- "fr": "BERTrend - Démo Veille & Analyse",
9
- "en": "BERTrend - Monitoring & Analysis Demo",
16
+ "fr": "BERTrend - IA pour la Veille (Analyses & Tendances)",
17
+ "en": "BERTrend - AI for Monitoring, Analysis & Trends",
10
18
  },
11
19
  "check_data_button_label": {"fr": "Vérifier les données", "en": "Check data"},
12
20
  "tab_monitoring": {"fr": "Veilles", "en": "Monitoring"},
@@ -13,6 +13,16 @@ import toml
13
13
  from loguru import logger
14
14
 
15
15
  from bertrend import load_toml_config
16
+ from bertrend.bertrend_apps import SCHEDULER_UTILS
17
+ from bertrend.bertrend_apps.prospective_demo import (
18
+ DEFAULT_ANALYSIS_CFG,
19
+ get_model_cfg_path,
20
+ get_user_models_path,
21
+ )
22
+ from bertrend.bertrend_apps.prospective_demo.i18n import translate
23
+ from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
24
+ from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
25
+ from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
16
26
  from bertrend.config.parameters import LANGUAGES
17
27
  from bertrend.demos.demos_utils.icons import (
18
28
  DELETE_ICON,
@@ -28,16 +38,6 @@ from bertrend.demos.streamlit_components.clickable_df_component import clickable
28
38
  from bertrend.demos.streamlit_components.input_with_pills_component import (
29
39
  input_with_pills,
30
40
  )
31
- from bertrend.bertrend_apps import SCHEDULER_UTILS
32
- from bertrend.bertrend_apps.prospective_demo import (
33
- DEFAULT_ANALYSIS_CFG,
34
- get_model_cfg_path,
35
- get_user_models_path,
36
- )
37
- from bertrend.bertrend_apps.prospective_demo.i18n import translate
38
- from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
39
- from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
40
- from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
41
41
 
42
42
 
43
43
  @st.cache_data(ttl=60)
@@ -302,6 +302,17 @@ def save_model_config(model_id: str, config: dict):
302
302
  logger.debug(f"Saved model analysis config {config} to {model_cfg_path}")
303
303
 
304
304
 
305
+ def delete_model_config(model_id: str):
306
+ model_cfg_path = get_model_cfg_path(
307
+ user_name=st.session_state.username, model_id=model_id
308
+ )
309
+ if os.path.exists(model_cfg_path):
310
+ os.remove(model_cfg_path)
311
+ logger.info(f"Model config {model_id} removed")
312
+ else:
313
+ logger.warning(f"Model config {model_id} not found")
314
+
315
+
305
316
  @st.dialog(translate("dialog_confirmation"))
306
317
  def handle_delete_models(row_dict: dict):
307
318
  """Function to handle remove models from cache"""