bertrend 0.3.2__tar.gz → 0.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. {bertrend-0.3.2 → bertrend-0.3.3}/PKG-INFO +68 -66
  2. {bertrend-0.3.2 → bertrend-0.3.3}/README.md +17 -15
  3. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/authentication.py +0 -1
  4. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/chatgpt_summarizer.py +1 -1
  5. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_abstractive_summarizer.py +25 -16
  6. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_extractive_summarizer.py +34 -21
  7. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_installation.py +1 -3
  8. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_metrics.py +29 -23
  9. bertrend-0.3.3/pyproject.toml +96 -0
  10. bertrend-0.3.2/pyproject.toml +0 -91
  11. {bertrend-0.3.2 → bertrend-0.3.3}/AUTHORS.txt +0 -0
  12. {bertrend-0.3.2 → bertrend-0.3.3}/LICENSE.md +0 -0
  13. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/BERTopicModel.py +0 -0
  14. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/BERTrend.py +0 -0
  15. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/__init__.py +0 -0
  16. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/bertopic_default_config.toml +0 -0
  17. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/bertrend_default_config.toml +0 -0
  18. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/parameters.py +0 -0
  19. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/config/services_default_config.toml +0 -0
  20. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/__init__.py +0 -0
  21. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/__init__.py +0 -0
  22. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
  23. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  24. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/icons.py +0 -0
  25. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/messages.py +0 -0
  26. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  27. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/demos_utils/state_utils.py +0 -0
  28. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_summarizer_app.sh +0 -0
  29. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  30. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/start_weak_signals_app.sh +0 -0
  31. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/summarization/__init__.py +0 -0
  32. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/summarization/summarizer_app.py +0 -0
  33. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/__init__.py +0 -0
  34. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/app.py +0 -0
  35. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  36. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  37. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
  38. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
  39. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  40. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  41. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
  42. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/topic_analysis/messages.py +0 -0
  43. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/__init__.py +0 -0
  44. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/app.py +0 -0
  45. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/messages.py +0 -0
  46. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  47. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/__init__.py +0 -0
  48. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/newsletter.css +0 -0
  49. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/newsletter_features.py +0 -0
  50. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/openai_client.py +0 -0
  51. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/llm_utils/prompts.py +0 -0
  52. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/__init__.py +0 -0
  53. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  54. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/metrics/topic_metrics.py +0 -0
  55. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/common_ngrams.json +0 -0
  56. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-en.json +0 -0
  57. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-fr.json +0 -0
  58. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/resources/stopwords-rte.json +0 -0
  59. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/__init__.py +0 -0
  60. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/embedding_client.py +0 -0
  61. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/embedding_service.py +0 -0
  62. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summarizer.py +0 -0
  63. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/__init__.py +0 -0
  64. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  65. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/extractive_summarizer.py +0 -0
  66. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/lexrank.py +0 -0
  67. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/services/summary/prompts.py +0 -0
  68. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/README_integration_tests.md +0 -0
  69. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/__init__.py +0 -0
  70. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/conftest.py +0 -0
  71. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_bertrend.py +0 -0
  72. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_cache_utils.py +0 -0
  73. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
  74. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_config_utils.py +0 -0
  75. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_data_loading.py +0 -0
  76. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_data_structure.py +0 -0
  77. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_embedding_client.py +0 -0
  78. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_integration.py +0 -0
  79. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_newsletter_features.py +0 -0
  80. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_openai_client.py +0 -0
  81. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_representative_docs.py +0 -0
  82. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_summarizer.py +0 -0
  83. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  84. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_description.py +0 -0
  85. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_topic_model.py +0 -0
  86. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  87. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  88. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  89. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  90. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_utils_init.py +0 -0
  91. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/tests/test_visualizations.py +0 -0
  92. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/__init__.py +0 -0
  93. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/data_structure.py +0 -0
  94. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/prompts.py +0 -0
  95. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/representative_docs.py +0 -0
  96. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/topic_description.py +0 -0
  97. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/topic_analysis/visualizations.py +0 -0
  98. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/__init__.py +0 -0
  99. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/data_structure.py +0 -0
  100. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/prompts.py +0 -0
  101. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  102. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  103. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/visualizations.py +0 -0
  104. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/trend_analysis/weak_signals.py +0 -0
  105. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/__init__.py +0 -0
  106. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/cache_utils.py +0 -0
  107. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/config_utils.py +0 -0
  108. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend/utils/data_loading.py +0 -0
  109. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/__init__.py +0 -0
  110. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/__init__.py +0 -0
  111. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/crontab_utils.py +0 -0
  112. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/common/mail_utils.py +0 -0
  113. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  114. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  115. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  116. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  117. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  118. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  119. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/gmail_credentials.json +0 -0
  120. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  121. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
  122. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  123. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  124. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  125. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  126. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  127. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  128. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  129. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/__init__.py +0 -0
  130. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/__main__.py +0 -0
  131. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  132. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  133. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/curebot_provider.py +0 -0
  134. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/data_provider.py +0 -0
  135. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  136. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  137. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/data_provider/utils.py +0 -0
  138. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/__init__.py +0 -0
  139. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  140. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/app.py +0 -0
  141. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  142. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/config.toml +0 -0
  143. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  144. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/old_veille_analyse.py +0 -0
  145. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  146. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  147. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  148. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  149. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
  150. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  151. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  152. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  153. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  154. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  155. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  156. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  157. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  158. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  159. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
  160. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  161. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/newsletters/__init__.py +0 -0
  162. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/newsletters/__main__.py +0 -0
  163. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  164. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  165. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/__init__.py +0 -0
  166. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/app.py +0 -0
  167. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/authentication.py +0 -0
  168. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  169. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  170. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  171. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  172. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_config.py +0 -0
  173. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  174. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/i18n.py +0 -0
  175. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  176. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/models_info.py +0 -0
  177. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  178. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/process_new_data.py +0 -0
  179. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_generation.py +0 -0
  180. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_template.html +0 -0
  181. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/report_utils.py +0 -0
  182. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  183. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
  184. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/start_apps.sh +0 -0
  185. {bertrend-0.3.2 → bertrend-0.3.3}/bertrend_apps/stop_apps.sh +0 -0
@@ -1,72 +1,72 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: bertrend
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
5
- Home-page: https://github.com/rte-france/BERTrend
6
5
  License: LICENSE.md
7
- Keywords: topics,BERTopic,transformers,weak signals
6
+ Keywords: topics,BERTopic,transformers,weak signals,LLM
8
7
  Author: Jérôme Picault
9
8
  Author-email: jerome.picault@rte-france.com
9
+ Maintainer: Jérôme Picault
10
+ Maintainer-email: jerome.picault@rte-france.com
10
11
  Requires-Python: >=3.12,<4.0
11
- Classifier: License :: Other/Proprietary License
12
- Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
14
13
  Provides-Extra: apps
15
- Provides-Extra: tests
16
14
  Requires-Dist: Pyqtree (==1.0.0)
17
- Requires-Dist: arxiv (>=2.2.0,<3.0.0) ; extra == "apps"
15
+ Requires-Dist: arxiv (>=2.2.0) ; extra == "apps"
18
16
  Requires-Dist: bertopic (==0.16.2)
19
- Requires-Dist: black (>=24.10.0,<25.0.0)
20
- Requires-Dist: coverage (>=7.6.9,<8.0.0) ; extra == "tests"
21
- Requires-Dist: cron-descriptor (>=1.4.5,<2.0.0)
17
+ Requires-Dist: black (>=24.10.0)
18
+ Requires-Dist: coverage (>=7.6.9)
19
+ Requires-Dist: cron-descriptor (>=1.4.5)
22
20
  Requires-Dist: dask (==2024.12.0)
23
21
  Requires-Dist: datamapplot (==0.3.0)
24
- Requires-Dist: dateparser (>=1.2.0,<2.0.0)
25
- Requires-Dist: dill (>=0.4.0,<0.5.0)
26
- Requires-Dist: feedparser (>=6.0.11,<7.0.0) ; extra == "apps"
27
- Requires-Dist: gensim (==4.3.2)
28
- Requires-Dist: google-api-python-client (>=2.148.0,<3.0.0) ; extra == "apps"
29
- Requires-Dist: google-auth-oauthlib (>=1.2.1,<2.0.0) ; extra == "apps"
30
- Requires-Dist: googlenewsdecoder (>=0.1.7,<0.2.0) ; extra == "apps"
31
- Requires-Dist: goose3 (>=3.1.19,<4.0.0) ; extra == "apps"
32
- Requires-Dist: hdbscan (>=0.8.40,<0.9.0)
33
- Requires-Dist: ipython (>=8.28.0,<9.0.0)
34
- Requires-Dist: joblib (>=1.4.2,<2.0.0)
35
- Requires-Dist: jsonlines (>=4.0.0,<5.0.0)
36
- Requires-Dist: langchain-chroma (>=0.2.2,<0.3.0)
37
- Requires-Dist: langchain-community (>=0.3.21,<0.4.0)
38
- Requires-Dist: langchain-openai (>=0.3.12,<0.4.0)
39
- Requires-Dist: langdetect (>=1.0.9,<2.0.0)
40
- Requires-Dist: loguru (>=0.7.3,<0.8.0)
41
- Requires-Dist: lxml-html-clean (>=0.2.2,<0.3.0)
42
- Requires-Dist: markdown (>=3.7,<4.0)
43
- Requires-Dist: newscatcherapi (>=0.7.3,<0.8.0) ; extra == "apps"
44
- Requires-Dist: newspaper4k (>=0.9.3.1,<0.10.0.0) ; extra == "apps"
45
- Requires-Dist: nltk (>=3.9.1,<4.0.0)
22
+ Requires-Dist: dateparser (>=1.2.0)
23
+ Requires-Dist: dill (>=0.4.0)
24
+ Requires-Dist: feedparser (>=6.0.11) ; extra == "apps"
25
+ Requires-Dist: gensim (>=4.3.3)
26
+ Requires-Dist: google-api-python-client (>=2.148.0) ; extra == "apps"
27
+ Requires-Dist: google-auth-oauthlib (>=1.2.1) ; extra == "apps"
28
+ Requires-Dist: googlenewsdecoder (>=0.1.7) ; extra == "apps"
29
+ Requires-Dist: goose3 (>=3.1.19) ; extra == "apps"
30
+ Requires-Dist: hdbscan (>=0.8.40)
31
+ Requires-Dist: ipython (>=8.28.0)
32
+ Requires-Dist: joblib (>=1.4.2)
33
+ Requires-Dist: jsonlines (>=4.0.0)
34
+ Requires-Dist: langchain-core (>=0.3.59)
35
+ Requires-Dist: langdetect (>=1.0.9)
36
+ Requires-Dist: loguru (>=0.7.3)
37
+ Requires-Dist: lxml-html-clean (>=0.2.2)
38
+ Requires-Dist: markdown (>=3.7)
39
+ Requires-Dist: newscatcherapi (>=0.7.3) ; extra == "apps"
40
+ Requires-Dist: newspaper4k (>=0.9.3.1) ; extra == "apps"
41
+ Requires-Dist: nltk (>=3.9.1)
46
42
  Requires-Dist: numpy (<2)
47
- Requires-Dist: openai (>=1.77.0,<2.0.0)
43
+ Requires-Dist: openai (>=1.77.0)
48
44
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
49
- Requires-Dist: pandas (>=2.2.2,<3.0.0)
50
- Requires-Dist: plotly (>=5.24.1,<6.0.0)
51
- Requires-Dist: plotly-resampler (>=0.10.0,<0.11.0)
52
- Requires-Dist: pygooglenews (>=0.1.3,<0.2.0) ; extra == "apps"
45
+ Requires-Dist: pandas (>=2.2.2)
46
+ Requires-Dist: plotly (>=5.24.1)
47
+ Requires-Dist: plotly-resampler (>=0.10.0)
48
+ Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
53
49
  Requires-Dist: pylabeladjust (==0.1.13)
54
- Requires-Dist: pytest (>=8.3.3,<9.0.0) ; extra == "tests"
55
- Requires-Dist: requests (>=2.32.3,<3.0.0)
56
- Requires-Dist: scikit-learn (>=1.5.2,<2.0.0)
50
+ Requires-Dist: pytest (>=8.3.3)
51
+ Requires-Dist: requests (>=2.32.3)
52
+ Requires-Dist: scikit-learn (>=1.5.2)
57
53
  Requires-Dist: scipy (==1.12)
58
- Requires-Dist: seaborn (>=0.13.2,<0.14.0)
54
+ Requires-Dist: seaborn (>=0.13.2)
59
55
  Requires-Dist: sentence-transformers (==3.0.1)
60
- Requires-Dist: sentencepiece (>=0.2.0,<0.3.0)
61
- Requires-Dist: streamlit (>=1.45.0,<2.0.0)
62
- Requires-Dist: streamlit-code-editor (>=0.1.22,<0.2.0)
63
- Requires-Dist: thefuzz (>=0.22.1,<0.23.0)
64
- Requires-Dist: tiktoken (>=0.8.0,<0.9.0)
56
+ Requires-Dist: sentencepiece (>=0.2.0)
57
+ Requires-Dist: starlette (>=0.46.2)
58
+ Requires-Dist: streamlit (>=1.45.0)
59
+ Requires-Dist: streamlit-code-editor (>=0.1.22)
60
+ Requires-Dist: thefuzz (>=0.22.1)
61
+ Requires-Dist: tiktoken (>=0.8.0)
65
62
  Requires-Dist: tldextract (>=2.0.1)
66
63
  Requires-Dist: tokenizers (<0.20.0)
67
- Requires-Dist: torch (==2.7.0)
68
- Requires-Dist: tqdm (>=4.67.1,<5.0.0)
69
- Requires-Dist: umap-learn (>=0.5.7,<0.6.0)
64
+ Requires-Dist: torch (>=2.7.0)
65
+ Requires-Dist: tqdm (>=4.67.1)
66
+ Requires-Dist: umap-learn (>=0.5.7)
67
+ Project-URL: Bug Tracker, https://github.com/rte-france/BERTrend/issues
68
+ Project-URL: Documentation, https://github.com/rte-france/BERTrend
69
+ Project-URL: Homepage, https://github.com/rte-france/BERTrend
70
70
  Project-URL: Repository, https://github.com/rte-france/BERTrend
71
71
  Description-Content-Type: text/markdown
72
72
 
@@ -137,7 +137,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
137
137
  - Categorization of signals into three different dataframes: noise, weak and strong signals
138
138
  (each dataframe contains useful information about the signals)
139
139
  - Interpretation of these signals using LLMs
140
- - Inspection of topic merging process using Sankey diagram
140
+ - Inspection of the topic merging process using Sankey diagram
141
141
 
142
142
  ## Installation
143
143
 
@@ -174,19 +174,14 @@ BERTrend requires the following environment variables to be set:
174
174
  # Basic installation with core dependencies
175
175
  pip install . # or poetry install
176
176
 
177
- # Installation with test dependencies
178
- pip install ".[tests]" # or poetry install --with test
177
+ # Installation with apps dependencies
178
+ pip install ".[apps]" # or poetry install --extras apps
179
179
 
180
- # Installation with apps dependencies
181
- pip install ".[apps]" # or poetry install --with apps
182
-
183
- # Installation with all optional dependencies
184
- pip install ".[tests,apps]" # or poetry install --with test,apps
185
180
  ```
186
181
 
187
182
  - (Use `pip install -e .` for a local installation)
188
183
 
189
- NB. Due to the number of dependencies, the installation may take some time on an empty environement.
184
+ NB. Due to the number of dependencies, the installation may take some time on an empty environment.
190
185
 
191
186
  ### Dependency Management
192
187
 
@@ -232,7 +227,7 @@ For custom dataset creation, please refer to the documentation page about [data
232
227
 
233
228
  In order to use the provided demos, datasets :
234
229
  - can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
235
- - or can be uploaded from the client device on which is displayed the Streamlit apps.
230
+ - or can be uploaded from the client device on which are displayed the Streamlit apps.
236
231
 
237
232
  #### Dataset Format
238
233
  Required columns:
@@ -259,6 +254,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
259
254
  - `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
260
255
  The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
261
256
 
257
+ We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
258
+
259
+ The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
260
+
261
+ An example of a very simple implementation to deploy a separate embedding service can be found here: https://github.com/rte-france/wattelse/tree/main/wattelse/api/embedding. (this implementation is compatible with our code)
262
+
263
+
262
264
  ![parameters](docs/images/parameters.png)
263
265
 
264
266
  Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
@@ -277,7 +279,7 @@ The application is split into several pages:
277
279
  - Computes topics over time
278
280
  ![exploration_over_time](./docs/images/explore1.png)
279
281
 
280
- - Allow to select sources and generate short descriptions for each theme
282
+ - Allow selecting sources and generating short descriptions for each theme
281
283
  ![topic_exploration](./docs/images/explore2.png)
282
284
 
283
285
  - `Topic visualization`: Several visualization types available:
@@ -295,7 +297,7 @@ The application is split into several pages:
295
297
  ![temptopic_metrics](./docs/images/temptopic_metrics.png)
296
298
 
297
299
  - `Generate Newsletters`
298
- - This is an example of application combining topic analysis and LLMs
300
+ - This is an example of an application combining topic analysis and LLMs
299
301
  - Generates newsletters based on prominent topics
300
302
  - Uses LLMs to generate topic descriptions and summarize representative documents
301
303
 
@@ -344,8 +346,8 @@ Provides various statistics about topics:
344
346
  - As topics are hard to interprete by humans, we showcase how it can be
345
347
  done using LLMs.
346
348
  - Choose a specific topic and click on the button to generate an interpretation
347
- - LLM-based in-depth signal analysis is done using predefined templates for example:
348
- - describe what happens since last timestamp (summary of main events)
349
+ - LLM-based in-depth signal analysis is done using predefined templates, for example:
350
+ - describe what's happened since the last timestamp (summary of main events)
349
351
  - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
350
352
 
351
353
 
@@ -373,7 +375,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
373
375
 
374
376
  ## License Information
375
377
 
376
- Copyright 2023-2025 RTE France RTE: http://www.rte-france.com
378
+ Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
377
379
 
378
380
  This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available here: https://www.mozilla.org/en-US/MPL/2.0/
379
381
 
@@ -65,7 +65,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
65
65
  - Categorization of signals into three different dataframes: noise, weak and strong signals
66
66
  (each dataframe contains useful information about the signals)
67
67
  - Interpretation of these signals using LLMs
68
- - Inspection of topic merging process using Sankey diagram
68
+ - Inspection of the topic merging process using Sankey diagram
69
69
 
70
70
  ## Installation
71
71
 
@@ -102,19 +102,14 @@ BERTrend requires the following environment variables to be set:
102
102
  # Basic installation with core dependencies
103
103
  pip install . # or poetry install
104
104
 
105
- # Installation with test dependencies
106
- pip install ".[tests]" # or poetry install --with test
105
+ # Installation with apps dependencies
106
+ pip install ".[apps]" # or poetry install --extras apps
107
107
 
108
- # Installation with apps dependencies
109
- pip install ".[apps]" # or poetry install --with apps
110
-
111
- # Installation with all optional dependencies
112
- pip install ".[tests,apps]" # or poetry install --with test,apps
113
108
  ```
114
109
 
115
110
  - (Use `pip install -e .` for a local installation)
116
111
 
117
- NB. Due to the number of dependencies, the installation may take some time on an empty environement.
112
+ NB. Due to the number of dependencies, the installation may take some time on an empty environment.
118
113
 
119
114
  ### Dependency Management
120
115
 
@@ -160,7 +155,7 @@ For custom dataset creation, please refer to the documentation page about [data
160
155
 
161
156
  In order to use the provided demos, datasets :
162
157
  - can be stored on the server in: `$BERTREND_BASE_DIR/data/bertrend/`
163
- - or can be uploaded from the client device on which is displayed the Streamlit apps.
158
+ - or can be uploaded from the client device on which are displayed the Streamlit apps.
164
159
 
165
160
  #### Dataset Format
166
161
  Required columns:
@@ -187,6 +182,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
187
182
  - `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
188
183
  The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
189
184
 
185
+ We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
186
+
187
+ The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
188
+
189
+ An example of a very simple implementation to deploy a separate embedding service can be found here: https://github.com/rte-france/wattelse/tree/main/wattelse/api/embedding. (this implementation is compatible with our code)
190
+
191
+
190
192
  ![parameters](docs/images/parameters.png)
191
193
 
192
194
  Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
@@ -205,7 +207,7 @@ The application is split into several pages:
205
207
  - Computes topics over time
206
208
  ![exploration_over_time](./docs/images/explore1.png)
207
209
 
208
- - Allow to select sources and generate short descriptions for each theme
210
+ - Allow selecting sources and generating short descriptions for each theme
209
211
  ![topic_exploration](./docs/images/explore2.png)
210
212
 
211
213
  - `Topic visualization`: Several visualization types available:
@@ -223,7 +225,7 @@ The application is split into several pages:
223
225
  ![temptopic_metrics](./docs/images/temptopic_metrics.png)
224
226
 
225
227
  - `Generate Newsletters`
226
- - This is an example of application combining topic analysis and LLMs
228
+ - This is an example of an application combining topic analysis and LLMs
227
229
  - Generates newsletters based on prominent topics
228
230
  - Uses LLMs to generate topic descriptions and summarize representative documents
229
231
 
@@ -272,8 +274,8 @@ Provides various statistics about topics:
272
274
  - As topics are hard to interprete by humans, we showcase how it can be
273
275
  done using LLMs.
274
276
  - Choose a specific topic and click on the button to generate an interpretation
275
- - LLM-based in-depth signal analysis is done using predefined templates for example:
276
- - describe what happens since last timestamp (summary of main events)
277
+ - LLM-based in-depth signal analysis is done using predefined templates, for example:
278
+ - describe what's happened since the last timestamp (summary of main events)
277
279
  - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
278
280
 
279
281
 
@@ -301,7 +303,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
301
303
 
302
304
  ## License Information
303
305
 
304
- Copyright 2023-2025 RTE France RTE: http://www.rte-france.com
306
+ Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
305
307
 
306
308
  This Source Code is subject to the terms of the Mozilla Public License (MPL) v2 also available here: https://www.mozilla.org/en-US/MPL/2.0/
307
309
 
@@ -2,7 +2,6 @@
2
2
  # See AUTHORS.txt
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
- import os
6
5
  import time
7
6
 
8
7
  import requests
@@ -35,7 +35,7 @@ class GPTSummarizer(Summarizer):
35
35
  prompt_language: str = "fr",
36
36
  max_article_length: int = 1500,
37
37
  model_name: str = None,
38
- **kwargs
38
+ **kwargs,
39
39
  ) -> str:
40
40
  # Limit input length in case the text is large
41
41
  article_text = keep_first_n_words(article_text, max_article_length)
@@ -36,12 +36,15 @@ def mock_model():
36
36
  @pytest.fixture
37
37
  def mock_abstractive_summarizer(mock_tokenizer, mock_model):
38
38
  """Create a mock AbstractiveSummarizer with mocked dependencies."""
39
- with patch(
40
- "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained",
41
- return_value=mock_tokenizer,
42
- ), patch(
43
- "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained",
44
- return_value=mock_model,
39
+ with (
40
+ patch(
41
+ "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained",
42
+ return_value=mock_tokenizer,
43
+ ),
44
+ patch(
45
+ "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained",
46
+ return_value=mock_model,
47
+ ),
45
48
  ):
46
49
  summarizer = AbstractiveSummarizer()
47
50
  # Set the mocks directly to ensure they're used
@@ -52,11 +55,14 @@ def mock_abstractive_summarizer(mock_tokenizer, mock_model):
52
55
 
53
56
  def test_initialization():
54
57
  """Test that the AbstractiveSummarizer initializes with the correct model."""
55
- with patch(
56
- "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
57
- ) as mock_tokenizer, patch(
58
- "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
59
- ) as mock_model:
58
+ with (
59
+ patch(
60
+ "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
61
+ ) as mock_tokenizer,
62
+ patch(
63
+ "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
64
+ ) as mock_model,
65
+ ):
60
66
 
61
67
  # Mock the to() method to avoid device-related issues
62
68
  mock_model.return_value.to.return_value = mock_model.return_value
@@ -124,11 +130,14 @@ def test_custom_model():
124
130
  """Test initialization with a custom model."""
125
131
  custom_model = "custom/model"
126
132
 
127
- with patch(
128
- "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
129
- ) as mock_tokenizer, patch(
130
- "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
131
- ) as mock_model:
133
+ with (
134
+ patch(
135
+ "bertrend.services.summary.abstractive_summarizer.AutoTokenizer.from_pretrained"
136
+ ) as mock_tokenizer,
137
+ patch(
138
+ "bertrend.services.summary.abstractive_summarizer.AutoModelForSeq2SeqLM.from_pretrained"
139
+ ) as mock_model,
140
+ ):
132
141
 
133
142
  # Mock the to() method to avoid device-related issues
134
143
  mock_model.return_value.to.return_value = mock_model.return_value
@@ -55,12 +55,15 @@ def mock_openai_client():
55
55
  @pytest.fixture
56
56
  def mock_enhanced_summarizer(mock_sentence_transformer, mock_openai_client):
57
57
  """Create a mock EnhancedExtractiveSummarizer with mocked dependencies."""
58
- with patch(
59
- "bertrend.services.summary.extractive_summarizer.SentenceTransformer",
60
- return_value=mock_sentence_transformer,
61
- ), patch(
62
- "bertrend.services.summary.extractive_summarizer.OpenAI_Client",
63
- return_value=mock_openai_client,
58
+ with (
59
+ patch(
60
+ "bertrend.services.summary.extractive_summarizer.SentenceTransformer",
61
+ return_value=mock_sentence_transformer,
62
+ ),
63
+ patch(
64
+ "bertrend.services.summary.extractive_summarizer.OpenAI_Client",
65
+ return_value=mock_openai_client,
66
+ ),
64
67
  ):
65
68
  summarizer = EnhancedExtractiveSummarizer(
66
69
  api_key="test_key", endpoint="test_endpoint"
@@ -82,11 +85,14 @@ def test_extractive_summarizer_initialization():
82
85
 
83
86
  def test_enhanced_summarizer_initialization():
84
87
  """Test that the EnhancedExtractiveSummarizer initializes correctly."""
85
- with patch(
86
- "bertrend.services.summary.extractive_summarizer.SentenceTransformer"
87
- ) as mock_transformer, patch(
88
- "bertrend.services.summary.extractive_summarizer.OpenAI_Client"
89
- ) as mock_client:
88
+ with (
89
+ patch(
90
+ "bertrend.services.summary.extractive_summarizer.SentenceTransformer"
91
+ ) as mock_transformer,
92
+ patch(
93
+ "bertrend.services.summary.extractive_summarizer.OpenAI_Client"
94
+ ) as mock_client,
95
+ ):
90
96
  summarizer = EnhancedExtractiveSummarizer(
91
97
  api_key="test_key", endpoint="test_endpoint"
92
98
  )
@@ -128,13 +134,17 @@ def test_get_sentences_embeddings(
128
134
  def test_summarize_text(mock_extractive_summarizer):
129
135
  """Test the summarize_text method."""
130
136
  # Mock the necessary methods
131
- with patch.object(
132
- mock_extractive_summarizer,
133
- "get_sentences",
134
- return_value=["Sentence 1.", "Sentence 2.", "Sentence 3."],
135
- ), patch.object(mock_extractive_summarizer, "get_sentences_embeddings"), patch(
136
- "bertrend.services.summary.extractive_summarizer.summarize_embeddings",
137
- return_value=[0, 2],
137
+ with (
138
+ patch.object(
139
+ mock_extractive_summarizer,
140
+ "get_sentences",
141
+ return_value=["Sentence 1.", "Sentence 2.", "Sentence 3."],
142
+ ),
143
+ patch.object(mock_extractive_summarizer, "get_sentences_embeddings"),
144
+ patch(
145
+ "bertrend.services.summary.extractive_summarizer.summarize_embeddings",
146
+ return_value=[0, 2],
147
+ ),
138
148
  ):
139
149
 
140
150
  summary = mock_extractive_summarizer.summarize_text("This is a test text.")
@@ -207,9 +217,12 @@ def test_summarize_embeddings():
207
217
  def test_summarize_chunks(mock_extractive_summarizer):
208
218
  """Test the summarize_chunks method."""
209
219
  # Mock the necessary methods
210
- with patch.object(mock_extractive_summarizer, "get_chunks_embeddings"), patch(
211
- "bertrend.services.summary.extractive_summarizer.summarize_embeddings",
212
- return_value=np.array([0, 2]),
220
+ with (
221
+ patch.object(mock_extractive_summarizer, "get_chunks_embeddings"),
222
+ patch(
223
+ "bertrend.services.summary.extractive_summarizer.summarize_embeddings",
224
+ return_value=np.array([0, 2]),
225
+ ),
213
226
  ):
214
227
 
215
228
  chunks = ["Chunk 1", "Chunk 2", "Chunk 3", "Chunk 4", "Chunk 5"]
@@ -47,9 +47,7 @@ def test_nlp_dependencies():
47
47
  def test_llm_dependencies():
48
48
  """Test that LLM integration dependencies are installed correctly."""
49
49
  try:
50
- import langchain_community
51
- import langchain_chroma
52
- import langchain_openai
50
+ import langchain_core
53
51
  import openai
54
52
  import tiktoken
55
53
 
@@ -166,13 +166,15 @@ def test_get_diversity_value_invalid_type(mock_bertopic, sample_data):
166
166
 
167
167
  def test_compute_cluster_metrics(mock_bertopic, sample_data):
168
168
  """Test the compute_cluster_metrics function."""
169
- with patch(
170
- "bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
171
- ) as mock_coherence, patch(
172
- "bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
173
- ) as mock_diversity, patch(
174
- "bertrend.metrics.topic_metrics.logger"
175
- ) as mock_logger:
169
+ with (
170
+ patch(
171
+ "bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
172
+ ) as mock_coherence,
173
+ patch(
174
+ "bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
175
+ ) as mock_diversity,
176
+ patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
177
+ ):
176
178
 
177
179
  compute_cluster_metrics(
178
180
  mock_bertopic, sample_data["topics"], sample_data["docs"]
@@ -197,14 +199,16 @@ def test_compute_cluster_metrics(mock_bertopic, sample_data):
197
199
 
198
200
  def test_compute_cluster_metrics_coherence_error(mock_bertopic, sample_data):
199
201
  """Test the compute_cluster_metrics function when coherence calculation raises an error."""
200
- with patch(
201
- "bertrend.metrics.topic_metrics.get_coherence_value",
202
- side_effect=IndexError("Test error"),
203
- ) as mock_coherence, patch(
204
- "bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
205
- ) as mock_diversity, patch(
206
- "bertrend.metrics.topic_metrics.logger"
207
- ) as mock_logger:
202
+ with (
203
+ patch(
204
+ "bertrend.metrics.topic_metrics.get_coherence_value",
205
+ side_effect=IndexError("Test error"),
206
+ ) as mock_coherence,
207
+ patch(
208
+ "bertrend.metrics.topic_metrics.get_diversity_value", return_value=0.6
209
+ ) as mock_diversity,
210
+ patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
211
+ ):
208
212
 
209
213
  compute_cluster_metrics(
210
214
  mock_bertopic, sample_data["topics"], sample_data["docs"]
@@ -216,14 +220,16 @@ def test_compute_cluster_metrics_coherence_error(mock_bertopic, sample_data):
216
220
 
217
221
  def test_compute_cluster_metrics_diversity_error(mock_bertopic, sample_data):
218
222
  """Test the compute_cluster_metrics function when diversity calculation raises an error."""
219
- with patch(
220
- "bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
221
- ) as mock_coherence, patch(
222
- "bertrend.metrics.topic_metrics.get_diversity_value",
223
- side_effect=IndexError("Test error"),
224
- ) as mock_diversity, patch(
225
- "bertrend.metrics.topic_metrics.logger"
226
- ) as mock_logger:
223
+ with (
224
+ patch(
225
+ "bertrend.metrics.topic_metrics.get_coherence_value", return_value=0.75
226
+ ) as mock_coherence,
227
+ patch(
228
+ "bertrend.metrics.topic_metrics.get_diversity_value",
229
+ side_effect=IndexError("Test error"),
230
+ ) as mock_diversity,
231
+ patch("bertrend.metrics.topic_metrics.logger") as mock_logger,
232
+ ):
227
233
 
228
234
  compute_cluster_metrics(
229
235
  mock_bertopic, sample_data["topics"], sample_data["docs"]
@@ -0,0 +1,96 @@
1
+ [project]
2
+ name = "bertrend"
3
+ version = "0.3.3"
4
+ description = "BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM"
5
+ license = "LICENSE.md"
6
+ readme = "README.md"
7
+ requires-python = ">=3.12,<4.0"
8
+ authors = [
9
+ { name = "Jérôme Picault", email = "jerome.picault@rte-france.com" },
10
+ { name="Guillaume Grosjean", email="guillaume.grosjean@rte-france.com>" },
11
+ { name="Allaa Boutaleb", email="allaa.boutaleb@lip6.fr>"}
12
+ ]
13
+ maintainers = [
14
+ { name = "Jérôme Picault", email = "jerome.picault@rte-france.com" },
15
+ { name="Guillaume Grosjean", email="guillaume.grosjean@rte-france.com>" },
16
+ ]
17
+ keywords = ["topics", "BERTopic", "transformers", "weak signals", "LLM"]
18
+ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence"]
19
+
20
+ dependencies = [
21
+ "ipython (>=8.28.0)",
22
+ "bertopic (==0.16.2)", # not fully tested with more recent versions
23
+ "black (>=24.10.0)",
24
+ "coverage>=7.6.9",
25
+ "cron-descriptor (>=1.4.5)",
26
+ "datamapplot (==0.3.0)",
27
+ "dateparser (>=1.2.0)",
28
+ "dask (==2024.12.0)", # issues with >=2025.x (https://github.com/dask/dask/issues/11678)
29
+ "dill (>=0.4.0)",
30
+ "gensim (>=4.3.3)",
31
+ "hdbscan (>=0.8.40)",
32
+ "joblib (>=1.4.2)",
33
+ "jsonlines (>=4.0.0)",
34
+ "langdetect (>=1.0.9)",
35
+ "langchain-core (>=0.3.59)",
36
+ "loguru (>=0.7.3)",
37
+ "lxml-html-clean (>=0.2.2)",
38
+ "markdown (>=3.7)",
39
+ "nltk (>=3.9.1)",
40
+ "numpy (<2)",
41
+ "openai (>=1.77.0)",
42
+ "opentelemetry-exporter-otlp-proto-grpc (==1.25.0)", # to avoid error chroma with protobuf
43
+ "pandas (>=2.2.2)",
44
+ "plotly (>=5.24.1)",
45
+ "plotly-resampler (>=0.10.0)",
46
+ "pylabeladjust (==0.1.13)",
47
+ "Pyqtree (==1.0.0)",
48
+ "pytest>=8.3.3",
49
+ "scipy (==1.12)",
50
+ "scikit-learn (>=1.5.2)",
51
+ "sentence-transformers (==3.0.1)",
52
+ "starlette (>=0.46.2)",
53
+ "requests (>=2.32.3)",
54
+ "seaborn (>=0.13.2)",
55
+ "sentencepiece (>=0.2.0)",
56
+ "streamlit (>=1.45.0)",
57
+ "streamlit-code-editor (>=0.1.22)",
58
+ "tldextract (>=2.0.1)",
59
+ "thefuzz (>=0.22.1)",
60
+ "torch (>=2.7.0)",
61
+ "tqdm (>=4.67.1)",
62
+ "tiktoken (>=0.8.0)",
63
+ "tokenizers (<0.20.0)",
64
+ "umap-learn (>=0.5.7)"
65
+ ]
66
+
67
+ [project.optional-dependencies]
68
+ apps = [
69
+ "arxiv>=2.2.0",
70
+ "feedparser>=6.0.11",
71
+ "googlenewsdecoder>=0.1.7",
72
+ "google-api-python-client>=2.148.0",
73
+ "google-auth-oauthlib>=1.2.1",
74
+ "goose3>=3.1.19",
75
+ "newscatcherapi>=0.7.3",
76
+ "newspaper4k>=0.9.3.1",
77
+ "pygooglenews>=0.1.3"
78
+ ]
79
+
80
+ [project.urls]
81
+ homepage = "https://github.com/rte-france/BERTrend"
82
+ repository = "https://github.com/rte-france/BERTrend"
83
+ documentation = "https://github.com/rte-france/BERTrend"
84
+ "Bug Tracker" = "https://github.com/rte-france/BERTrend/issues"
85
+
86
+ [tool.poetry]
87
+ packages = [
88
+ { include = "bertrend" },
89
+ { include = "bertrend_apps" },
90
+ ]
91
+ exclude = [ "data" ]
92
+ requires-poetry = ">=2.0"
93
+
94
+ [build-system]
95
+ requires = ["poetry-core>=1.0.0"]
96
+ build-backend = "poetry.core.masonry.api"