bertrend 0.3.2__tar.gz → 0.3.4__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 (189) hide show
  1. {bertrend-0.3.2 → bertrend-0.3.4}/PKG-INFO +70 -67
  2. {bertrend-0.3.2 → bertrend-0.3.4}/README.md +18 -16
  3. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/data_loading_component.py +76 -36
  4. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/embed_documents_component.py +4 -4
  5. bertrend-0.3.4/bertrend/demos/demos_utils/i18n.py +95 -0
  6. bertrend-0.3.4/bertrend/demos/demos_utils/i18n_translations.py +140 -0
  7. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/parameters_component.py +10 -10
  8. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app.py +16 -9
  9. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +34 -35
  10. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +14 -13
  11. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +62 -54
  12. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +13 -13
  13. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/training_page.py +24 -32
  14. bertrend-0.3.4/bertrend/demos/topic_analysis/i18n_translations.py +359 -0
  15. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/app.py +77 -80
  16. bertrend-0.3.4/bertrend/demos/weak_signals/i18n_translations.py +287 -0
  17. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/visualizations_utils.py +37 -31
  18. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/authentication.py +0 -1
  19. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/embedding_client.py +1 -1
  20. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/chatgpt_summarizer.py +1 -1
  21. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_abstractive_summarizer.py +25 -16
  22. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_extractive_summarizer.py +34 -21
  23. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_installation.py +1 -3
  24. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_metrics.py +29 -23
  25. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/data_loading.py +28 -2
  26. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/__main__.py +3 -3
  27. bertrend-0.3.2/bertrend_apps/data_provider/curebot_provider.py → bertrend-0.3.4/bertrend_apps/data_provider/atom_feed_provider.py +1 -1
  28. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +15 -8
  29. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/old_veille_analyse.py +3 -3
  30. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/app.py +8 -4
  31. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_analysis.py +10 -6
  32. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_common.py +6 -7
  33. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_signals.py +6 -4
  34. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_config.py +7 -7
  35. bertrend-0.3.2/bertrend_apps/prospective_demo/i18n.py → bertrend-0.3.4/bertrend_apps/prospective_demo/i18n_translations.py +23 -68
  36. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/process_new_data.py +20 -2
  37. bertrend-0.3.4/pyproject.toml +97 -0
  38. bertrend-0.3.2/bertrend/demos/demos_utils/messages.py +0 -11
  39. bertrend-0.3.2/bertrend/demos/topic_analysis/messages.py +0 -13
  40. bertrend-0.3.2/bertrend/demos/weak_signals/messages.py +0 -32
  41. bertrend-0.3.2/pyproject.toml +0 -91
  42. {bertrend-0.3.2 → bertrend-0.3.4}/AUTHORS.txt +0 -0
  43. {bertrend-0.3.2 → bertrend-0.3.4}/LICENSE.md +0 -0
  44. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/BERTopicModel.py +0 -0
  45. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/BERTrend.py +0 -0
  46. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/__init__.py +0 -0
  47. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/bertopic_default_config.toml +0 -0
  48. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/bertrend_default_config.toml +0 -0
  49. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/parameters.py +0 -0
  50. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/config/services_default_config.toml +0 -0
  51. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/__init__.py +0 -0
  52. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/__init__.py +0 -0
  53. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/icons.py +0 -0
  54. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/demos_utils/state_utils.py +0 -0
  55. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_summarizer_app.sh +0 -0
  56. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  57. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/start_weak_signals_app.sh +0 -0
  58. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/summarization/__init__.py +0 -0
  59. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/summarization/summarizer_app.py +0 -0
  60. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/__init__.py +0 -0
  61. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  62. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  63. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/demos/weak_signals/__init__.py +0 -0
  64. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/__init__.py +0 -0
  65. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/newsletter.css +0 -0
  66. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/newsletter_features.py +0 -0
  67. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/openai_client.py +0 -0
  68. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/llm_utils/prompts.py +0 -0
  69. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/__init__.py +0 -0
  70. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  71. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/metrics/topic_metrics.py +0 -0
  72. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/common_ngrams.json +0 -0
  73. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-en.json +0 -0
  74. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-fr.json +0 -0
  75. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/resources/stopwords-rte.json +0 -0
  76. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/__init__.py +0 -0
  77. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/embedding_service.py +0 -0
  78. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summarizer.py +0 -0
  79. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/__init__.py +0 -0
  80. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  81. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/extractive_summarizer.py +0 -0
  82. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/lexrank.py +0 -0
  83. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/services/summary/prompts.py +0 -0
  84. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/README_integration_tests.md +0 -0
  85. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/__init__.py +0 -0
  86. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/conftest.py +0 -0
  87. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_bertrend.py +0 -0
  88. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_cache_utils.py +0 -0
  89. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
  90. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_config_utils.py +0 -0
  91. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_data_loading.py +0 -0
  92. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_data_structure.py +0 -0
  93. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_embedding_client.py +0 -0
  94. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_integration.py +0 -0
  95. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_newsletter_features.py +0 -0
  96. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_openai_client.py +0 -0
  97. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_representative_docs.py +0 -0
  98. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_summarizer.py +0 -0
  99. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  100. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_description.py +0 -0
  101. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_topic_model.py +0 -0
  102. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  103. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  104. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  105. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  106. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_utils_init.py +0 -0
  107. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/tests/test_visualizations.py +0 -0
  108. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/__init__.py +0 -0
  109. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/data_structure.py +0 -0
  110. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/prompts.py +0 -0
  111. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/representative_docs.py +0 -0
  112. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/topic_description.py +0 -0
  113. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/topic_analysis/visualizations.py +0 -0
  114. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/__init__.py +0 -0
  115. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/data_structure.py +0 -0
  116. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/prompts.py +0 -0
  117. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  118. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  119. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/visualizations.py +0 -0
  120. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/trend_analysis/weak_signals.py +0 -0
  121. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/__init__.py +0 -0
  122. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/cache_utils.py +0 -0
  123. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend/utils/config_utils.py +0 -0
  124. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/__init__.py +0 -0
  125. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/__init__.py +0 -0
  126. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/crontab_utils.py +0 -0
  127. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/common/mail_utils.py +0 -0
  128. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  129. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  130. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  131. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  132. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  133. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  134. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/gmail_credentials.json +0 -0
  135. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  136. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
  137. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  138. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  139. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  140. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  141. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  142. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  143. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  144. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/__init__.py +0 -0
  145. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  146. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  147. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/data_provider.py +0 -0
  148. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  149. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  150. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/data_provider/utils.py +0 -0
  151. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/__init__.py +0 -0
  152. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  153. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app.py +0 -0
  154. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  155. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/config.toml +0 -0
  156. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  157. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  158. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  159. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  160. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
  161. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  162. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  163. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  164. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  165. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  166. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  167. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  168. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  169. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  170. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
  171. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  172. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/newsletters/__init__.py +0 -0
  173. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/newsletters/__main__.py +0 -0
  174. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  175. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  176. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/__init__.py +0 -0
  177. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/authentication.py +0 -0
  178. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  179. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  180. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  181. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/models_info.py +0 -0
  182. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  183. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_generation.py +0 -0
  184. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_template.html +0 -0
  185. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_utils.py +0 -0
  186. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  187. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
  188. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/start_apps.sh +0 -0
  189. {bertrend-0.3.2 → bertrend-0.3.4}/bertrend_apps/stop_apps.sh +0 -0
@@ -1,72 +1,73 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: bertrend
3
- Version: 0.3.2
3
+ Version: 0.3.4
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)
44
+ Requires-Dist: openpyxl (>=3.1.5)
48
45
  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"
46
+ Requires-Dist: pandas (>=2.2.2)
47
+ Requires-Dist: plotly (>=5.24.1)
48
+ Requires-Dist: plotly-resampler (>=0.10.0)
49
+ Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
53
50
  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)
51
+ Requires-Dist: pytest (>=8.3.3)
52
+ Requires-Dist: requests (>=2.32.3)
53
+ Requires-Dist: scikit-learn (>=1.5.2)
57
54
  Requires-Dist: scipy (==1.12)
58
- Requires-Dist: seaborn (>=0.13.2,<0.14.0)
55
+ Requires-Dist: seaborn (>=0.13.2)
59
56
  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)
57
+ Requires-Dist: sentencepiece (>=0.2.0)
58
+ Requires-Dist: starlette (>=0.46.2)
59
+ Requires-Dist: streamlit (>=1.45.0)
60
+ Requires-Dist: streamlit-code-editor (>=0.1.22)
61
+ Requires-Dist: thefuzz (>=0.22.1)
62
+ Requires-Dist: tiktoken (>=0.8.0)
65
63
  Requires-Dist: tldextract (>=2.0.1)
66
64
  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)
65
+ Requires-Dist: torch (>=2.7.0)
66
+ Requires-Dist: tqdm (>=4.67.1)
67
+ Requires-Dist: umap-learn (>=0.5.7)
68
+ Project-URL: Bug Tracker, https://github.com/rte-france/BERTrend/issues
69
+ Project-URL: Documentation, https://github.com/rte-france/BERTrend
70
+ Project-URL: Homepage, https://github.com/rte-france/BERTrend
70
71
  Project-URL: Repository, https://github.com/rte-france/BERTrend
71
72
  Description-Content-Type: text/markdown
72
73
 
@@ -78,7 +79,7 @@ Description-Content-Type: text/markdown
78
79
  [![issues - BERTrend](https://img.shields.io/github/issues/rte-france/BERTrend)](https://github.com/rte-france/BERTrend/issues)
79
80
  [![Downloads](https://pepy.tech/badge/bertrend)](https://pepy.tech/project/bertrend)
80
81
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
81
- [![PyPi_Compat](https://img.shields.io/pypi/pyversions/bertrend.svg)](https://pypi.org/project/bertrend/)
82
+ ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
82
83
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
83
84
 
84
85
  ![BERTrend pipeline](./BERTrend_overview.png)
@@ -137,7 +138,7 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
137
138
  - Categorization of signals into three different dataframes: noise, weak and strong signals
138
139
  (each dataframe contains useful information about the signals)
139
140
  - Interpretation of these signals using LLMs
140
- - Inspection of topic merging process using Sankey diagram
141
+ - Inspection of the topic merging process using Sankey diagram
141
142
 
142
143
  ## Installation
143
144
 
@@ -174,19 +175,14 @@ BERTrend requires the following environment variables to be set:
174
175
  # Basic installation with core dependencies
175
176
  pip install . # or poetry install
176
177
 
177
- # Installation with test dependencies
178
- pip install ".[tests]" # or poetry install --with test
178
+ # Installation with apps dependencies
179
+ pip install ".[apps]" # or poetry install --extras apps
179
180
 
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
181
  ```
186
182
 
187
183
  - (Use `pip install -e .` for a local installation)
188
184
 
189
- NB. Due to the number of dependencies, the installation may take some time on an empty environement.
185
+ NB. Due to the number of dependencies, the installation may take some time on an empty environment.
190
186
 
191
187
  ### Dependency Management
192
188
 
@@ -232,7 +228,7 @@ For custom dataset creation, please refer to the documentation page about [data
232
228
 
233
229
  In order to use the provided demos, datasets :
234
230
  - 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.
231
+ - or can be uploaded from the client device on which are displayed the Streamlit apps.
236
232
 
237
233
  #### Dataset Format
238
234
  Required columns:
@@ -259,6 +255,13 @@ CUDA_VISIBLE_DEVICES=<gpu_number> streamlit run app.py
259
255
  - `Parameters`: Include all BERTopic parameters. Choose the embedding model carefully based on your data language.
260
256
  The embedding model can run locally (a GPU is recommended); it is also possible to use a remote embedding service.
261
257
 
258
+ We recommend using a remote embedding service (this is now the default config) as it simplifies the computing.
259
+
260
+ The change of configuration can be done in: [services_default_config.toml](bertrend/config/services_default_config.toml).
261
+
262
+ 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)
263
+
264
+
262
265
  ![parameters](docs/images/parameters.png)
263
266
 
264
267
  Please refer to the [BERTopic documentation](https://maartengr.github.io/BERTopic/algorithm/algorithm.html) for parameter details.
@@ -277,7 +280,7 @@ The application is split into several pages:
277
280
  - Computes topics over time
278
281
  ![exploration_over_time](./docs/images/explore1.png)
279
282
 
280
- - Allow to select sources and generate short descriptions for each theme
283
+ - Allow selecting sources and generating short descriptions for each theme
281
284
  ![topic_exploration](./docs/images/explore2.png)
282
285
 
283
286
  - `Topic visualization`: Several visualization types available:
@@ -295,7 +298,7 @@ The application is split into several pages:
295
298
  ![temptopic_metrics](./docs/images/temptopic_metrics.png)
296
299
 
297
300
  - `Generate Newsletters`
298
- - This is an example of application combining topic analysis and LLMs
301
+ - This is an example of an application combining topic analysis and LLMs
299
302
  - Generates newsletters based on prominent topics
300
303
  - Uses LLMs to generate topic descriptions and summarize representative documents
301
304
 
@@ -344,8 +347,8 @@ Provides various statistics about topics:
344
347
  - As topics are hard to interprete by humans, we showcase how it can be
345
348
  done using LLMs.
346
349
  - 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)
350
+ - LLM-based in-depth signal analysis is done using predefined templates, for example:
351
+ - describe what's happened since the last timestamp (summary of main events)
349
352
  - present through a multi-faceted description info about key developments, foreseen changes, potential impact, etc.
350
353
 
351
354
 
@@ -373,7 +376,7 @@ See [AUTHORS](./AUTHORS.txt) for the full list of contributors.
373
376
 
374
377
  ## License Information
375
378
 
376
- Copyright 2023-2025 RTE France RTE: http://www.rte-france.com
379
+ Copyright 2023–2025 RTE France RTE: http://www.rte-france.com
377
380
 
378
381
  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
382
 
@@ -6,7 +6,7 @@
6
6
  [![issues - BERTrend](https://img.shields.io/github/issues/rte-france/BERTrend)](https://github.com/rte-france/BERTrend/issues)
7
7
  [![Downloads](https://pepy.tech/badge/bertrend)](https://pepy.tech/project/bertrend)
8
8
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
9
- [![PyPi_Compat](https://img.shields.io/pypi/pyversions/bertrend.svg)](https://pypi.org/project/bertrend/)
9
+ ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
10
10
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
11
11
 
12
12
  ![BERTrend pipeline](./BERTrend_overview.png)
@@ -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
 
@@ -11,6 +11,10 @@ import streamlit as st
11
11
  from streamlit.runtime.uploaded_file_manager import UploadedFile
12
12
 
13
13
  from bertrend import DATA_PATH
14
+ from bertrend.demos.demos_utils.i18n import (
15
+ translate,
16
+ get_current_internationalization_language,
17
+ )
14
18
  from bertrend.demos.demos_utils.icons import (
15
19
  WARNING_ICON,
16
20
  JSON_ICON,
@@ -20,7 +24,6 @@ from bertrend.demos.demos_utils.icons import (
20
24
  CLIENT_STORAGE_ICON,
21
25
  SERVER_STORAGE_ICON,
22
26
  )
23
- from bertrend.demos.demos_utils.messages import NO_DATA_AFTER_PREPROCESSING_MESSAGE
24
27
  from bertrend.demos.demos_utils.state_utils import (
25
28
  save_widget_state,
26
29
  register_widget,
@@ -33,9 +36,9 @@ from bertrend.utils.data_loading import (
33
36
  load_data,
34
37
  split_data,
35
38
  TIMESTAMP_COLUMN,
39
+ DataLoadingError,
36
40
  )
37
41
 
38
- NO_DATASET_WARNING = "Please select at least one dataset to proceed."
39
42
  FORMAT_ICONS = {
40
43
  "xlsx": XLSX_ICON,
41
44
  "csv": CSV_ICON,
@@ -47,6 +50,7 @@ FORMAT_ICONS = {
47
50
  }
48
51
 
49
52
 
53
+ @st.cache_data(ttl=60 * 60 * 24)
50
54
  def _process_uploaded_files(
51
55
  files: list[UploadedFile],
52
56
  ) -> list[pd.DataFrame]:
@@ -57,15 +61,25 @@ def _process_uploaded_files(
57
61
  with open(tmpdir + "/" + f.name, "wb") as tmp_file:
58
62
  tmp_file.write(f.getvalue())
59
63
  if tmp_file is not None:
60
- df = load_data(
61
- Path(tmp_file.name),
62
- SessionStateManager.get("language", "French"),
63
- )
64
+ try:
65
+ df = load_data(
66
+ Path(tmp_file.name),
67
+ SessionStateManager.get("language", "French"),
68
+ )
69
+ 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,
75
+ )
76
+ df = None
64
77
  if df is not None:
65
78
  dataframes.append(df)
66
79
  return dataframes
67
80
 
68
81
 
82
+ @st.cache_data(ttl=60 * 60 * 24)
69
83
  def _load_files(
70
84
  files: list[Path],
71
85
  ) -> list[pd.DataFrame]:
@@ -73,10 +87,19 @@ def _load_files(
73
87
  dfs = []
74
88
  for selected_file in files:
75
89
  file_path = DATA_PATH / selected_file
76
- df = load_data(
77
- file_path,
78
- SessionStateManager.get("language", "French"),
79
- )
90
+ try:
91
+ df = load_data(
92
+ file_path,
93
+ SessionStateManager.get("language", "French"),
94
+ )
95
+ except DataLoadingError as dle:
96
+ st.warning(
97
+ translate("error_loading_file").format(
98
+ file_name=file_path.name, error=dle
99
+ ),
100
+ icon=WARNING_ICON,
101
+ )
102
+ df = None
80
103
  if df is not None:
81
104
  dfs.append(df)
82
105
  return dfs
@@ -85,7 +108,7 @@ def _load_files(
85
108
  # TODO: if loaded data column names do not match our default values, show a popup for column data mapping
86
109
  def display_data_loading_component():
87
110
  """
88
- Component for a streamlit app about topic modelling. It allows to choose data to load and preprocess data.
111
+ Component for a streamlit app about topic modeling. It allows choosing data to load and preprocess data.
89
112
  Preprocessing of data includes:
90
113
  - concatenation of data from different files
91
114
  - adding potentially missing columns to make all datasets homogeneous
@@ -100,23 +123,23 @@ def display_data_loading_component():
100
123
  state variable "time_filtered_df".
101
124
  """
102
125
  # Data loading section
103
- st.header("Data loading")
126
+ st.header(translate("data_loading"))
104
127
 
105
128
  # Find files in the current directory and subdirectories
106
129
  tab1, tab2 = st.tabs(
107
130
  [
108
- CLIENT_STORAGE_ICON + " Data from local storage",
109
- SERVER_STORAGE_ICON + " Data from server data",
131
+ CLIENT_STORAGE_ICON + " " + translate("local_data"),
132
+ SERVER_STORAGE_ICON + " " + translate("remote_data"),
110
133
  ]
111
134
  )
112
135
  compatible_extensions = FORMAT_ICONS.keys()
113
136
 
114
137
  with tab1:
115
138
  st.file_uploader(
116
- label="Select dataset from local storage (.xlsx, .csv, .json, .jsonl, .parquet)",
139
+ label=translate("select_from_local_storage"),
117
140
  type=compatible_extensions,
118
141
  accept_multiple_files=True,
119
- help="Drag and drop files to be used as dataset in this area",
142
+ help=translate("drag_drop_help"),
120
143
  on_change=save_widget_state,
121
144
  key="uploaded_files",
122
145
  )
@@ -124,7 +147,7 @@ def display_data_loading_component():
124
147
  with tab2:
125
148
  register_widget("selected_files")
126
149
  st.multiselect(
127
- label="Select one or more datasets from the server data",
150
+ label=translate("select_from_remote_storage"),
128
151
  options=find_compatible_files(DATA_PATH, compatible_extensions),
129
152
  default=SessionStateManager.get("selected_files", []),
130
153
  key="selected_files",
@@ -137,7 +160,7 @@ def display_data_loading_component():
137
160
  and not SessionStateManager.get("selected_files")
138
161
  and "initial_df" not in st.session_state
139
162
  ):
140
- st.warning(NO_DATASET_WARNING, icon=WARNING_ICON)
163
+ st.warning(translate("no_dataset_warning"), icon=WARNING_ICON)
141
164
  st.stop()
142
165
 
143
166
  # Load each selected file, then concatenate them
@@ -159,10 +182,10 @@ def display_data_loading_component():
159
182
 
160
183
  # Save state of initial DF (before split and data selection)
161
184
  st.session_state["initial_df"] = df.copy()
162
- # If dfs is None and there is no 'initial_df' in session_state, show warining
185
+ # If dfs is None and there is no 'initial_df' in session_state, show a warning
163
186
  elif "initial_df" not in st.session_state:
164
187
  st.warning(
165
- NO_DATA_AFTER_PREPROCESSING_MESSAGE,
188
+ translate("no_data_after_preprocessing_message"),
166
189
  icon=WARNING_ICON,
167
190
  )
168
191
  st.stop()
@@ -172,54 +195,69 @@ def display_data_loading_component():
172
195
 
173
196
  # Show raw data info
174
197
  st.write(
175
- f"Number of documents in raw data: **{len(st.session_state['initial_df'])}**"
198
+ translate("raw_documents_count").format(
199
+ count=len(st.session_state["initial_df"])
200
+ )
176
201
  )
177
202
 
178
203
  # Data filtering section
179
- st.header("Data filtering")
204
+ st.header(translate("data_filtering"))
180
205
 
181
206
  # Display number input and checkbox for preprocessing options
182
207
  col1, col2, col3 = st.columns(3)
183
208
  with col1:
184
209
  register_widget("min_chars")
185
210
  st.number_input(
186
- "Minimum Characters",
211
+ translate("minimum_characters"),
187
212
  value=MIN_CHARS_DEFAULT,
188
213
  min_value=0,
189
214
  max_value=1000,
190
215
  key="min_chars",
191
216
  on_change=save_widget_state,
192
- help="Minimum number of characters each document must contain.",
217
+ help=translate("minimum_characters_help"),
193
218
  )
194
219
  with col2:
195
220
  register_widget("sample_size")
196
221
  sample_size = st.number_input(
197
- "Sample ratio",
222
+ translate("sample_ratio"),
198
223
  value=SAMPLE_SIZE_DEFAULT,
199
224
  min_value=0.0,
200
225
  max_value=1.0,
201
226
  key="sample_size",
202
227
  on_change=save_widget_state,
203
- help="Fraction of raw data to use for computing topics. Randomly samples documents from raw data.",
228
+ help=translate("sample_ratio_help"),
204
229
  )
205
230
  with col3:
206
231
  register_widget("split_by_paragraph")
207
232
  SessionStateManager.get_or_set("split_by_paragraph", "no")
208
233
  st.segmented_control(
209
- "Split text by paragraphs",
234
+ translate("split_by_paragraph"),
210
235
  key="split_by_paragraph",
211
- options=["no", "yes", "enhanced"],
236
+ options=["yes", "no", "enhanced"],
212
237
  selection_mode="single",
213
- help="'No split': No splitting on the documents ; 'Split by paragraphs': Split documents into paragraphs ; "
214
- "'Enhanced split': uses a more advanced but slower method for splitting that considers the embedding "
215
- "model's maximum input length.",
238
+ help=translate("split_help"),
216
239
  on_change=save_widget_state,
240
+ format_func=lambda x: translate("split_option_" + x),
241
+ )
242
+
243
+ if get_current_internationalization_language() == "en":
244
+ split_by_paragraph_param = SessionStateManager.get("split_by_paragraph")
245
+ else:
246
+ # option has been translated
247
+ split_by_paragraph_param = (
248
+ "no"
249
+ if SessionStateManager.get("split_by_paragraph") == "non"
250
+ else (
251
+ "enhanced"
252
+ if SessionStateManager.get("split_by_paragraph") == "amélioré"
253
+ else "yes"
254
+ )
217
255
  )
218
256
 
219
257
  df = split_data(
220
- df,
221
- SessionStateManager.get("min_chars"),
222
- SessionStateManager.get("split_by_paragraph"),
258
+ df=df,
259
+ min_chars=SessionStateManager.get("min_chars"),
260
+ split_by_paragraph=SessionStateManager.get("split_by_paragraph"),
223
261
  embedding_model_name=SessionStateManager.get("embedding_model_name"),
224
262
  )
225
263
 
@@ -235,7 +273,7 @@ def display_data_loading_component():
235
273
  )
236
274
  register_widget("timeframe_slider")
237
275
  start_date, end_date = st.slider(
238
- "Select Timeframe",
276
+ translate("select_timeframe"),
239
277
  min_value=min_date,
240
278
  max_value=max_date,
241
279
  value=(min_date, max_date),
@@ -257,7 +295,9 @@ def display_data_loading_component():
257
295
 
258
296
  SessionStateManager.set("time_filtered_df", df_filtered)
259
297
  st.write(
260
- f"Number of documents in filtered data: **{len(SessionStateManager.get_dataframe('time_filtered_df'))}**"
298
+ translate("filtered_documents_count").format(
299
+ count=len(SessionStateManager.get_dataframe("time_filtered_df"))
300
+ )
261
301
  )
262
302
  st.dataframe(
263
303
  SessionStateManager.get_dataframe("time_filtered_df")[
@@ -4,8 +4,8 @@
4
4
  # This file is part of BERTrend.
5
5
  import streamlit as st
6
6
 
7
+ from bertrend.demos.demos_utils.i18n import translate
7
8
  from bertrend.demos.demos_utils.icons import SUCCESS_ICON
8
- from bertrend.demos.demos_utils.messages import EMBEDDINGS_CALCULATED_MESSAGE
9
9
  from bertrend.demos.demos_utils.state_utils import SessionStateManager
10
10
  from bertrend.services.embedding_service import EmbeddingService
11
11
  from bertrend.utils.data_loading import TEXT_COLUMN
@@ -16,8 +16,8 @@ def display_embed_documents_component():
16
16
  Common Streamlit UI component for embedding documents.
17
17
  """
18
18
  # Embed documents
19
- if st.button("Embed Documents"):
20
- with st.spinner("Embedding documents..."):
19
+ if st.button(translate("embed_documents")):
20
+ with st.spinner(translate("embedding_documents")):
21
21
  embedding_dtype = SessionStateManager.get("embedding_dtype")
22
22
  embedding_model_name = SessionStateManager.get("embedding_model_name")
23
23
  if SessionStateManager.get("embedding_service_type", "remote") == "local":
@@ -49,4 +49,4 @@ def display_embed_documents_component():
49
49
 
50
50
  SessionStateManager.set("data_embedded", True)
51
51
 
52
- st.success(EMBEDDINGS_CALCULATED_MESSAGE, icon=SUCCESS_ICON)
52
+ st.success(translate("embeddings_calculated_message"), icon=SUCCESS_ICON)