bertrend 0.3.6__tar.gz → 0.3.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. {bertrend-0.3.6 → bertrend-0.3.8}/PKG-INFO +2 -2
  2. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/BERTopicModel.py +1 -0
  3. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/config/bertopic_default_config.toml +1 -1
  4. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/data_loading_component.py +46 -11
  5. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/embed_documents_component.py +3 -0
  6. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/i18n_translations.py +12 -0
  7. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +15 -19
  8. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +16 -9
  9. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/training_page.py +1 -0
  10. bertrend-0.3.8/bertrend/llm_utils/newsletter.css +145 -0
  11. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/llm_utils/newsletter_features.py +149 -105
  12. bertrend-0.3.8/bertrend/llm_utils/newsletter_model.py +44 -0
  13. bertrend-0.3.8/bertrend/llm_utils/newsletter_outlook_template.html +179 -0
  14. bertrend-0.3.8/bertrend/llm_utils/newsletter_template.html +106 -0
  15. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_integration.py +2 -2
  16. bertrend-0.3.8/bertrend/tests/test_newsletter_features.py +625 -0
  17. bertrend-0.3.8/bertrend/tests/test_newsletter_model.py +423 -0
  18. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/utils/data_loading.py +26 -18
  19. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/app_utils.py +1 -0
  20. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab1.py +3 -3
  21. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab3.py +4 -2
  22. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/newsletters/__main__.py +13 -5
  23. {bertrend-0.3.6 → bertrend-0.3.8}/pyproject.toml +2 -2
  24. bertrend-0.3.6/bertrend/llm_utils/newsletter.css +0 -131
  25. bertrend-0.3.6/bertrend/tests/test_newsletter_features.py +0 -354
  26. {bertrend-0.3.6 → bertrend-0.3.8}/AUTHORS.txt +0 -0
  27. {bertrend-0.3.6 → bertrend-0.3.8}/LICENSE.md +0 -0
  28. {bertrend-0.3.6 → bertrend-0.3.8}/README.md +0 -0
  29. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/BERTrend.py +0 -0
  30. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/__init__.py +0 -0
  31. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/config/bertrend_default_config.toml +0 -0
  32. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/config/parameters.py +0 -0
  33. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/config/services_default_config.toml +0 -0
  34. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/__init__.py +0 -0
  35. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/__init__.py +0 -0
  36. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/i18n.py +0 -0
  37. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/icons.py +0 -0
  38. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  39. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/demos_utils/state_utils.py +0 -0
  40. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/start_summarizer_app.sh +0 -0
  41. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  42. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/start_weak_signals_app.sh +0 -0
  43. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/summarization/__init__.py +0 -0
  44. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/summarization/summarizer_app.py +0 -0
  45. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  46. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/__init__.py +0 -0
  47. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/app.py +0 -0
  48. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  49. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  50. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  51. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  52. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  53. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  54. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/weak_signals/__init__.py +0 -0
  55. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/weak_signals/app.py +0 -0
  56. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  57. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  58. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/llm_utils/__init__.py +0 -0
  59. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/llm_utils/openai_client.py +0 -0
  60. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/llm_utils/prompts.py +0 -0
  61. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/metrics/__init__.py +0 -0
  62. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  63. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/metrics/topic_metrics.py +0 -0
  64. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/resources/common_ngrams.json +0 -0
  65. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/resources/stopwords-en.json +0 -0
  66. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/resources/stopwords-fr.json +0 -0
  67. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/resources/stopwords-rte.json +0 -0
  68. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/__init__.py +0 -0
  69. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/authentication.py +0 -0
  70. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_client.py +0 -0
  71. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/README.md +0 -0
  72. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/__init__.py +0 -0
  73. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  74. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/config/settings.py +0 -0
  75. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/main.py +0 -0
  76. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/models.py +0 -0
  77. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/__init__.py +0 -0
  78. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  79. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  80. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/info.py +0 -0
  81. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/security.py +0 -0
  82. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/start.py +0 -0
  83. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/status.py +0 -0
  84. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_server/stop.py +0 -0
  85. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/embedding_service.py +0 -0
  86. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summarizer.py +0 -0
  87. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/__init__.py +0 -0
  88. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  89. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  90. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/extractive_summarizer.py +0 -0
  91. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/lexrank.py +0 -0
  92. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/services/summary/prompts.py +0 -0
  93. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/README_integration_tests.md +0 -0
  94. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/__init__.py +0 -0
  95. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/conftest.py +0 -0
  96. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_abstractive_summarizer.py +0 -0
  97. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_bertrend.py +0 -0
  98. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_cache_utils.py +0 -0
  99. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
  100. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_config_utils.py +0 -0
  101. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_data_loading.py +0 -0
  102. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_data_structure.py +0 -0
  103. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_embedding_client.py +0 -0
  104. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_extractive_summarizer.py +0 -0
  105. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_installation.py +0 -0
  106. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_openai_client.py +0 -0
  107. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_representative_docs.py +0 -0
  108. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_summarizer.py +0 -0
  109. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  110. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_topic_description.py +0 -0
  111. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_topic_metrics.py +0 -0
  112. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_topic_model.py +0 -0
  113. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  114. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  115. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  116. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  117. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_utils_init.py +0 -0
  118. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/tests/test_visualizations.py +0 -0
  119. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/__init__.py +0 -0
  120. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/data_structure.py +0 -0
  121. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/prompts.py +0 -0
  122. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/representative_docs.py +0 -0
  123. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/topic_description.py +0 -0
  124. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/topic_analysis/visualizations.py +0 -0
  125. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/__init__.py +0 -0
  126. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/data_structure.py +0 -0
  127. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/prompts.py +0 -0
  128. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  129. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  130. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/visualizations.py +0 -0
  131. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/trend_analysis/weak_signals.py +0 -0
  132. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/utils/__init__.py +0 -0
  133. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/utils/cache_utils.py +0 -0
  134. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend/utils/config_utils.py +0 -0
  135. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/__init__.py +0 -0
  136. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/common/__init__.py +0 -0
  137. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/common/crontab_utils.py +0 -0
  138. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/common/mail_utils.py +0 -0
  139. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  140. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  141. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  142. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  143. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  144. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  145. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/gmail_credentials.json +0 -0
  146. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  147. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
  148. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  149. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  150. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  151. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  152. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  153. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  154. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  155. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/__init__.py +0 -0
  156. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/__main__.py +0 -0
  157. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  158. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  159. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  160. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/data_provider.py +0 -0
  161. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  162. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  163. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/data_provider/utils.py +0 -0
  164. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/__init__.py +0 -0
  165. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  166. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  167. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/app.py +0 -0
  168. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/config.toml +0 -0
  169. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  170. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  171. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  172. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  173. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  174. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  175. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  176. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  177. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  178. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  179. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  180. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  181. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  182. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
  183. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  184. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/newsletters/__init__.py +0 -0
  185. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  186. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  187. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/__init__.py +0 -0
  188. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/app.py +0 -0
  189. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/authentication.py +0 -0
  190. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  191. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  192. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  193. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  194. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_config.py +0 -0
  195. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  196. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/i18n_translations.py +0 -0
  197. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  198. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/models_info.py +0 -0
  199. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  200. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/process_new_data.py +0 -0
  201. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_generation.py +0 -0
  202. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_template.html +0 -0
  203. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_utils.py +0 -0
  204. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  205. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
  206. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/start_apps.sh +0 -0
  207. {bertrend-0.3.6 → bertrend-0.3.8}/bertrend_apps/stop_apps.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bertrend
3
- Version: 0.3.6
3
+ Version: 0.3.8
4
4
  Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
5
5
  License: LICENSE.md
6
6
  Keywords: topics,BERTopic,transformers,weak signals,LLM
@@ -57,7 +57,7 @@ Requires-Dist: seaborn (>=0.13.2)
57
57
  Requires-Dist: sentence-transformers (==3.0.1)
58
58
  Requires-Dist: sentencepiece (>=0.2.0)
59
59
  Requires-Dist: starlette (>=0.46.2)
60
- Requires-Dist: streamlit (>=1.45.1)
60
+ Requires-Dist: streamlit (>=1.46)
61
61
  Requires-Dist: streamlit-code-editor (>=0.1.22)
62
62
  Requires-Dist: thefuzz (>=0.22.1)
63
63
  Requires-Dist: tiktoken (>=0.8.0)
@@ -237,6 +237,7 @@ class BERTopicModel:
237
237
  Precomputed document embeddings.
238
238
  embedding_model : SentenceTransformer or str or None, optional
239
239
  Sentence transformer (or associated model name) model for embeddings.
240
+ NB. Important: if not set, the keywords describing the topics may not be correct (e.g. accents strip); therefore, it is recommended to set this parameter.
240
241
  zeroshot_topic_list : list[str] or None, optional
241
242
  List of topics used for zeroshot classification.
242
243
  zeroshot_min_similarity : float or None, optional
@@ -45,4 +45,4 @@ diversity = 0.3
45
45
 
46
46
  # Reduce outliers: https://maartengr.github.io/BERTopic/api/bertopic.html#bertopic._bertopic.BERTopic.reduce_outliers
47
47
  [reduce_outliers]
48
- strategy = "c-tf-idf"
48
+ strategy = "c-tf-idf"
@@ -37,6 +37,9 @@ from bertrend.utils.data_loading import (
37
37
  split_data,
38
38
  TIMESTAMP_COLUMN,
39
39
  DataLoadingError,
40
+ _file_to_pd,
41
+ _clean_data,
42
+ _check_data,
40
43
  )
41
44
 
42
45
  FORMAT_ICONS = {
@@ -50,7 +53,31 @@ FORMAT_ICONS = {
50
53
  }
51
54
 
52
55
 
53
- @st.cache_data(ttl=60 * 60 * 24)
56
+ @st.dialog(translate("column_selection"))
57
+ def _select_alternative_columns(df: pd.DataFrame, message: str = ""):
58
+ st.warning(message, icon=WARNING_ICON),
59
+ if TEXT_COLUMN not in df.columns:
60
+ text_column = st.selectbox(
61
+ label=translate("text_column_selection"), options=df.columns
62
+ )
63
+ else:
64
+ text_column = None
65
+ if TIMESTAMP_COLUMN not in df.columns:
66
+ timestamp_column = st.selectbox(
67
+ label=translate("timestamp_column_selection"), options=df.columns
68
+ )
69
+ else:
70
+ timestamp_column = None
71
+ if st.button("Submit"):
72
+ if text_column:
73
+ df[TEXT_COLUMN] = df[text_column]
74
+ if timestamp_column:
75
+ df[TIMESTAMP_COLUMN] = df[timestamp_column]
76
+ st.session_state["modified_df"] = df
77
+ st.rerun()
78
+
79
+
80
+ # @st.cache_data(ttl=60 * 60 * 24)
54
81
  def _process_uploaded_files(
55
82
  files: list[UploadedFile],
56
83
  ) -> list[pd.DataFrame]:
@@ -61,20 +88,23 @@ def _process_uploaded_files(
61
88
  with open(tmpdir + "/" + f.name, "wb") as tmp_file:
62
89
  tmp_file.write(f.getvalue())
63
90
  if tmp_file is not None:
91
+ if "modified_df" in st.session_state:
92
+ df = st.session_state["modified_df"]
93
+ st.session_state.pop("modified_df")
94
+ else:
95
+ df = _file_to_pd(Path(tmp_file.name))
64
96
  try:
65
- df = load_data(
66
- Path(tmp_file.name),
67
- SessionStateManager.get("language", "French"),
68
- )
97
+ _check_data(df, Path(tmp_file.name))
69
98
  except DataLoadingError as dle:
70
- st.warning(
71
- translate("error_loading_file").format(
72
- file_name=f.name, error=dle
73
- ),
74
- icon=WARNING_ICON,
99
+ message = translate("error_loading_file").format(
100
+ file_name=f.name, error=dle
75
101
  )
102
+ if "modified_df" in st.session_state:
103
+ st.session_state.pop("modified_df")
104
+ _select_alternative_columns(df, message)
76
105
  df = None
77
106
  if df is not None:
107
+ df = _clean_data(df, SessionStateManager.get("language", "French"))
78
108
  dataframes.append(df)
79
109
  return dataframes
80
110
 
@@ -99,7 +129,12 @@ def _load_files(
99
129
  ),
100
130
  icon=WARNING_ICON,
101
131
  )
102
- df = None
132
+ _select_alternative_columns(df)
133
+ df = (
134
+ st.session_state["modified_df"]
135
+ if "modified_df" in st.session_state
136
+ else None
137
+ )
103
138
  if df is not None:
104
139
  dfs.append(df)
105
140
  return dfs
@@ -31,6 +31,9 @@ def display_embed_documents_component():
31
31
  local=False,
32
32
  url=SessionStateManager.get("embedding_service_url"),
33
33
  )
34
+ SessionStateManager.set(
35
+ "embedding_model_name", embedding_service.embedding_model_name
36
+ )
34
37
 
35
38
  texts = SessionStateManager.get_dataframe("time_filtered_df")[
36
39
  TEXT_COLUMN
@@ -137,4 +137,16 @@ TRANSLATIONS = {
137
137
  "fr": "Paramètres et contrôles",
138
138
  "en": "Settings and Controls",
139
139
  },
140
+ "column_selection": {
141
+ "fr": "Sélection des colonnes",
142
+ "en": "Column Selection",
143
+ },
144
+ "text_column_selection": {
145
+ "fr": "Sélection de la colonne contenant le texte",
146
+ "en": "Select Column Containing Text",
147
+ },
148
+ "timestamp_column_selection": {
149
+ "fr": "Sélection de la colonne contenant l'horodatage",
150
+ "en": "Select Column Containing Timestamp",
151
+ },
140
152
  }
@@ -282,27 +282,23 @@ def create_topic_documents(
282
282
  return folder_name, documents
283
283
 
284
284
 
285
+ @st.cache_data
285
286
  def _display_topic_description(filtered_df: pd.DataFrame):
286
287
  """Display a human-readable description of the selected topic using a LLM."""
287
- if st.button(
288
- translate("generate_topic_description"),
289
- type="primary",
290
- use_container_width=True,
291
- ):
292
- with st.spinner(translate("generating_description")):
293
- language_code = (
294
- "fr"
295
- if SessionStateManager.get("internationalization_language") == "French"
296
- else "en"
297
- )
298
- gpt_description = generate_topic_description(
299
- st.session_state["topic_model"],
300
- st.session_state["selected_topic_number"],
301
- filtered_df,
302
- language_code=language_code,
303
- )
304
- with st.container(border=True):
305
- st.markdown(f"### {gpt_description.title}\n{gpt_description.description}")
288
+ with st.spinner(translate("generating_description")):
289
+ language_code = (
290
+ "fr"
291
+ if SessionStateManager.get("internationalization_language") == "fr"
292
+ else "en"
293
+ )
294
+ gpt_description = generate_topic_description(
295
+ st.session_state["topic_model"],
296
+ st.session_state["selected_topic_number"],
297
+ filtered_df,
298
+ language_code=language_code,
299
+ )
300
+ with st.container(border=True):
301
+ st.markdown(f"### {gpt_description.title}\n{gpt_description.description}")
306
302
 
307
303
 
308
304
  def main():
@@ -6,6 +6,7 @@ import inspect
6
6
 
7
7
  import pandas as pd
8
8
  import streamlit as st
9
+ import streamlit.components.v1 as components
9
10
  from pathlib import Path
10
11
 
11
12
  from bertrend.demos.demos_utils.i18n import translate
@@ -16,13 +17,17 @@ from bertrend.demos.demos_utils.state_utils import (
16
17
  register_multiple_widget,
17
18
  SessionStateManager,
18
19
  )
20
+ from bertrend.llm_utils.newsletter_model import Newsletter
19
21
  from bertrend.services.summary.abstractive_summarizer import AbstractiveSummarizer
20
22
  from bertrend.services.summary.chatgpt_summarizer import GPTSummarizer
21
23
  from bertrend.services.summary.extractive_summarizer import (
22
24
  ExtractiveSummarizer,
23
25
  EnhancedExtractiveSummarizer,
24
26
  )
25
- from bertrend.llm_utils.newsletter_features import generate_newsletter, md2html
27
+ from bertrend.llm_utils.newsletter_features import (
28
+ generate_newsletter,
29
+ render_newsletter_html,
30
+ )
26
31
 
27
32
 
28
33
  # Define summarizer options
@@ -34,9 +39,7 @@ SUMMARIZER_OPTIONS_MAPPER = {
34
39
  }
35
40
 
36
41
 
37
- def generate_newsletter_wrapper(
38
- df: pd.DataFrame, df_split: pd.DataFrame
39
- ) -> tuple[str, str, str]:
42
+ def generate_newsletter_wrapper(df: pd.DataFrame, df_split: pd.DataFrame) -> Newsletter:
40
43
  """Wrapper function to generate newsletter based on user settings."""
41
44
  top_n_topics = (
42
45
  None
@@ -51,7 +54,7 @@ def generate_newsletter_wrapper(
51
54
 
52
55
  language_code = (
53
56
  "fr"
54
- if SessionStateManager.get("internationalization_language") == "French"
57
+ if SessionStateManager.get("internationalization_language") == "fr"
55
58
  else "en"
56
59
  )
57
60
 
@@ -172,10 +175,14 @@ def main():
172
175
 
173
176
  # Display generated newsletters
174
177
  if "newsletters" in st.session_state:
175
- st.components.v1.html(
176
- md2html(
177
- st.session_state["newsletters"][0],
178
- Path(inspect.getfile(generate_newsletter)).parent / "newsletter.css",
178
+ components.html(
179
+ render_newsletter_html(
180
+ st.session_state["newsletters"],
181
+ html_template=Path(inspect.getfile(generate_newsletter)).parent
182
+ / "newsletter_template.html",
183
+ custom_css=Path(inspect.getfile(generate_newsletter)).parent
184
+ / "newsletter.css",
185
+ language=SessionStateManager.get("internationalization_language"),
179
186
  ),
180
187
  height=800,
181
188
  scrolling=True,
@@ -127,6 +127,7 @@ def train_model():
127
127
  topic_model_output = topic_model.fit(
128
128
  docs=dataset,
129
129
  embeddings=embeddings,
130
+ embedding_model=SessionStateManager.get("embedding_model_name"),
130
131
  )
131
132
  bertopic = topic_model_output.topic_model
132
133
 
@@ -0,0 +1,145 @@
1
+ /*
2
+ * Copyright (c) 2024, RTE (https://www.rte-france.com)
3
+ * See AUTHORS.txt
4
+ * SPDX-License-Identifier: MPL-2.0
5
+ * This file is part of BERTrend.
6
+ */
7
+
8
+ /* General Body Styles */
9
+ body {
10
+ font-family: Arial, sans-serif;
11
+ margin: 0;
12
+ padding: 0;
13
+ background-color: #f4f4f9;
14
+ color: #333;
15
+ }
16
+
17
+ .container {
18
+ max-width: 800px;
19
+ margin: 0 auto;
20
+ padding: 20px;
21
+ background-color: #fff;
22
+ }
23
+
24
+ h1 {
25
+ font-size: 32px;
26
+ color: #333;
27
+ }
28
+
29
+ .period {
30
+ font-size: 18px;
31
+ color: #555;
32
+ }
33
+
34
+ /* Topic Styles */
35
+ .topic {
36
+ margin-top: 30px;
37
+ padding-left: 20px; /* Added padding to make room for the colored bar */
38
+ border-left: 10px solid transparent; /* Default to transparent */
39
+ }
40
+
41
+ /* Topic Types - Adjusted to apply colors to the entire topic */
42
+ .topic.strong {
43
+ border-left-color: #4caf50; /* Green for strong */
44
+ }
45
+
46
+ .topic.weak {
47
+ border-left-color: #ff9800; /* Orange for weak */
48
+ }
49
+
50
+ .topic.noise {
51
+ border-left-color: #9e9e9e; /* Grey for noise */
52
+ }
53
+
54
+ h2 {
55
+ font-size: 24px;
56
+ color: #c50000;
57
+ }
58
+
59
+ .summary {
60
+ margin: 10px 0;
61
+ font-size: 16px;
62
+ color: #666;
63
+ }
64
+
65
+ /* Article Styles */
66
+ .articles {
67
+ margin-top: 15px;
68
+ }
69
+
70
+ .article {
71
+ margin-bottom: 15px;
72
+ padding: 10px;
73
+ background-color: #f9f9f9;
74
+ border-left: none; /* Removed the vertical bar for articles */
75
+ }
76
+
77
+ .article h3 {
78
+ font-size: 18px;
79
+ color: #2a2a2a;
80
+ }
81
+
82
+ /* Styling for the Article Title Link */
83
+ .article a {
84
+ text-decoration: none; /* Remove default underline */
85
+ color: #0066cc; /* Blue color for the link */
86
+ font-weight: bold; /* Make the link title bold */
87
+ transition: all 0.3s ease; /* Smooth transition for hover effect */
88
+ }
89
+
90
+ /* Hover Effect */
91
+ .article a:hover {
92
+ color: #005bb5; /* Darker blue on hover */
93
+ text-decoration: underline; /* Underline on hover for better visual feedback */
94
+ border-bottom: 2px solid #005bb5; /* Optional: Add a border for emphasis */
95
+ }
96
+
97
+ /* Date and Source Inline */
98
+ .timestamp {
99
+ display: flex;
100
+ align-items: center;
101
+ font-size: 14px;
102
+ color: grey;
103
+ margin-bottom: 10px;
104
+ }
105
+
106
+ .timestamp .separator {
107
+ margin: 0 5px;
108
+ }
109
+
110
+ .date {
111
+ font-weight: bold;
112
+ }
113
+
114
+ .source {
115
+ font-style: italic;
116
+ }
117
+
118
+ /* Hashtags */
119
+ .hashtags {
120
+ margin-top: 7px;
121
+ }
122
+ .hashtags span {
123
+ display: inline-block;
124
+ margin-right: 8px;
125
+ padding: 2px 8px;
126
+ background: #e8eefa;
127
+ color: #205296;
128
+ border-radius: 6px;
129
+ font-size: 12px;
130
+ font-weight: 500;
131
+ letter-spacing: 0.2px;
132
+ margin-bottom: 2px;
133
+ transition: background 0.16s;
134
+ }
135
+ .hashtags span:hover {
136
+ background: #bfd6f6;
137
+ }
138
+
139
+ /* Footer Styles */
140
+ .footer {
141
+ margin-top: 40px;
142
+ text-align: center;
143
+ font-size: 12px;
144
+ color: #aaa;
145
+ }