bertrend 0.3.24__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. {bertrend-0.3.24 → bertrend-0.4.0}/PKG-INFO +131 -98
  2. {bertrend-0.3.24 → bertrend-0.4.0}/README.md +118 -85
  3. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/BERTopicModel.py +14 -16
  4. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/BERTrend.py +11 -13
  5. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/__init__.py +1 -2
  6. bertrend-0.4.0/bertrend/article_scoring/__init__.py +4 -0
  7. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/article_scoring.py +5 -5
  8. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/prompts.py +1 -1
  9. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/article_scoring/scoring_agent.py +7 -3
  10. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/__init__.py +3 -5
  11. bertrend-0.4.0/bertrend/bertrend_apps/common/__init__.py +4 -0
  12. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/apscheduler_utils.py +8 -9
  13. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/crontab_utils.py +3 -3
  14. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/date_utils.py +1 -1
  15. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/mail_utils.py +2 -3
  16. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/common/scheduler_utils.py +4 -5
  17. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__init__.py +1 -2
  18. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__main__.py +5 -6
  19. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/arxiv_provider.py +5 -6
  20. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/atom_feed_provider.py +4 -4
  21. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/bing_news_provider.py +3 -3
  22. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider.py +8 -5
  23. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider_utils.py +12 -10
  24. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/google_news_provider.py +3 -3
  25. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/newscatcher_provider.py +3 -3
  26. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/rss_feed_provider.py +4 -4
  27. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/utils.py +1 -1
  28. bertrend-0.4.0/bertrend/bertrend_apps/exploration/__init__.py +4 -0
  29. bertrend-0.4.0/bertrend/bertrend_apps/exploration/curebot/__init__.py +4 -0
  30. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app.py +6 -1
  31. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app_utils.py +17 -9
  32. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +1 -5
  33. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/prompts.py +5 -0
  34. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +1 -1
  35. bertrend-0.4.0/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +5 -0
  36. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab1.py +7 -2
  37. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab2.py +6 -1
  38. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab3.py +8 -1
  39. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/dataviz/Main_page.py +2 -2
  40. bertrend-0.4.0/bertrend/bertrend_apps/exploration/dataviz/__init__.py +4 -0
  41. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +5 -5
  42. bertrend-0.4.0/bertrend/bertrend_apps/exploration/dataviz/pages/__init__.py +5 -0
  43. bertrend-0.4.0/bertrend/bertrend_apps/exploration/geolocalization/__init__.py +4 -0
  44. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/entity_utils.py +5 -5
  45. bertrend-0.4.0/bertrend/bertrend_apps/exploration/geolocalization/spacy/__init__.py +4 -0
  46. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +3 -3
  47. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +4 -5
  48. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/utils.py +3 -3
  49. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/start_apps.sh +1 -1
  50. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/stop_apps.sh +1 -1
  51. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/install_feeds_and_newsletters.py +3 -2
  52. bertrend-0.4.0/bertrend/bertrend_apps/newsletters/__init__.py +4 -0
  53. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/__main__.py +4 -5
  54. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/newsletter_generation.py +20 -21
  55. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/utils.py +2 -2
  56. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/__init__.py +2 -2
  57. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/app.py +23 -19
  58. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/authentication.py +1 -1
  59. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/automated_report_generation.py +22 -20
  60. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_analysis.py +13 -11
  61. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_common.py +4 -4
  62. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_comparative.py +17 -17
  63. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_signals.py +21 -17
  64. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/data_model.py +2 -2
  65. bertrend-0.4.0/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +451 -0
  66. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_common.py +2 -2
  67. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_config.py +29 -15
  68. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_data.py +5 -5
  69. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n.py +3 -4
  70. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n_translations.py +1 -3
  71. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/llm_utils.py +1 -1
  72. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/models_info.py +15 -16
  73. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/perf_utils.py +1 -1
  74. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/process_new_data.py +16 -15
  75. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation.py +27 -25
  76. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation_utils.py +2 -2
  77. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/start_demo.sh +1 -2
  78. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/utils.py +1 -1
  79. bertrend-0.4.0/bertrend/bertrend_apps/services/__init__.py +4 -0
  80. bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/__init__.py +5 -0
  81. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/bertrend_service.py +4 -4
  82. bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/config/__init__.py +5 -0
  83. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/config/settings.py +3 -2
  84. bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/models/__init__.py +4 -0
  85. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/bertrend_app_models.py +2 -1
  86. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/data_provider_models.py +5 -3
  87. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/newsletters_models.py +1 -1
  88. bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +4 -0
  89. bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +124 -0
  90. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/data_provider.py +75 -54
  91. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/info.py +3 -3
  92. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/newsletters.py +27 -26
  93. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/start.py +5 -5
  94. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/status.py +4 -3
  95. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/stop.py +2 -2
  96. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/__init__.py +5 -0
  97. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +299 -0
  98. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/client.py +337 -0
  99. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +15 -0
  100. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/queue_manager.py +208 -0
  101. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +40 -0
  102. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +8 -0
  103. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +6 -0
  104. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/__init__.py +5 -0
  105. bertrend-0.4.0/bertrend/bertrend_apps/services/queue_monitor/app.py +603 -0
  106. bertrend-0.4.0/bertrend/bertrend_apps/services/utils/__init__.py +4 -0
  107. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/services/utils/logging_utils.py +1 -1
  108. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/data_loading_component.py +13 -31
  109. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n.py +3 -4
  110. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/parameters_component.py +10 -12
  111. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/state_utils.py +0 -1
  112. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/clickable_df_component.py +1 -1
  113. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/input_with_pills_component.py +3 -2
  114. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +10 -11
  115. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +9 -10
  116. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +15 -15
  117. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/training_page.py +11 -11
  118. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/i18n_translations.py +0 -1
  119. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/app.py +32 -29
  120. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/visualizations_utils.py +10 -11
  121. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/agent_utils.py +9 -21
  122. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_features.py +9 -9
  123. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/openai_client.py +52 -100
  124. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/metrics/temporal_metrics_embedding.py +8 -7
  125. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/metrics/topic_metrics.py +4 -4
  126. bertrend-0.4.0/bertrend/services/__init__.py +4 -0
  127. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/authentication.py +1 -1
  128. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_client.py +8 -10
  129. bertrend-0.4.0/bertrend/services/embedding_server/__init__.py +4 -0
  130. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/config/settings.py +3 -2
  131. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/main.py +2 -3
  132. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/models.py +1 -1
  133. bertrend-0.4.0/bertrend/services/embedding_server/routers/__init__.py +4 -0
  134. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/authentication.py +1 -1
  135. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/embeddings.py +1 -1
  136. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/info.py +1 -1
  137. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/security.py +11 -7
  138. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/start.py +3 -3
  139. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/status.py +3 -2
  140. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/stop.py +1 -1
  141. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_service.py +3 -4
  142. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/Dockerfile +1 -1
  143. bertrend-0.4.0/bertrend/services/scheduling/__init__.py +4 -0
  144. bertrend-0.4.0/bertrend/services/scheduling/dashboard.html +699 -0
  145. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/docker-compose.yml +5 -3
  146. bertrend-0.4.0/bertrend/services/scheduling/job_utils/__init__.py +4 -0
  147. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/job_utils/job_functions.py +1 -1
  148. bertrend-0.4.0/bertrend/services/scheduling/models/__init__.py +4 -0
  149. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/models/scheduling_models.py +2 -2
  150. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/routers/info.py +1 -1
  151. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/routers/scheduling.py +16 -24
  152. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/scheduling_service.py +4 -3
  153. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summarizer.py +1 -1
  154. bertrend-0.4.0/bertrend/services/summary/__init__.py +4 -0
  155. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/abstractive_summarizer.py +2 -3
  156. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/chatgpt_summarizer.py +2 -4
  157. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/extractive_summarizer.py +8 -8
  158. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/lexrank.py +1 -1
  159. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/summary/prompts.py +1 -2
  160. bertrend-0.4.0/bertrend/tests/__init__.py +4 -0
  161. bertrend-0.4.0/bertrend/tests/apps/__init__.py +4 -0
  162. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_bertrend_service.py +109 -22
  163. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_lazy_scheduler.py +3 -4
  164. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_models.py +11 -10
  165. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_multiworker.py +3 -4
  166. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_process_new_data.py +74 -60
  167. bertrend-0.4.0/bertrend/tests/apps/test_routers_bertrend_app.py +339 -0
  168. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/apps/test_routers_info.py +2 -2
  169. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/conftest.py +1 -1
  170. bertrend-0.4.0/bertrend/tests/core/__init__.py +4 -0
  171. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_bertrend.py +6 -8
  172. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_data_structure.py +1 -1
  173. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_representative_docs.py +4 -3
  174. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_temporal_metrics_embedding.py +4 -3
  175. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_description.py +5 -4
  176. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_metrics.py +5 -4
  177. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_topic_model.py +3 -4
  178. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_data_structure.py +6 -6
  179. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_prompts.py +17 -16
  180. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_visualizations.py +8 -7
  181. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_weak_signals.py +12 -13
  182. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/core/test_visualizations.py +8 -7
  183. bertrend-0.4.0/bertrend/tests/llm/__init__.py +4 -0
  184. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_agent_utils.py +17 -10
  185. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring.py +6 -5
  186. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring_models.py +4 -3
  187. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_newsletter_features.py +13 -12
  188. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/llm/test_newsletter_model.py +6 -5
  189. bertrend-0.4.0/bertrend/tests/llm/test_openai_client.py +264 -0
  190. bertrend-0.4.0/bertrend/tests/services/__init__.py +4 -0
  191. bertrend-0.4.0/bertrend/tests/services/embedding/__init__.py +4 -0
  192. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/embedding/test_embedding_client.py +6 -5
  193. bertrend-0.4.0/bertrend/tests/services/queue/__init__.py +4 -0
  194. bertrend-0.4.0/bertrend/tests/services/queue/test_bertrend_worker.py +176 -0
  195. bertrend-0.4.0/bertrend/tests/services/queue/test_client.py +103 -0
  196. bertrend-0.4.0/bertrend/tests/services/queue/test_queue_manager.py +152 -0
  197. bertrend-0.4.0/bertrend/tests/services/scheduling/__init__.py +4 -0
  198. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_job_exception_fix.py +10 -12
  199. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_scheduling_service.py +5 -3
  200. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_stress_test.py +12 -15
  201. bertrend-0.4.0/bertrend/tests/services/summarizer/__init__.py +4 -0
  202. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +4 -3
  203. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +5 -4
  204. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +5 -4
  205. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_summarizer.py +4 -3
  206. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/test_installation.py +6 -1
  207. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/test_integration.py +7 -7
  208. bertrend-0.4.0/bertrend/tests/utils/__init__.py +4 -0
  209. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_apscheduler_utils.py +50 -45
  210. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_cache_utils.py +3 -3
  211. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_config_utils.py +3 -2
  212. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_crontab_utils.py +61 -34
  213. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_data_loading.py +9 -8
  214. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_date_utils.py +2 -2
  215. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_mail_utils.py +34 -34
  216. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_scheduler_utils.py +8 -8
  217. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/utils/test_utils_init.py +3 -1
  218. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/visualizations.py +2 -1
  219. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/prompts.py +3 -4
  220. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/visualizations.py +0 -3
  221. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/weak_signals.py +2 -2
  222. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/__init__.py +1 -0
  223. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/cache_utils.py +1 -2
  224. {bertrend-0.3.24 → bertrend-0.4.0}/pyproject.toml +12 -19
  225. bertrend-0.3.24/bertrend/services/embedding_server/__init__.py +0 -4
  226. bertrend-0.3.24/bertrend/services/embedding_server/routers/__init__.py +0 -4
  227. bertrend-0.3.24/bertrend/services/scheduling/__init__.py +0 -4
  228. bertrend-0.3.24/bertrend/services/scheduling/dashboard.html +0 -698
  229. bertrend-0.3.24/bertrend/services/scheduling/job_utils/__init__.py +0 -4
  230. bertrend-0.3.24/bertrend/services/scheduling/models/__init__.py +0 -4
  231. bertrend-0.3.24/bertrend/services/summary/__init__.py +0 -4
  232. bertrend-0.3.24/bertrend/tests/__init__.py +0 -4
  233. bertrend-0.3.24/bertrend/tests/apps/__init__.py +0 -4
  234. bertrend-0.3.24/bertrend/tests/apps/test_routers_bertrend_app.py +0 -285
  235. bertrend-0.3.24/bertrend/tests/core/__init__.py +0 -4
  236. bertrend-0.3.24/bertrend/tests/llm/__init__.py +0 -4
  237. bertrend-0.3.24/bertrend/tests/llm/test_openai_client.py +0 -210
  238. bertrend-0.3.24/bertrend/tests/services/__init__.py +0 -4
  239. bertrend-0.3.24/bertrend/tests/services/embedding/__init__.py +0 -4
  240. bertrend-0.3.24/bertrend/tests/services/scheduling/__init__.py +0 -4
  241. bertrend-0.3.24/bertrend/tests/services/summarizer/__init__.py +0 -4
  242. bertrend-0.3.24/bertrend/tests/utils/__init__.py +0 -4
  243. bertrend-0.3.24/bertrend/topic_analysis/__init__.py +0 -4
  244. bertrend-0.3.24/bertrend/trend_analysis/__init__.py +0 -4
  245. bertrend-0.3.24/bertrend_apps/common/__init__.py +0 -4
  246. bertrend-0.3.24/bertrend_apps/exploration/__init__.py +0 -4
  247. bertrend-0.3.24/bertrend_apps/exploration/curebot/__init__.py +0 -4
  248. bertrend-0.3.24/bertrend_apps/exploration/dataviz/__init__.py +0 -4
  249. bertrend-0.3.24/bertrend_apps/exploration/geolocalization/__init__.py +0 -4
  250. bertrend-0.3.24/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -4
  251. bertrend-0.3.24/bertrend_apps/newsletters/__init__.py +0 -4
  252. bertrend-0.3.24/bertrend_apps/prospective_demo/detailed_report_template.html +0 -438
  253. bertrend-0.3.24/bertrend_apps/prospective_demo/docs/architecture.md +0 -82
  254. bertrend-0.3.24/bertrend_apps/prospective_demo/docs/automated_report_generation.md +0 -289
  255. bertrend-0.3.24/bertrend_apps/services/__init__.py +0 -4
  256. bertrend-0.3.24/bertrend_apps/services/models/__init__.py +0 -4
  257. bertrend-0.3.24/bertrend_apps/services/routers/__init__.py +0 -4
  258. bertrend-0.3.24/bertrend_apps/services/routers/bertrend_app.py +0 -140
  259. bertrend-0.3.24/bertrend_apps/services/utils/__init__.py +0 -4
  260. {bertrend-0.3.24 → bertrend-0.4.0}/AUTHORS.txt +0 -0
  261. {bertrend-0.3.24 → bertrend-0.4.0}/LICENSE.md +0 -0
  262. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  263. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  264. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  265. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  266. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  267. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  268. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  269. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  270. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  271. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  272. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  273. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  274. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  275. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/config.toml +0 -0
  276. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  277. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  278. {bertrend-0.3.24 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
  279. {bertrend-0.3.24/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/config/default_config.toml +0 -0
  280. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/bertopic_default_config.toml +0 -0
  281. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/bertrend_default_config.toml +0 -0
  282. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/parameters.py +0 -0
  283. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/config/services_default_config.toml +0 -0
  284. {bertrend-0.3.24/bertrend/article_scoring → bertrend-0.4.0/bertrend/demos}/__init__.py +0 -0
  285. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/__init__.py +0 -0
  286. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  287. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  288. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/demos_utils/icons.py +0 -0
  289. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_summarizer_app.sh +0 -0
  290. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  291. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/start_weak_signals_app.sh +0 -0
  292. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/streamlit_components/__init__.py +0 -0
  293. {bertrend-0.3.24/bertrend/demos → bertrend-0.4.0/bertrend/demos/summarization}/__init__.py +0 -0
  294. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/summarization/summarizer_app.py +1 -1
  295. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  296. {bertrend-0.3.24/bertrend/demos/summarization → bertrend-0.4.0/bertrend/demos/topic_analysis}/__init__.py +0 -0
  297. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app.py +6 -6
  298. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app_utils.py +2 -2
  299. {bertrend-0.3.24/bertrend/demos/topic_analysis → bertrend-0.4.0/bertrend/demos/topic_analysis/demo_pages}/__init__.py +0 -0
  300. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  301. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  302. {bertrend-0.3.24/bertrend/demos/topic_analysis/demo_pages → bertrend-0.4.0/bertrend/demos/weak_signals}/__init__.py +0 -0
  303. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  304. {bertrend-0.3.24/bertrend/demos/weak_signals → bertrend-0.4.0/bertrend/llm_utils}/__init__.py +0 -0
  305. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter.css +0 -0
  306. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_model.py +1 -1
  307. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  308. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_template.html +0 -0
  309. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/llm_utils/prompts.py +0 -0
  310. {bertrend-0.3.24/bertrend/llm_utils → bertrend-0.4.0/bertrend/metrics}/__init__.py +0 -0
  311. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/common_ngrams.json +0 -0
  312. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-en.json +0 -0
  313. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-fr.json +0 -0
  314. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/resources/stopwords-rte.json +0 -0
  315. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/cert.pem +0 -0
  316. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/README.md +0 -0
  317. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  318. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  319. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/embedding_server/requirements.txt +0 -0
  320. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/key.pem +0 -0
  321. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/.dockerignore +0 -0
  322. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/Docker_setup.md +0 -0
  323. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/services/scheduling/requirements.txt +0 -0
  324. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/tests/README_integration_tests.md +0 -0
  325. {bertrend-0.3.24/bertrend/metrics → bertrend-0.4.0/bertrend/topic_analysis}/__init__.py +0 -0
  326. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/data_structure.py +0 -0
  327. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/prompts.py +0 -0
  328. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/representative_docs.py +0 -0
  329. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/topic_analysis/topic_description.py +0 -0
  330. {bertrend-0.3.24/bertrend/services → bertrend-0.4.0/bertrend/trend_analysis}/__init__.py +0 -0
  331. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/data_structure.py +0 -0
  332. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  333. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  334. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/config_utils.py +0 -0
  335. {bertrend-0.3.24 → bertrend-0.4.0}/bertrend/utils/data_loading.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bertrend
3
- Version: 0.3.24
3
+ Version: 0.4.0
4
4
  Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
5
5
  License: LICENSE.md
6
6
  License-File: AUTHORS.txt
@@ -12,12 +12,12 @@ Maintainer: Jérôme Picault
12
12
  Maintainer-email: jerome.picault@rte-france.com
13
13
  Requires-Python: >=3.12,<4.0
14
14
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
- Provides-Extra: apps
16
15
  Requires-Dist: APScheduler (>=3.11.0)
17
16
  Requires-Dist: PyJWT (>=2.10.1)
18
17
  Requires-Dist: Pyqtree (==1.0.0)
19
18
  Requires-Dist: SQLAlchemy (>=2.0.40)
20
- Requires-Dist: arxiv (>=2.2.0) ; extra == "apps"
19
+ Requires-Dist: aio-pika (>=9.5.5)
20
+ Requires-Dist: arxiv (>=2.2.0)
21
21
  Requires-Dist: bertopic (==0.16.2)
22
22
  Requires-Dist: black (>=24.10.0)
23
23
  Requires-Dist: coverage (>=7.6.9)
@@ -27,12 +27,12 @@ Requires-Dist: datamapplot (==0.3.0)
27
27
  Requires-Dist: dateparser (>=1.2.0)
28
28
  Requires-Dist: dill (>=0.4.0)
29
29
  Requires-Dist: fastapi (>=0.120.0)
30
- Requires-Dist: feedparser (>=6.0.11) ; extra == "apps"
30
+ Requires-Dist: feedparser (>=6.0.11)
31
31
  Requires-Dist: gensim (>=4.3.3)
32
- Requires-Dist: google-api-python-client (>=2.148.0) ; extra == "apps"
33
- Requires-Dist: google-auth-oauthlib (>=1.2.1) ; extra == "apps"
34
- Requires-Dist: googlenewsdecoder (>=0.1.7) ; extra == "apps"
35
- Requires-Dist: goose3 (>=3.1.19) ; extra == "apps"
32
+ Requires-Dist: google-api-python-client (>=2.148.0)
33
+ Requires-Dist: google-auth-oauthlib (>=1.2.1)
34
+ Requires-Dist: googlenewsdecoder (>=0.1.7)
35
+ Requires-Dist: goose3 (>=3.1.19)
36
36
  Requires-Dist: hdbscan (>=0.8.40)
37
37
  Requires-Dist: ipython (>=8.28.0)
38
38
  Requires-Dist: joblib (>=1.4.2)
@@ -42,20 +42,20 @@ Requires-Dist: langdetect (>=1.0.9)
42
42
  Requires-Dist: loguru (>=0.7.3)
43
43
  Requires-Dist: lxml-html-clean (>=0.2.2)
44
44
  Requires-Dist: markdown (>=3.7)
45
- Requires-Dist: newscatcher-sdk (>=1.4.0) ; extra == "apps"
46
- Requires-Dist: newspaper4k (>=0.9.3.1) ; extra == "apps"
45
+ Requires-Dist: newscatcher-sdk (>=1.4.0)
46
+ Requires-Dist: newspaper4k (>=0.9.3.1)
47
47
  Requires-Dist: nltk (>=3.9.1)
48
- Requires-Dist: numpy (<2)
49
48
  Requires-Dist: openai (>=1.77.0)
50
49
  Requires-Dist: openai-agents[litellm] (>=0.4.0)
51
50
  Requires-Dist: openpyxl (>=3.1.5)
52
51
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
53
52
  Requires-Dist: pandas (>=2.2.2)
53
+ Requires-Dist: pika (>=1.3.2)
54
54
  Requires-Dist: plotly (>=5.24.1)
55
55
  Requires-Dist: plotly-resampler (>=0.10.0)
56
56
  Requires-Dist: psutil (>=7.2.1)
57
57
  Requires-Dist: pyarrow (>=21.0.0)
58
- Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
58
+ Requires-Dist: pygooglenews (>=0.1.3)
59
59
  Requires-Dist: pylabeladjust (==0.1.13)
60
60
  Requires-Dist: pytest (>=8.4.0)
61
61
  Requires-Dist: pytest-asyncio
@@ -67,7 +67,7 @@ Requires-Dist: seaborn (>=0.13.2)
67
67
  Requires-Dist: sentence-transformers (==3.0.1)
68
68
  Requires-Dist: sentencepiece (>=0.2.0)
69
69
  Requires-Dist: starlette (>=0.46.2)
70
- Requires-Dist: streamlit (>=1.50)
70
+ Requires-Dist: streamlit (>=1.51.0)
71
71
  Requires-Dist: streamlit-code-editor (>=0.1.22)
72
72
  Requires-Dist: supervisor (>=4.3.0)
73
73
  Requires-Dist: thefuzz (>=0.22.1)
@@ -95,7 +95,9 @@ Description-Content-Type: text/markdown
95
95
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
96
96
 
97
97
  ## News
98
- 2025-11-24: BERTrend has been integrated into the [Netminer 5](https://netminer.gitbook.io/netminer5/module-reference/text/bertopic/bertrend) data analysis tool !
98
+
99
+ 2025-11-24: BERTrend has been integrated into
100
+ the [Netminer 5](https://netminer.gitbook.io/netminer5/module-reference/text/bertopic/bertrend) data analysis tool !
99
101
 
100
102
  ## Overview
101
103
 
@@ -103,38 +105,48 @@ Description-Content-Type: text/markdown
103
105
 
104
106
  ## Paper
105
107
 
106
- The code in this repository is part of the work described in the paper:
108
+ The code in this repository is part of the work described in the paper:
107
109
  [BERTrend: Neural Topic Modeling for Emerging Trends Detection](./BERTrend%20paper.pdf).
108
110
 
109
111
  ## Description
110
112
 
111
- BERTrend is a novel framework for detecting and monitoring weak signals in large, evolving text corpora. It uses neural topic modeling, specifically [BERTopic](https://github.com/MaartenGr/BERTopic), in an online learning setting to identify and track topic evolution over time.
112
-
113
- BERTrend classifies topics as noise, weak signals, or strong signals based on their popularity trends, using a metric that considers both the number of documents and update frequency. This method allows for real-time monitoring and analysis of emerging trends while filtering out noise.
113
+ BERTrend is a novel framework for detecting and monitoring weak signals in large, evolving text corpora. It uses neural
114
+ topic modeling, specifically [BERTopic](https://github.com/MaartenGr/BERTopic), in an online learning setting to
115
+ identify and track topic evolution over time.
114
116
 
117
+ BERTrend classifies topics as noise, weak signals, or strong signals based on their popularity trends, using a metric
118
+ that considers both the number of documents and update frequency. This method allows for real-time monitoring and
119
+ analysis of emerging trends while filtering out noise.
115
120
 
116
121
  ## Main Features
117
122
 
118
- The BERTrend repository provides a set of metrics, methods, and visualization tools to support the analysis of dynamic topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging topics and trends over time.
123
+ The BERTrend repository provides a set of metrics, methods, and visualization tools to support the analysis of dynamic
124
+ topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
125
+ topics and trends over time.
119
126
 
120
127
  The code base is illustrated via two main demos:
121
128
 
122
129
  ### Dynamic Topic Modeling Analysis
123
130
 
124
131
  - [bertrend/demos/topic_analysis](bertrend/demos/topic_analysis): Focuses on dynamic topic modeling analysis using:
125
- - Dedicated metrics, called TEMPTopic:
126
- - Stability Evaluation: Measures the stability of topics over time, evaluating how consistent and coherent topics remain.
127
- - Volatility Assessment: Analyzes the volatility of topics, identifying how much topics change over different time periods.
128
- - Two Perspectives:
129
- - Temporal Topic Embedding Stability: Evaluates the stability of topic embeddings over time.
130
- - Temporal Topic Representation Stability: Assesses the stability of topic representations over time.
131
- - Visualization tools to easily assess the results.
132
-
133
- #### Topic Modeling Analysis Demonstrator Video
132
+ - Dedicated metrics, called TEMPTopic:
133
+ - Stability Evaluation: Measures the stability of topics over time, evaluating how consistent and coherent
134
+ topics remain.
135
+ - Volatility Assessment: Analyzes the volatility of topics, identifying how much topics change over different
136
+ time periods.
137
+ - Two Perspectives:
138
+ - Temporal Topic Embedding Stability: Evaluates the stability of topic embeddings over time.
139
+ - Temporal Topic Representation Stability: Assesses the stability of topic representations over time.
140
+ - Visualization tools to easily assess the results.
141
+
142
+ #### Topic Modeling Analysis Demonstrator Video
143
+
134
144
  https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
135
145
 
136
146
  #### Demonstrator Features
137
- - Data management: selection of single/multiple datasets, filter by time, filter by size, split long documents by paragraphs
147
+
148
+ - Data management: selection of single/multiple datasets, filter by time, filter by size, split long documents by
149
+ paragraphs
138
150
  - Customization of BERTopic parameters
139
151
  - Exploration of topics by source, generate topic summaries using specific sources
140
152
  - Generate and customize newsletters by applying LLMs on BERTopic's output topics
@@ -147,10 +159,11 @@ https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
147
159
  - [bertrend/demos/weak_signals](bertrend/demos/weak_signals): Identifies and analyzes emerging trends and signals
148
160
 
149
161
  #### Weak Signal Analysis Demonstrator Video
150
- https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
151
162
 
163
+ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
152
164
 
153
165
  #### Demonstrator Features
166
+
154
167
  - Exploration of signals in real time at any given timestamp
155
168
  - Categorization of signals into three different dataframes: noise, weak and strong signals
156
169
  (each dataframe contains useful information about the signals)
@@ -161,33 +174,38 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
161
174
 
162
175
  ### Environment Setup (.env and .venv)
163
176
 
164
- BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load environment variables automatically using `python-dotenv`.
177
+ BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load
178
+ environment variables automatically using `python-dotenv`.
165
179
 
166
180
  Recommended steps:
167
181
 
168
182
  1. Create and fill your `.env` at the repo root (a template is provided):
169
- - Copy `.env` and set your values (do not commit secrets).
170
- - Common keys:
171
- - `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
172
- - OpenAI/LLM:
173
- - `OPENAI_API_KEY`
174
- - `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
175
- - `OPENAI_DEFAULT_MODEL`
176
- - Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
177
- - Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`, `CLIENT_REGISTRY_FILE`
178
- - Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
179
- - Misc: `CUDA_VISIBLE_DEVICES`
183
+ - Copy `.env` and set your values (do not commit secrets).
184
+ - Common keys:
185
+ - `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
186
+ - OpenAI/LLM:
187
+ - `OPENAI_API_KEY`
188
+ - `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
189
+ - `OPENAI_DEFAULT_MODEL`
190
+ - Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
191
+ - Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`,
192
+ `CLIENT_REGISTRY_FILE`
193
+ - Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
194
+ - Misc: `CUDA_VISIBLE_DEVICES`
180
195
  2. Use a virtual environment and install dependencies inside it:
181
196
  ```bash
182
197
  uv venv --python 3.13
183
198
  source .venv/bin/activate # Windows: .venv\\Scripts\\activate
184
- uv pip install . # or uv pip install .[apps]
199
+ uv pip install .
185
200
  uv pip install python-dotenv # ensures .env is auto-loaded
186
201
  ```
187
202
  3. Notes
188
- - If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via your shell/runner.
189
- - Scheduled jobs created from the apps use the exact interpreter of your active environment (`sys.executable`), ensuring `.venv/bin/python` is used. Keep your venv path stable on the machine running cron.
190
- - Cron entries source your shell profile and pass through any required variables. You can also rely on `.env` for most settings.
203
+ - If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via
204
+ your shell/runner.
205
+ - Scheduled jobs created from the apps use the exact interpreter of your active environment (`sys.executable`),
206
+ ensuring `.venv/bin/python` is used. Keep your venv path stable on the machine running cron.
207
+ - Cron entries source your shell profile and pass through any required variables. You can also rely on `.env` for
208
+ most settings.
191
209
 
192
210
  ### Hardware and Software Requirements
193
211
 
@@ -196,20 +214,21 @@ Recommended steps:
196
214
 
197
215
  ### Docker Installation
198
216
 
199
- BERTrend can be run using Docker, which provides an easy way to run the application without installing dependencies directly on your system.
217
+ BERTrend can be run using Docker, which provides an easy way to run the application without installing dependencies
218
+ directly on your system.
200
219
 
201
220
  For detailed instructions on using BERTrend with Docker, see the [Docker documentation](./docs/docker.md).
202
221
 
203
222
  ### Package Installation
204
223
 
205
- - (Recommended): create a new python environment using `uv`:
224
+ - (Recommended): create a new python environment using `uv`:
206
225
 
207
226
  `uv venv --python 3.13`
208
227
 
209
228
 
210
229
  - Installation from pypi
211
230
 
212
- `uv pip install bertrend`
231
+ `uv pip install bertrend`
213
232
 
214
233
 
215
234
  - Install using pip or poetry in the BERTrend home directory:
@@ -218,9 +237,6 @@ For detailed instructions on using BERTrend with Docker, see the [Docker documen
218
237
  # Basic installation with core dependencies
219
238
  uv pip install .
220
239
 
221
- # Installation with apps dependencies
222
- uv pip install .[apps]
223
-
224
240
  ```
225
241
 
226
242
  - (Use `uv pip install -e .` for a local installation)
@@ -237,12 +253,8 @@ BERTrend's dependencies are organized into logical groups for easier management:
237
253
  - **Visualization and UI**: Tools for data visualization and user interfaces
238
254
  - **Utilities**: General utility libraries
239
255
 
240
- Optional dependency groups:
241
-
242
- - **test**: Dependencies for running tests and measuring code coverage
243
- - **apps**: Additional dependencies required for BERTrend applications
244
-
245
- This organization simplifies installation and maintenance, allowing users to install only the dependencies they need for their specific use case.
256
+ This organization simplifies installation and maintenance, allowing users to install only the dependencies they need for
257
+ their specific use case.
246
258
 
247
259
  ### Verifying Installation
248
260
 
@@ -252,35 +264,43 @@ To verify that your installation is working correctly, you can run the installat
252
264
  python -m bertrend.tests.test_installation
253
265
  ```
254
266
 
255
- This script will check that all dependencies are installed correctly and provide a summary of the installation status. If any dependencies are missing, the script will provide instructions on how to install them.
267
+ This script will check that all dependencies are installed correctly and provide a summary of the installation status.
268
+ If any dependencies are missing, the script will provide instructions on how to install them.
256
269
 
257
270
  ### Datasets
258
271
 
259
272
  #### Dataset Sources
273
+
260
274
  BERTrend can work with various text datasets such as:
275
+
261
276
  - Scientific publications
262
277
  - News articles
263
278
  - Social media publications
264
279
 
265
280
  Recommended public datasets:
281
+
266
282
  - New York Times dataset: https://www.kaggle.com/datasets/aryansingh0909/nyt-articles-21m-2000-present
267
283
  - Arxiv dataset: https://www.kaggle.com/datasets/Cornell-University/arxiv
268
284
 
269
285
  For custom dataset creation, please refer to the documentation page about [data providers](./docs/data_provider.md).
270
286
 
271
- For email configuration and newsletter sending (optional), please refer to the [mail configuration guide](./docs/mail_configuration.md).
272
-
287
+ For email configuration and newsletter sending (optional), please refer to
288
+ the [mail configuration guide](./docs/mail_configuration.md).
273
289
 
274
290
  In order to use the provided demos, datasets :
291
+
275
292
  - can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
276
293
  - or can be uploaded from the client device on which are displayed the Streamlit apps.
277
294
 
278
295
  #### Dataset Format
296
+
279
297
  Required columns:
298
+
280
299
  - `text`
281
300
  - `timestamp`
282
301
 
283
302
  Supported formats:
303
+
284
304
  - csv
285
305
  - xlsx
286
306
  - parquet
@@ -291,94 +311,105 @@ Supported formats:
291
311
  ### 1. Dynamic Topic Modeling Analysis
292
312
 
293
313
  #### Launch the Demonstrator
314
+
294
315
  ```bash
295
316
  cd bertrend/demos/topic_analysis
296
317
  CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
297
318
  ```
298
319
 
299
320
  #### Description of Main Pages
321
+
300
322
  - `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
301
- The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
323
+ The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
302
324
 
303
325
  We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
304
326
 
305
- The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
306
-
307
- An example of a very simple implementation to deploy a separate embedding service can be found here: `bertrend/services/embedding_server`
327
+ The change of configuration can be done
328
+ in: [services_default_config.toml](bertrend/config/services_default_config.toml).
308
329
 
330
+ An example of a very simple implementation to deploy a separate embedding service can be found here:
331
+ `bertrend/services/embedding_server`
309
332
 
310
333
  ![parameters](docs/images/parameters.png)
311
334
 
312
- Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
335
+ Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for
336
+ parameter details.
313
337
 
314
338
  The application is split into several pages:
315
339
 
316
- - `Data loading & model training`: Allows to
317
- - Select a dataset
318
- - Select the range of timestamps
319
- - Split paragraphs if needed
320
- - Train a topic model
340
+ - `Data loading & model training`: Allows to
341
+ - Select a dataset
342
+ - Select the range of timestamps
343
+ - Split paragraphs if needed
344
+ - Train a topic model
321
345
 
322
346
  ![data_selection](docs/images/data_selection.png)
323
347
 
324
348
  - `Topic exploration`
325
- - Computes topics over time
326
- ![exploration_over_time](./docs/images/explore1.png)
349
+ - Computes topics over time
350
+ ![exploration_over_time](./docs/images/explore1.png)
327
351
 
328
- - Allow selecting sources and generating short descriptions for each theme
329
- ![topic_exploration](./docs/images/explore2.png)
352
+ - Allow selecting sources and generating short descriptions for each theme
353
+ ![topic_exploration](./docs/images/explore2.png)
330
354
 
331
355
  - `Topic visualization`: Several visualization types available:
332
- - `Overall Results`: Standard information such as inter-topic distance map
333
- - `Topics Treemap`: Block view of topics and their relative importance
334
- - `Data Map`: Easy topic and data search interface
356
+ - `Overall Results`: Standard information such as inter-topic distance map
357
+ - `Topics Treemap`: Block view of topics and their relative importance
358
+ - `Data Map`: Easy topic and data search interface
335
359
 
336
- ![data_map](./docs/images/data_map.png)
360
+ ![data_map](./docs/images/data_map.png)
337
361
 
338
362
  - `Temporal Visualization`: Focus on dynamic topic modeling:
339
- - 3D visualization of temporal topic evolution
340
- - Metrics to assess topic stability over time
341
- - Overall topic stability, temporal topic stability, and temporal representation stability
363
+ - 3D visualization of temporal topic evolution
364
+ - Metrics to assess topic stability over time
365
+ - Overall topic stability, temporal topic stability, and temporal representation stability
342
366
 
343
- ![temptopic_metrics](./docs/images/temptopic_metrics.png)
367
+ ![temptopic_metrics](./docs/images/temptopic_metrics.png)
344
368
 
345
369
  - `Generate Newsletters`
346
- - This is an example of an application combining topic analysis and LLMs
347
- - Generates newsletters based on prominent topics
348
- - Uses LLMs to generate topic descriptions and summarize representative documents
349
-
370
+ - This is an example of an application combining topic analysis and LLMs
371
+ - Generates newsletters based on prominent topics
372
+ - Uses LLMs to generate topic descriptions and summarize representative documents
350
373
 
351
374
  ### 2. Weak Signal Analysis
352
- **Weak signals** refer to early, small indicators of larger, important trends (like disruptive technologies or public health issues).
353
375
 
354
- Identifying weak signals early is critical for decision-making across domains such as politics, healthcare, and innovation
376
+ **Weak signals** refer to early, small indicators of larger, important trends (like disruptive technologies or public
377
+ health issues).
378
+
379
+ Identifying weak signals early is critical for decision-making across domains such as politics, healthcare, and
380
+ innovation
355
381
 
356
382
  Key Features of the demonstrator:
383
+
357
384
  - Dynamic Topic Modeling in an online learning setting
358
385
  - Popularity-based Signal Classification
359
- * based on their popularity trends: noise, weak signals, and strong signals
360
- * **new popularity metric** considers both the number of documents within a topic and the **frequency of updates**
361
-
386
+ * based on their popularity trends: noise, weak signals, and strong signals
387
+ * **new popularity metric** considers both the number of documents within a topic and the **frequency of updates**
362
388
 
363
389
  #### Launch the Weak Signal Analysis Demonstrator
390
+
364
391
  ```bash
365
392
  cd bertrend/demos/weak_signals
366
393
  CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
367
394
  ```
368
395
 
369
396
  #### Data Preparation
397
+
370
398
  - Choose from available datasets
371
- ![bertrend_data](docs/images/bertrend_data.png)
399
+ ![bertrend_data](docs/images/bertrend_data.png)
372
400
  - Click on `Embed Documents`
373
401
 
374
402
  #### Train Model
403
+
375
404
  - Select the `Model Training` tab
376
405
  - Choose time granularity (in days)
377
406
  - Click `Train Models` to generate topic models per time slice
378
407
  - Click `Merge Models` for the aggregated model
379
408
 
380
409
  #### Results Analysis
410
+
381
411
  Provides various statistics about topics:
412
+
382
413
  - Number of topics detected
383
414
  - Topic size evolution
384
415
  - Topic popularity evolution
@@ -389,13 +420,13 @@ Provides various statistics about topics:
389
420
  - Lists of noise, weak, and strong signals
390
421
 
391
422
  #### LLM-based signal interpretation
423
+
392
424
  - As topics are hard to interprete by humans, we showcase how it can be
393
- done using LLMs.
425
+ done using LLMs.
394
426
  - Choose a specific topic and click on the button to generate an interpretation
395
427
  - LLM-based in-depth signal analysis is done using predefined templates, for example:
396
- - describe what's happened since the last timestamp (summary of main events)
397
- - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
398
-
428
+ - describe what's happened since the last timestamp (summary of main events)
429
+ - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
399
430
 
400
431
  ![llm_interpretation](docs/images/llm_interpretation.png)
401
432
 
@@ -408,6 +439,7 @@ Please use the 'Issues' section to report and discuss any problems with BERTrend
408
439
  We welcome contributions. For major changes, please open an issue first to discuss your proposal.
409
440
 
410
441
  To contribute:
442
+
411
443
  1. Fork the repository at https://github.com/rte-france/BERTrend
412
444
  2. Sync your fork with the latest development branch
413
445
  3. Implement your changes
@@ -423,7 +455,8 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
423
455
 
424
456
  Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
425
457
 
426
- This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available here: https://www.mozilla.org/en-US/MPL/2.0/
458
+ This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available
459
+ here: https://www.mozilla.org/en-US/MPL/2.0/
427
460
 
428
461
  ## Citation
429
462