bertrend 0.3.7__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.7 → bertrend-0.3.8}/PKG-INFO +2 -2
  2. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/config/bertopic_default_config.toml +1 -1
  3. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/data_loading_component.py +46 -11
  4. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/i18n_translations.py +12 -0
  5. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +15 -19
  6. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +15 -8
  7. bertrend-0.3.8/bertrend/llm_utils/newsletter.css +145 -0
  8. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/llm_utils/newsletter_features.py +148 -104
  9. bertrend-0.3.8/bertrend/llm_utils/newsletter_model.py +44 -0
  10. bertrend-0.3.8/bertrend/llm_utils/newsletter_outlook_template.html +179 -0
  11. bertrend-0.3.8/bertrend/llm_utils/newsletter_template.html +106 -0
  12. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_integration.py +2 -2
  13. bertrend-0.3.8/bertrend/tests/test_newsletter_features.py +625 -0
  14. bertrend-0.3.8/bertrend/tests/test_newsletter_model.py +423 -0
  15. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/utils/data_loading.py +26 -18
  16. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab3.py +4 -2
  17. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/newsletters/__main__.py +12 -5
  18. {bertrend-0.3.7 → bertrend-0.3.8}/pyproject.toml +2 -2
  19. bertrend-0.3.7/bertrend/llm_utils/newsletter.css +0 -131
  20. bertrend-0.3.7/bertrend/tests/test_newsletter_features.py +0 -354
  21. {bertrend-0.3.7 → bertrend-0.3.8}/AUTHORS.txt +0 -0
  22. {bertrend-0.3.7 → bertrend-0.3.8}/LICENSE.md +0 -0
  23. {bertrend-0.3.7 → bertrend-0.3.8}/README.md +0 -0
  24. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/BERTopicModel.py +0 -0
  25. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/BERTrend.py +0 -0
  26. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/__init__.py +0 -0
  27. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/config/bertrend_default_config.toml +0 -0
  28. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/config/parameters.py +0 -0
  29. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/config/services_default_config.toml +0 -0
  30. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/__init__.py +0 -0
  31. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/__init__.py +0 -0
  32. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  33. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/i18n.py +0 -0
  34. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/icons.py +0 -0
  35. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  36. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/demos_utils/state_utils.py +0 -0
  37. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/start_summarizer_app.sh +0 -0
  38. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  39. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/start_weak_signals_app.sh +0 -0
  40. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/summarization/__init__.py +0 -0
  41. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/summarization/summarizer_app.py +0 -0
  42. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  43. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/__init__.py +0 -0
  44. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/app.py +0 -0
  45. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  46. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  47. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  48. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  49. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
  50. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  51. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  52. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/weak_signals/__init__.py +0 -0
  53. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/weak_signals/app.py +0 -0
  54. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  55. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  56. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/llm_utils/__init__.py +0 -0
  57. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/llm_utils/openai_client.py +0 -0
  58. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/llm_utils/prompts.py +0 -0
  59. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/metrics/__init__.py +0 -0
  60. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  61. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/metrics/topic_metrics.py +0 -0
  62. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/resources/common_ngrams.json +0 -0
  63. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/resources/stopwords-en.json +0 -0
  64. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/resources/stopwords-fr.json +0 -0
  65. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/resources/stopwords-rte.json +0 -0
  66. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/__init__.py +0 -0
  67. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/authentication.py +0 -0
  68. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_client.py +0 -0
  69. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/README.md +0 -0
  70. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/__init__.py +0 -0
  71. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  72. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/config/settings.py +0 -0
  73. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/main.py +0 -0
  74. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/models.py +0 -0
  75. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/__init__.py +0 -0
  76. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  77. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  78. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/routers/info.py +0 -0
  79. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/security.py +0 -0
  80. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/start.py +0 -0
  81. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/status.py +0 -0
  82. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_server/stop.py +0 -0
  83. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/embedding_service.py +0 -0
  84. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summarizer.py +0 -0
  85. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/__init__.py +0 -0
  86. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  87. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  88. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/extractive_summarizer.py +0 -0
  89. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/lexrank.py +0 -0
  90. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/services/summary/prompts.py +0 -0
  91. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/README_integration_tests.md +0 -0
  92. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/__init__.py +0 -0
  93. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/conftest.py +0 -0
  94. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_abstractive_summarizer.py +0 -0
  95. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_bertrend.py +0 -0
  96. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_cache_utils.py +0 -0
  97. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
  98. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_config_utils.py +0 -0
  99. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_data_loading.py +0 -0
  100. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_data_structure.py +0 -0
  101. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_embedding_client.py +0 -0
  102. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_extractive_summarizer.py +0 -0
  103. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_installation.py +0 -0
  104. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_openai_client.py +0 -0
  105. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_representative_docs.py +0 -0
  106. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_summarizer.py +0 -0
  107. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  108. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_topic_description.py +0 -0
  109. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_topic_metrics.py +0 -0
  110. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_topic_model.py +0 -0
  111. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  112. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  113. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  114. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  115. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_utils_init.py +0 -0
  116. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/tests/test_visualizations.py +0 -0
  117. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/__init__.py +0 -0
  118. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/data_structure.py +0 -0
  119. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/prompts.py +0 -0
  120. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/representative_docs.py +0 -0
  121. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/topic_description.py +0 -0
  122. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/topic_analysis/visualizations.py +0 -0
  123. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/__init__.py +0 -0
  124. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/data_structure.py +0 -0
  125. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/prompts.py +0 -0
  126. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  127. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  128. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/visualizations.py +0 -0
  129. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/trend_analysis/weak_signals.py +0 -0
  130. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/utils/__init__.py +0 -0
  131. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/utils/cache_utils.py +0 -0
  132. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend/utils/config_utils.py +0 -0
  133. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/__init__.py +0 -0
  134. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/common/__init__.py +0 -0
  135. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/common/crontab_utils.py +0 -0
  136. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/common/mail_utils.py +0 -0
  137. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  138. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  139. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  140. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  141. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  142. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  143. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/gmail_credentials.json +0 -0
  144. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  145. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
  146. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  147. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  148. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  149. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  150. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  151. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  152. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  153. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/__init__.py +0 -0
  154. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/__main__.py +0 -0
  155. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  156. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  157. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  158. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/data_provider.py +0 -0
  159. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  160. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  161. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/data_provider/utils.py +0 -0
  162. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/__init__.py +0 -0
  163. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  164. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  165. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/app.py +0 -0
  166. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  167. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/config.toml +0 -0
  168. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  169. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  170. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  171. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  172. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  173. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  174. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  175. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  176. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  177. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  178. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  179. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  180. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  181. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  182. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
  183. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  184. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/newsletters/__init__.py +0 -0
  185. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  186. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  187. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/__init__.py +0 -0
  188. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/app.py +0 -0
  189. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/authentication.py +0 -0
  190. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  191. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  192. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  193. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  194. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_config.py +0 -0
  195. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  196. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/i18n_translations.py +0 -0
  197. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  198. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/models_info.py +0 -0
  199. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  200. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/process_new_data.py +0 -0
  201. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_generation.py +0 -0
  202. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_template.html +0 -0
  203. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/report_utils.py +0 -0
  204. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  205. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
  206. {bertrend-0.3.7 → bertrend-0.3.8}/bertrend_apps/start_apps.sh +0 -0
  207. {bertrend-0.3.7 → 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.7
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)
@@ -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
@@ -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") == "fr"
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
@@ -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,
@@ -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
+ }