bertrend 0.3.23__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.23 → bertrend-0.4.0}/PKG-INFO +143 -106
  2. {bertrend-0.3.23 → bertrend-0.4.0}/README.md +128 -91
  3. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/BERTopicModel.py +17 -19
  4. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/BERTrend.py +12 -14
  5. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/article_scoring/article_scoring.py +5 -5
  8. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/article_scoring/prompts.py +1 -1
  9. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/article_scoring/scoring_agent.py +7 -4
  10. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/common/apscheduler_utils.py +95 -53
  13. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/common/crontab_utils.py +3 -3
  14. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/common/date_utils.py +1 -1
  15. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/common/mail_utils.py +2 -3
  16. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/common/scheduler_utils.py +4 -23
  17. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__init__.py +1 -2
  18. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/__main__.py +5 -6
  19. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/arxiv_provider.py +8 -9
  20. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/atom_feed_provider.py +4 -4
  21. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/bing_news_provider.py +3 -3
  22. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider.py +30 -11
  23. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/data_provider_utils.py +12 -10
  24. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/google_news_provider.py +3 -3
  25. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/newscatcher_provider.py +3 -3
  26. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/rss_feed_provider.py +4 -4
  27. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/data_provider/utils.py +7 -8
  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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app.py +6 -1
  31. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/app_utils.py +20 -11
  32. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +1 -5
  33. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/prompts.py +5 -0
  34. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab1.py +7 -2
  37. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab2.py +6 -1
  38. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/tabs/tab3.py +8 -1
  39. {bertrend-0.3.23 → 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.23 → 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.23 → 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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +3 -3
  47. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +9 -11
  48. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/utils.py +3 -3
  49. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/start_apps.sh +1 -1
  50. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/stop_apps.sh +1 -1
  51. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/__main__.py +4 -5
  54. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/newsletter_generation.py +22 -22
  55. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/newsletters/utils.py +2 -2
  56. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/__init__.py +2 -2
  57. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/app.py +51 -20
  58. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/authentication.py +9 -1
  59. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/automated_report_generation.py +22 -20
  60. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_analysis.py +13 -11
  61. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_common.py +4 -4
  62. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_comparative.py +17 -17
  63. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/dashboard_signals.py +21 -17
  64. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_common.py +2 -2
  67. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_config.py +51 -32
  68. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/feeds_data.py +5 -5
  69. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n.py +3 -4
  70. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/i18n_translations.py +1 -3
  71. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/llm_utils.py +1 -1
  72. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/models_info.py +35 -33
  73. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/perf_utils.py +1 -1
  74. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/process_new_data.py +16 -15
  75. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation.py +27 -25
  76. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/report_generation_utils.py +2 -3
  77. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/start_demo.sh +1 -2
  78. {bertrend-0.3.23 → 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.23/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.23/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.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/bertrend_app_models.py +2 -1
  86. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/models/data_provider_models.py +5 -3
  87. {bertrend-0.3.23/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.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/data_provider.py +75 -54
  91. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/info.py +3 -3
  92. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/routers/newsletters.py +27 -26
  93. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/start.py +5 -5
  94. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/status.py +10 -9
  95. {bertrend-0.3.23/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.23 → bertrend-0.4.0/bertrend}/bertrend_apps/services/utils/logging_utils.py +1 -1
  108. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/data_loading_component.py +14 -32
  109. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n.py +3 -4
  110. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/parameters_component.py +10 -12
  111. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/state_utils.py +0 -1
  112. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/streamlit_components/clickable_df_component.py +3 -1
  113. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/streamlit_components/input_with_pills_component.py +3 -2
  114. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +11 -12
  115. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +9 -10
  116. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +15 -15
  117. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/training_page.py +11 -11
  118. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/i18n_translations.py +0 -1
  119. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/weak_signals/app.py +32 -29
  120. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/weak_signals/visualizations_utils.py +10 -11
  121. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/agent_utils.py +9 -21
  122. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_features.py +12 -11
  123. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/openai_client.py +52 -100
  124. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/metrics/temporal_metrics_embedding.py +11 -12
  125. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/services/authentication.py +25 -24
  128. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_client.py +48 -44
  129. bertrend-0.4.0/bertrend/services/embedding_server/__init__.py +4 -0
  130. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/config/settings.py +3 -2
  131. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/main.py +2 -3
  132. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/authentication.py +2 -2
  135. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/embeddings.py +1 -1
  136. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/routers/info.py +1 -1
  137. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/security.py +11 -7
  138. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/start.py +3 -3
  139. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/status.py +9 -8
  140. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/stop.py +1 -1
  141. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_service.py +14 -13
  142. {bertrend-0.3.23 → 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.23 → 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.23 → bertrend-0.4.0}/bertrend/services/scheduling/job_utils/job_functions.py +9 -7
  148. bertrend-0.4.0/bertrend/services/scheduling/models/__init__.py +4 -0
  149. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/models/scheduling_models.py +2 -2
  150. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/routers/info.py +1 -1
  151. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/routers/scheduling.py +25 -28
  152. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/scheduling_service.py +4 -3
  153. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/services/summary/abstractive_summarizer.py +2 -3
  156. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/summary/chatgpt_summarizer.py +2 -4
  157. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/summary/extractive_summarizer.py +8 -8
  158. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/summary/lexrank.py +1 -1
  159. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/tests/apps/test_bertrend_service.py +109 -22
  163. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/apps/test_lazy_scheduler.py +4 -4
  164. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/apps/test_models.py +11 -10
  165. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/apps/test_multiworker.py +4 -4
  166. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/apps/test_process_new_data.py +77 -63
  167. bertrend-0.4.0/bertrend/tests/apps/test_routers_bertrend_app.py +339 -0
  168. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/apps/test_routers_info.py +2 -2
  169. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/tests/core/test_bertrend.py +12 -13
  172. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_data_structure.py +1 -1
  173. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_representative_docs.py +4 -3
  174. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_temporal_metrics_embedding.py +4 -5
  175. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_topic_description.py +5 -4
  176. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_topic_metrics.py +5 -7
  177. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_topic_model.py +3 -4
  178. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_data_structure.py +6 -6
  179. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_prompts.py +17 -16
  180. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_visualizations.py +8 -7
  181. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/core/test_trend_analysis_weak_signals.py +12 -13
  182. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/tests/llm/test_agent_utils.py +22 -12
  185. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring.py +6 -5
  186. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/llm/test_article_scoring_models.py +4 -3
  187. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/llm/test_newsletter_features.py +13 -12
  188. {bertrend-0.3.23 → 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.23 → bertrend-0.4.0}/bertrend/tests/services/embedding/test_embedding_client.py +13 -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.23 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_job_exception_fix.py +10 -12
  199. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/services/scheduling/test_scheduling_service.py +5 -3
  200. bertrend-0.4.0/bertrend/tests/services/scheduling/test_stress_test.py +308 -0
  201. bertrend-0.4.0/bertrend/tests/services/summarizer/__init__.py +4 -0
  202. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +4 -5
  203. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +5 -4
  204. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +5 -6
  205. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/services/summarizer/test_summarizer.py +4 -3
  206. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/test_installation.py +6 -1
  207. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/test_integration.py +12 -12
  208. bertrend-0.4.0/bertrend/tests/utils/__init__.py +4 -0
  209. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_apscheduler_utils.py +58 -47
  210. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_cache_utils.py +3 -3
  211. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_config_utils.py +3 -2
  212. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_crontab_utils.py +61 -34
  213. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_data_loading.py +9 -8
  214. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_date_utils.py +2 -2
  215. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_mail_utils.py +34 -34
  216. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_scheduler_utils.py +8 -8
  217. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/utils/test_utils_init.py +3 -1
  218. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/topic_analysis/visualizations.py +3 -2
  219. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/prompts.py +3 -4
  220. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/visualizations.py +0 -3
  221. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/weak_signals.py +2 -2
  222. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/utils/__init__.py +1 -0
  223. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/utils/cache_utils.py +1 -2
  224. {bertrend-0.3.23 → bertrend-0.4.0}/pyproject.toml +15 -22
  225. bertrend-0.3.23/bertrend/services/embedding_server/__init__.py +0 -4
  226. bertrend-0.3.23/bertrend/services/embedding_server/routers/__init__.py +0 -4
  227. bertrend-0.3.23/bertrend/services/scheduling/__init__.py +0 -4
  228. bertrend-0.3.23/bertrend/services/scheduling/dashboard.html +0 -698
  229. bertrend-0.3.23/bertrend/services/scheduling/job_utils/__init__.py +0 -4
  230. bertrend-0.3.23/bertrend/services/scheduling/models/__init__.py +0 -4
  231. bertrend-0.3.23/bertrend/services/summary/__init__.py +0 -4
  232. bertrend-0.3.23/bertrend/tests/__init__.py +0 -4
  233. bertrend-0.3.23/bertrend/tests/apps/__init__.py +0 -4
  234. bertrend-0.3.23/bertrend/tests/apps/test_routers_bertrend_app.py +0 -285
  235. bertrend-0.3.23/bertrend/tests/core/__init__.py +0 -4
  236. bertrend-0.3.23/bertrend/tests/llm/__init__.py +0 -4
  237. bertrend-0.3.23/bertrend/tests/llm/test_openai_client.py +0 -210
  238. bertrend-0.3.23/bertrend/tests/services/__init__.py +0 -4
  239. bertrend-0.3.23/bertrend/tests/services/embedding/__init__.py +0 -4
  240. bertrend-0.3.23/bertrend/tests/services/scheduling/__init__.py +0 -4
  241. bertrend-0.3.23/bertrend/tests/services/summarizer/__init__.py +0 -4
  242. bertrend-0.3.23/bertrend/tests/utils/__init__.py +0 -4
  243. bertrend-0.3.23/bertrend/topic_analysis/__init__.py +0 -4
  244. bertrend-0.3.23/bertrend/trend_analysis/__init__.py +0 -4
  245. bertrend-0.3.23/bertrend_apps/common/__init__.py +0 -4
  246. bertrend-0.3.23/bertrend_apps/exploration/__init__.py +0 -4
  247. bertrend-0.3.23/bertrend_apps/exploration/curebot/__init__.py +0 -4
  248. bertrend-0.3.23/bertrend_apps/exploration/dataviz/__init__.py +0 -4
  249. bertrend-0.3.23/bertrend_apps/exploration/geolocalization/__init__.py +0 -4
  250. bertrend-0.3.23/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -4
  251. bertrend-0.3.23/bertrend_apps/newsletters/__init__.py +0 -4
  252. bertrend-0.3.23/bertrend_apps/prospective_demo/detailed_report_template.html +0 -438
  253. bertrend-0.3.23/bertrend_apps/prospective_demo/docs/architecture.md +0 -82
  254. bertrend-0.3.23/bertrend_apps/prospective_demo/docs/automated_report_generation.md +0 -289
  255. bertrend-0.3.23/bertrend_apps/services/__init__.py +0 -4
  256. bertrend-0.3.23/bertrend_apps/services/models/__init__.py +0 -4
  257. bertrend-0.3.23/bertrend_apps/services/routers/__init__.py +0 -4
  258. bertrend-0.3.23/bertrend_apps/services/routers/bertrend_app.py +0 -140
  259. bertrend-0.3.23/bertrend_apps/services/utils/__init__.py +0 -4
  260. {bertrend-0.3.23 → bertrend-0.4.0}/AUTHORS.txt +0 -0
  261. {bertrend-0.3.23 → bertrend-0.4.0}/LICENSE.md +0 -0
  262. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  263. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  264. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  265. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  266. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  267. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  268. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  269. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  270. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  271. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  272. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  273. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  274. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  275. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/curebot/config.toml +0 -0
  276. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  277. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  278. {bertrend-0.3.23 → bertrend-0.4.0/bertrend}/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
  279. {bertrend-0.3.23/bertrend_apps/services → bertrend-0.4.0/bertrend/bertrend_apps/services/bertrend}/config/default_config.toml +0 -0
  280. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/config/bertopic_default_config.toml +0 -0
  281. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/config/bertrend_default_config.toml +0 -0
  282. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/config/parameters.py +0 -0
  283. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/config/services_default_config.toml +0 -0
  284. {bertrend-0.3.23/bertrend/article_scoring → bertrend-0.4.0/bertrend/demos}/__init__.py +0 -0
  285. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/__init__.py +0 -0
  286. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  287. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  288. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/demos_utils/icons.py +0 -0
  289. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/start_summarizer_app.sh +0 -0
  290. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  291. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/start_weak_signals_app.sh +0 -0
  292. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/streamlit_components/__init__.py +0 -0
  293. {bertrend-0.3.23/bertrend/demos → bertrend-0.4.0/bertrend/demos/summarization}/__init__.py +0 -0
  294. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/summarization/summarizer_app.py +1 -1
  295. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  296. {bertrend-0.3.23/bertrend/demos/summarization → bertrend-0.4.0/bertrend/demos/topic_analysis}/__init__.py +0 -0
  297. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app.py +6 -6
  298. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/app_utils.py +2 -2
  299. {bertrend-0.3.23/bertrend/demos/topic_analysis → bertrend-0.4.0/bertrend/demos/topic_analysis/demo_pages}/__init__.py +0 -0
  300. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  301. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  302. {bertrend-0.3.23/bertrend/demos/topic_analysis/demo_pages → bertrend-0.4.0/bertrend/demos/weak_signals}/__init__.py +0 -0
  303. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  304. {bertrend-0.3.23/bertrend/demos/weak_signals → bertrend-0.4.0/bertrend/llm_utils}/__init__.py +0 -0
  305. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/newsletter.css +0 -0
  306. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_model.py +1 -1
  307. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  308. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/newsletter_template.html +0 -0
  309. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/llm_utils/prompts.py +0 -0
  310. {bertrend-0.3.23/bertrend/llm_utils → bertrend-0.4.0/bertrend/metrics}/__init__.py +0 -0
  311. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/resources/common_ngrams.json +0 -0
  312. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/resources/stopwords-en.json +0 -0
  313. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/resources/stopwords-fr.json +0 -0
  314. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/resources/stopwords-rte.json +0 -0
  315. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/cert.pem +0 -0
  316. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/README.md +0 -0
  317. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  318. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  319. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/embedding_server/requirements.txt +0 -0
  320. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/key.pem +0 -0
  321. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/.dockerignore +0 -0
  322. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/Docker_setup.md +0 -0
  323. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/services/scheduling/requirements.txt +0 -0
  324. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/tests/README_integration_tests.md +0 -0
  325. {bertrend-0.3.23/bertrend/metrics → bertrend-0.4.0/bertrend/topic_analysis}/__init__.py +0 -0
  326. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/topic_analysis/data_structure.py +0 -0
  327. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/topic_analysis/prompts.py +0 -0
  328. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/topic_analysis/representative_docs.py +0 -0
  329. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/topic_analysis/topic_description.py +0 -0
  330. {bertrend-0.3.23/bertrend/services → bertrend-0.4.0/bertrend/trend_analysis}/__init__.py +0 -0
  331. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/data_structure.py +0 -0
  332. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  333. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  334. {bertrend-0.3.23 → bertrend-0.4.0}/bertrend/utils/config_utils.py +0 -0
  335. {bertrend-0.3.23 → 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.23
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,37 +42,37 @@ 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
+ Requires-Dist: psutil (>=7.2.1)
56
57
  Requires-Dist: pyarrow (>=21.0.0)
57
- Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
58
+ Requires-Dist: pygooglenews (>=0.1.3)
58
59
  Requires-Dist: pylabeladjust (==0.1.13)
59
60
  Requires-Dist: pytest (>=8.4.0)
60
61
  Requires-Dist: pytest-asyncio
61
62
  Requires-Dist: python-dotenv (>=1.1.1)
62
63
  Requires-Dist: requests (>=2.32.3)
64
+ Requires-Dist: ruff (>=0.14.14)
63
65
  Requires-Dist: scikit-learn (>=1.5.2)
64
- Requires-Dist: scipy (==1.12)
65
66
  Requires-Dist: seaborn (>=0.13.2)
66
67
  Requires-Dist: sentence-transformers (==3.0.1)
67
68
  Requires-Dist: sentencepiece (>=0.2.0)
68
69
  Requires-Dist: starlette (>=0.46.2)
69
- Requires-Dist: streamlit (>=1.50)
70
+ Requires-Dist: streamlit (>=1.51.0)
70
71
  Requires-Dist: streamlit-code-editor (>=0.1.22)
71
72
  Requires-Dist: supervisor (>=4.3.0)
72
73
  Requires-Dist: thefuzz (>=0.22.1)
73
74
  Requires-Dist: tiktoken (>=0.8.0)
74
75
  Requires-Dist: tldextract (>=2.0.1)
75
- Requires-Dist: tokenizers (<0.20.0)
76
76
  Requires-Dist: torch (>=2.7.0)
77
77
  Requires-Dist: tqdm (>=4.67.1)
78
78
  Requires-Dist: typer (>=0.16.0)
@@ -94,42 +94,59 @@ Description-Content-Type: text/markdown
94
94
  ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
95
95
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
96
96
 
97
+ ## News
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 !
101
+
102
+ ## Overview
103
+
97
104
  ![BERTrend pipeline](./BERTrend_overview.png)
98
105
 
99
106
  ## Paper
100
107
 
101
- 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:
102
109
  [BERTrend: Neural Topic Modeling for Emerging Trends Detection](./BERTrend%20paper.pdf).
103
110
 
104
111
  ## Description
105
112
 
106
- 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.
107
-
108
- 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.
109
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.
110
120
 
111
121
  ## Main Features
112
122
 
113
- 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.
114
126
 
115
127
  The code base is illustrated via two main demos:
116
128
 
117
129
  ### Dynamic Topic Modeling Analysis
118
130
 
119
131
  - [bertrend/demos/topic_analysis](bertrend/demos/topic_analysis): Focuses on dynamic topic modeling analysis using:
120
- - Dedicated metrics, called TEMPTopic:
121
- - Stability Evaluation: Measures the stability of topics over time, evaluating how consistent and coherent topics remain.
122
- - Volatility Assessment: Analyzes the volatility of topics, identifying how much topics change over different time periods.
123
- - Two Perspectives:
124
- - Temporal Topic Embedding Stability: Evaluates the stability of topic embeddings over time.
125
- - Temporal Topic Representation Stability: Assesses the stability of topic representations over time.
126
- - Visualization tools to easily assess the results.
127
-
128
- #### 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
+
129
144
  https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
130
145
 
131
146
  #### Demonstrator Features
132
- - 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
133
150
  - Customization of BERTopic parameters
134
151
  - Exploration of topics by source, generate topic summaries using specific sources
135
152
  - Generate and customize newsletters by applying LLMs on BERTopic's output topics
@@ -142,10 +159,11 @@ https://github.com/user-attachments/assets/f600f666-a6da-40be-8b07-5041b3bde1dc
142
159
  - [bertrend/demos/weak_signals](bertrend/demos/weak_signals): Identifies and analyzes emerging trends and signals
143
160
 
144
161
  #### Weak Signal Analysis Demonstrator Video
145
- https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
146
162
 
163
+ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
147
164
 
148
165
  #### Demonstrator Features
166
+
149
167
  - Exploration of signals in real time at any given timestamp
150
168
  - Categorization of signals into three different dataframes: noise, weak and strong signals
151
169
  (each dataframe contains useful information about the signals)
@@ -156,70 +174,72 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
156
174
 
157
175
  ### Environment Setup (.env and .venv)
158
176
 
159
- 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`.
160
179
 
161
180
  Recommended steps:
162
181
 
163
182
  1. Create and fill your `.env` at the repo root (a template is provided):
164
- - Copy `.env` and set your values (do not commit secrets).
165
- - Common keys:
166
- - `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
167
- - OpenAI/LLM:
168
- - `OPENAI_API_KEY`
169
- - `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
170
- - `OPENAI_DEFAULT_MODEL`
171
- - Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
172
- - Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`, `CLIENT_REGISTRY_FILE`
173
- - Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
174
- - 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`
175
195
  2. Use a virtual environment and install dependencies inside it:
176
196
  ```bash
177
- python -m venv .venv
197
+ uv venv --python 3.13
178
198
  source .venv/bin/activate # Windows: .venv\\Scripts\\activate
179
- pip install -U pip
180
- pip install . # or pip install ".[apps]"
181
- pip install python-dotenv # ensures .env is auto-loaded
199
+ uv pip install .
200
+ uv pip install python-dotenv # ensures .env is auto-loaded
182
201
  ```
183
202
  3. Notes
184
- - If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via your shell/runner.
185
- - 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.
186
- - 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.
187
209
 
188
210
  ### Hardware and Software Requirements
189
211
 
190
212
  - Recommended: at least one GPU with 16GB RAM for faster processing
191
- - Python >= 3.12 is required
213
+ - Python >= 3.13 is required
192
214
 
193
215
  ### Docker Installation
194
216
 
195
- 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.
196
219
 
197
220
  For detailed instructions on using BERTrend with Docker, see the [Docker documentation](./docs/docker.md).
198
221
 
199
222
  ### Package Installation
200
223
 
201
- - (Recommended): create a new python environment using `venv` or `conda`:
224
+ - (Recommended): create a new python environment using `uv`:
202
225
 
203
- `python -m venv <path>/bertrend`
226
+ `uv venv --python 3.13`
204
227
 
205
228
 
206
229
  - Installation from pypi
207
230
 
208
- `pip install bertrend`
231
+ `uv pip install bertrend`
209
232
 
210
233
 
211
234
  - Install using pip or poetry in the BERTrend home directory:
212
235
 
213
236
  ```bash
214
237
  # Basic installation with core dependencies
215
- pip install . # or poetry install
216
-
217
- # Installation with apps dependencies
218
- pip install ".[apps]" # or poetry install --extras apps
238
+ uv pip install .
219
239
 
220
240
  ```
221
241
 
222
- - (Use `pip install -e .` for a local installation)
242
+ - (Use `uv pip install -e .` for a local installation)
223
243
 
224
244
  NB. Due to the number of dependencies, the installation may take some time on an empty environment.
225
245
 
@@ -233,12 +253,8 @@ BERTrend's dependencies are organized into logical groups for easier management:
233
253
  - **Visualization and UI**: Tools for data visualization and user interfaces
234
254
  - **Utilities**: General utility libraries
235
255
 
236
- Optional dependency groups:
237
-
238
- - **test**: Dependencies for running tests and measuring code coverage
239
- - **apps**: Additional dependencies required for BERTrend applications
240
-
241
- 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.
242
258
 
243
259
  ### Verifying Installation
244
260
 
@@ -248,35 +264,43 @@ To verify that your installation is working correctly, you can run the installat
248
264
  python -m bertrend.tests.test_installation
249
265
  ```
250
266
 
251
- 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.
252
269
 
253
270
  ### Datasets
254
271
 
255
272
  #### Dataset Sources
273
+
256
274
  BERTrend can work with various text datasets such as:
275
+
257
276
  - Scientific publications
258
277
  - News articles
259
278
  - Social media publications
260
279
 
261
280
  Recommended public datasets:
281
+
262
282
  - New York Times dataset: https://www.kaggle.com/datasets/aryansingh0909/nyt-articles-21m-2000-present
263
283
  - Arxiv dataset: https://www.kaggle.com/datasets/Cornell-University/arxiv
264
284
 
265
285
  For custom dataset creation, please refer to the documentation page about [data providers](./docs/data_provider.md).
266
286
 
267
- For email configuration and newsletter sending (optional), please refer to the [mail configuration guide](./docs/mail_configuration.md).
268
-
287
+ For email configuration and newsletter sending (optional), please refer to
288
+ the [mail configuration guide](./docs/mail_configuration.md).
269
289
 
270
290
  In order to use the provided demos, datasets :
291
+
271
292
  - can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
272
293
  - or can be uploaded from the client device on which are displayed the Streamlit apps.
273
294
 
274
295
  #### Dataset Format
296
+
275
297
  Required columns:
298
+
276
299
  - `text`
277
300
  - `timestamp`
278
301
 
279
302
  Supported formats:
303
+
280
304
  - csv
281
305
  - xlsx
282
306
  - parquet
@@ -287,94 +311,105 @@ Supported formats:
287
311
  ### 1. Dynamic Topic Modeling Analysis
288
312
 
289
313
  #### Launch the Demonstrator
314
+
290
315
  ```bash
291
316
  cd bertrend/demos/topic_analysis
292
317
  CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
293
318
  ```
294
319
 
295
320
  #### Description of Main Pages
321
+
296
322
  - `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
297
- 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.
298
324
 
299
325
  We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
300
326
 
301
- The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
302
-
303
- 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).
304
329
 
330
+ An example of a very simple implementation to deploy a separate embedding service can be found here:
331
+ `bertrend/services/embedding_server`
305
332
 
306
333
  ![parameters](docs/images/parameters.png)
307
334
 
308
- 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.
309
337
 
310
338
  The application is split into several pages:
311
339
 
312
- - `Data loading & model training`: Allows to
313
- - Select a dataset
314
- - Select the range of timestamps
315
- - Split paragraphs if needed
316
- - 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
317
345
 
318
346
  ![data_selection](docs/images/data_selection.png)
319
347
 
320
348
  - `Topic exploration`
321
- - Computes topics over time
322
- ![exploration_over_time](./docs/images/explore1.png)
349
+ - Computes topics over time
350
+ ![exploration_over_time](./docs/images/explore1.png)
323
351
 
324
- - Allow selecting sources and generating short descriptions for each theme
325
- ![topic_exploration](./docs/images/explore2.png)
352
+ - Allow selecting sources and generating short descriptions for each theme
353
+ ![topic_exploration](./docs/images/explore2.png)
326
354
 
327
355
  - `Topic visualization`: Several visualization types available:
328
- - `Overall Results`: Standard information such as inter-topic distance map
329
- - `Topics Treemap`: Block view of topics and their relative importance
330
- - `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
331
359
 
332
- ![data_map](./docs/images/data_map.png)
360
+ ![data_map](./docs/images/data_map.png)
333
361
 
334
362
  - `Temporal Visualization`: Focus on dynamic topic modeling:
335
- - 3D visualization of temporal topic evolution
336
- - Metrics to assess topic stability over time
337
- - 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
338
366
 
339
- ![temptopic_metrics](./docs/images/temptopic_metrics.png)
367
+ ![temptopic_metrics](./docs/images/temptopic_metrics.png)
340
368
 
341
369
  - `Generate Newsletters`
342
- - This is an example of an application combining topic analysis and LLMs
343
- - Generates newsletters based on prominent topics
344
- - Uses LLMs to generate topic descriptions and summarize representative documents
345
-
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
346
373
 
347
374
  ### 2. Weak Signal Analysis
348
- **Weak signals** refer to early, small indicators of larger, important trends (like disruptive technologies or public health issues).
349
375
 
350
- 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
351
381
 
352
382
  Key Features of the demonstrator:
383
+
353
384
  - Dynamic Topic Modeling in an online learning setting
354
385
  - Popularity-based Signal Classification
355
- * based on their popularity trends: noise, weak signals, and strong signals
356
- * **new popularity metric** considers both the number of documents within a topic and the **frequency of updates**
357
-
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**
358
388
 
359
389
  #### Launch the Weak Signal Analysis Demonstrator
390
+
360
391
  ```bash
361
392
  cd bertrend/demos/weak_signals
362
393
  CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
363
394
  ```
364
395
 
365
396
  #### Data Preparation
397
+
366
398
  - Choose from available datasets
367
- ![bertrend_data](docs/images/bertrend_data.png)
399
+ ![bertrend_data](docs/images/bertrend_data.png)
368
400
  - Click on `Embed Documents`
369
401
 
370
402
  #### Train Model
403
+
371
404
  - Select the `Model Training` tab
372
405
  - Choose time granularity (in days)
373
406
  - Click `Train Models` to generate topic models per time slice
374
407
  - Click `Merge Models` for the aggregated model
375
408
 
376
409
  #### Results Analysis
410
+
377
411
  Provides various statistics about topics:
412
+
378
413
  - Number of topics detected
379
414
  - Topic size evolution
380
415
  - Topic popularity evolution
@@ -385,13 +420,13 @@ Provides various statistics about topics:
385
420
  - Lists of noise, weak, and strong signals
386
421
 
387
422
  #### LLM-based signal interpretation
423
+
388
424
  - As topics are hard to interprete by humans, we showcase how it can be
389
- done using LLMs.
425
+ done using LLMs.
390
426
  - Choose a specific topic and click on the button to generate an interpretation
391
427
  - LLM-based in-depth signal analysis is done using predefined templates, for example:
392
- - describe what's happened since the last timestamp (summary of main events)
393
- - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
394
-
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.
395
430
 
396
431
  ![llm_interpretation](docs/images/llm_interpretation.png)
397
432
 
@@ -404,6 +439,7 @@ Please use the 'Issues' section to report and discuss any problems with BERTrend
404
439
  We welcome contributions. For major changes, please open an issue first to discuss your proposal.
405
440
 
406
441
  To contribute:
442
+
407
443
  1. Fork the repository at https://github.com/rte-france/BERTrend
408
444
  2. Sync your fork with the latest development branch
409
445
  3. Implement your changes
@@ -419,7 +455,8 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
419
455
 
420
456
  Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
421
457
 
422
- 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/
423
460
 
424
461
  ## Citation
425
462