bertrend 0.3.3__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 (188) hide show
  1. {bertrend-0.3.3 → bertrend-0.3.4}/PKG-INFO +3 -2
  2. {bertrend-0.3.3 → bertrend-0.3.4}/README.md +1 -1
  3. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/demos_utils/data_loading_component.py +76 -36
  4. {bertrend-0.3.3 → 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.3 → bertrend-0.3.4}/bertrend/demos/demos_utils/parameters_component.py +10 -10
  8. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app.py +16 -9
  9. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +34 -35
  10. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +14 -13
  11. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +62 -54
  12. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +13 -13
  13. {bertrend-0.3.3 → 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.3 → 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.3 → bertrend-0.3.4}/bertrend/demos/weak_signals/visualizations_utils.py +37 -31
  18. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/embedding_client.py +1 -1
  19. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/utils/data_loading.py +28 -2
  20. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/__main__.py +3 -3
  21. bertrend-0.3.3/bertrend_apps/data_provider/curebot_provider.py → bertrend-0.3.4/bertrend_apps/data_provider/atom_feed_provider.py +1 -1
  22. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +15 -8
  23. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/old_veille_analyse.py +3 -3
  24. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/app.py +8 -4
  25. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_analysis.py +10 -6
  26. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_common.py +6 -7
  27. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/dashboard_signals.py +6 -4
  28. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_config.py +7 -7
  29. bertrend-0.3.3/bertrend_apps/prospective_demo/i18n.py → bertrend-0.3.4/bertrend_apps/prospective_demo/i18n_translations.py +23 -68
  30. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/process_new_data.py +20 -2
  31. {bertrend-0.3.3 → bertrend-0.3.4}/pyproject.toml +2 -1
  32. bertrend-0.3.3/bertrend/demos/demos_utils/messages.py +0 -11
  33. bertrend-0.3.3/bertrend/demos/topic_analysis/messages.py +0 -13
  34. bertrend-0.3.3/bertrend/demos/weak_signals/messages.py +0 -32
  35. {bertrend-0.3.3 → bertrend-0.3.4}/AUTHORS.txt +0 -0
  36. {bertrend-0.3.3 → bertrend-0.3.4}/LICENSE.md +0 -0
  37. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/BERTopicModel.py +0 -0
  38. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/BERTrend.py +0 -0
  39. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/__init__.py +0 -0
  40. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/config/bertopic_default_config.toml +0 -0
  41. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/config/bertrend_default_config.toml +0 -0
  42. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/config/parameters.py +0 -0
  43. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/config/services_default_config.toml +0 -0
  44. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/__init__.py +0 -0
  45. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/demos_utils/__init__.py +0 -0
  46. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/demos_utils/icons.py +0 -0
  47. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/demos_utils/state_utils.py +0 -0
  48. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/start_summarizer_app.sh +0 -0
  49. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  50. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/start_weak_signals_app.sh +0 -0
  51. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/summarization/__init__.py +0 -0
  52. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/summarization/summarizer_app.py +0 -0
  53. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/__init__.py +0 -0
  54. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  55. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  56. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/demos/weak_signals/__init__.py +0 -0
  57. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/llm_utils/__init__.py +0 -0
  58. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/llm_utils/newsletter.css +0 -0
  59. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/llm_utils/newsletter_features.py +0 -0
  60. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/llm_utils/openai_client.py +0 -0
  61. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/llm_utils/prompts.py +0 -0
  62. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/metrics/__init__.py +0 -0
  63. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  64. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/metrics/topic_metrics.py +0 -0
  65. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/resources/common_ngrams.json +0 -0
  66. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/resources/stopwords-en.json +0 -0
  67. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/resources/stopwords-fr.json +0 -0
  68. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/resources/stopwords-rte.json +0 -0
  69. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/__init__.py +0 -0
  70. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/authentication.py +0 -0
  71. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/embedding_service.py +0 -0
  72. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summarizer.py +0 -0
  73. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/__init__.py +0 -0
  74. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  75. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  76. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/extractive_summarizer.py +0 -0
  77. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/lexrank.py +0 -0
  78. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/services/summary/prompts.py +0 -0
  79. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/README_integration_tests.md +0 -0
  80. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/__init__.py +0 -0
  81. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/conftest.py +0 -0
  82. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_abstractive_summarizer.py +0 -0
  83. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_bertrend.py +0 -0
  84. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_cache_utils.py +0 -0
  85. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_chatgpt_summarizer.py +0 -0
  86. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_config_utils.py +0 -0
  87. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_data_loading.py +0 -0
  88. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_data_structure.py +0 -0
  89. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_embedding_client.py +0 -0
  90. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_extractive_summarizer.py +0 -0
  91. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_installation.py +0 -0
  92. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_integration.py +0 -0
  93. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_newsletter_features.py +0 -0
  94. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_openai_client.py +0 -0
  95. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_representative_docs.py +0 -0
  96. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_summarizer.py +0 -0
  97. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  98. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_topic_description.py +0 -0
  99. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_topic_metrics.py +0 -0
  100. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_topic_model.py +0 -0
  101. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  102. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  103. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  104. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  105. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_utils_init.py +0 -0
  106. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/tests/test_visualizations.py +0 -0
  107. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/__init__.py +0 -0
  108. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/data_structure.py +0 -0
  109. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/prompts.py +0 -0
  110. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/representative_docs.py +0 -0
  111. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/topic_description.py +0 -0
  112. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/topic_analysis/visualizations.py +0 -0
  113. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/__init__.py +0 -0
  114. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/data_structure.py +0 -0
  115. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/prompts.py +0 -0
  116. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  117. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  118. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/visualizations.py +0 -0
  119. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/trend_analysis/weak_signals.py +0 -0
  120. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/utils/__init__.py +0 -0
  121. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/utils/cache_utils.py +0 -0
  122. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend/utils/config_utils.py +0 -0
  123. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/__init__.py +0 -0
  124. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/common/__init__.py +0 -0
  125. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/common/crontab_utils.py +0 -0
  126. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/common/mail_utils.py +0 -0
  127. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  128. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  129. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  130. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  131. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  132. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  133. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/gmail_credentials.json +0 -0
  134. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  135. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/arxiv_newsletter_from_scratch.toml +0 -0
  136. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  137. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  138. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  139. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  140. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  141. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  142. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  143. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/__init__.py +0 -0
  144. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  145. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  146. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/data_provider.py +0 -0
  147. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  148. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  149. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/data_provider/utils.py +0 -0
  150. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/__init__.py +0 -0
  151. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  152. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app.py +0 -0
  153. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  154. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/config.toml +0 -0
  155. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  156. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  157. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  158. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  159. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
  160. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  161. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  162. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  163. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  164. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  165. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  166. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  167. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  168. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  169. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/exploration/geolocalization/spacy/utils.py +0 -0
  170. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  171. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/newsletters/__init__.py +0 -0
  172. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/newsletters/__main__.py +0 -0
  173. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  174. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  175. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/__init__.py +0 -0
  176. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/authentication.py +0 -0
  177. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  178. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  179. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  180. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/models_info.py +0 -0
  181. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  182. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_generation.py +0 -0
  183. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_template.html +0 -0
  184. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/report_utils.py +0 -0
  185. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  186. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/prospective_demo/streamlit_utils.py +0 -0
  187. {bertrend-0.3.3 → bertrend-0.3.4}/bertrend_apps/start_apps.sh +0 -0
  188. {bertrend-0.3.3 → bertrend-0.3.4}/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.3
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
5
  License: LICENSE.md
6
6
  Keywords: topics,BERTopic,transformers,weak signals,LLM
@@ -41,6 +41,7 @@ Requires-Dist: newspaper4k (>=0.9.3.1) ; extra == "apps"
41
41
  Requires-Dist: nltk (>=3.9.1)
42
42
  Requires-Dist: numpy (<2)
43
43
  Requires-Dist: openai (>=1.77.0)
44
+ Requires-Dist: openpyxl (>=3.1.5)
44
45
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
45
46
  Requires-Dist: pandas (>=2.2.2)
46
47
  Requires-Dist: plotly (>=5.24.1)
@@ -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)
@@ -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)
@@ -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)
@@ -0,0 +1,95 @@
1
+ """
2
+ Internationalization (i18n) module for the prospective demo application.
3
+ Provides functionality for translating text between French and English.
4
+ """
5
+
6
+ # Copyright (c) 2024, RTE (https://www.rte-france.com)
7
+ # See AUTHORS.txt
8
+ # SPDX-License-Identifier: MPL-2.0
9
+ # This file is part of BERTrend.
10
+
11
+ import streamlit as st
12
+ from typing import Optional
13
+
14
+ from bertrend_apps.prospective_demo.i18n_translations import (
15
+ TRANSLATIONS as PROSPECTIVE_TRANSLATIONS,
16
+ )
17
+ from bertrend.demos.topic_analysis.i18n_translations import (
18
+ TRANSLATIONS as TOPIC_ANALYSIS_TRANSLATIONS,
19
+ )
20
+ from bertrend.demos.demos_utils.i18n_translations import (
21
+ TRANSLATIONS as DEMOS_UTILS_TRANSLATIONS,
22
+ )
23
+ from bertrend.demos.weak_signals.i18n_translations import (
24
+ TRANSLATIONS as WEAK_SIGNALS_TRANSLATIONS,
25
+ )
26
+
27
+ # Merge all translations
28
+ TRANSLATIONS = {
29
+ **PROSPECTIVE_TRANSLATIONS,
30
+ **TOPIC_ANALYSIS_TRANSLATIONS,
31
+ **DEMOS_UTILS_TRANSLATIONS,
32
+ **WEAK_SIGNALS_TRANSLATIONS,
33
+ }
34
+
35
+ # Available languages
36
+ LANGUAGES = {"fr": "Français", "en": "English"}
37
+
38
+ # Default language
39
+ DEFAULT_LANGUAGE = "en"
40
+
41
+
42
+ def set_default_internationalization_language(language: str) -> None:
43
+ """Set the default language for the application."""
44
+ global DEFAULT_LANGUAGE
45
+ DEFAULT_LANGUAGE = language
46
+
47
+
48
+ def get_current_internationalization_language() -> str:
49
+ """Get the currently selected language from the session state."""
50
+ if "internationalization_language" not in st.session_state:
51
+ st.session_state.internationalization_language = DEFAULT_LANGUAGE
52
+ return st.session_state.internationalization_language
53
+
54
+
55
+ def set_internationalization_language(language: str) -> None:
56
+ """Set the current language in the session state."""
57
+ if language in LANGUAGES:
58
+ st.session_state.internationalization_language = language
59
+
60
+
61
+ def create_internationalization_language_selector() -> None:
62
+ """Create a language selector widget in the sidebar."""
63
+ current_lang = get_current_internationalization_language()
64
+ selected_lang = st.sidebar.selectbox(
65
+ "Language / Langue",
66
+ options=list(LANGUAGES.keys()),
67
+ format_func=lambda x: LANGUAGES[x],
68
+ index=list(LANGUAGES.keys()).index(current_lang),
69
+ )
70
+
71
+ if selected_lang != current_lang:
72
+ set_internationalization_language(selected_lang)
73
+ st.rerun()
74
+
75
+
76
+ def translate(key: str, default: Optional[str] = None) -> str:
77
+ """
78
+ Translate a text key to the current language.
79
+
80
+ Args:
81
+ key: The translation key to look up
82
+ default: Default text to return if the key is not found
83
+
84
+ Returns:
85
+ The translated text in the current language
86
+ """
87
+ lang = get_current_internationalization_language()
88
+
89
+ if key in TRANSLATIONS and lang in TRANSLATIONS[key]:
90
+ return TRANSLATIONS[key][lang]
91
+
92
+ # If the key doesn't exist, or the language is not available for this key
93
+ if default:
94
+ return default
95
+ return key # Return the key itself as fallback
@@ -0,0 +1,140 @@
1
+ # Copyright (c) 2024, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ # Translation dictionaries for demos_utils
7
+ TRANSLATIONS = {
8
+ "ctrl_enter": {
9
+ "fr": "CTRL + Entrée pour mettre à jour",
10
+ "en": "CTRL + Enter to update",
11
+ },
12
+ "select_language": {"fr": "Choisir une langue", "en": "Select Language"},
13
+ "embedding_model": {"fr": "Modèle d'embedding", "en": "Embedding Model"},
14
+ "embedding_service_url": {
15
+ "fr": "URL du service d'embedding",
16
+ "en": "Embedding service URL",
17
+ },
18
+ "embedding_hyperparameters": {
19
+ "fr": "Paramètres d'embedding",
20
+ "en": "Embedding settings",
21
+ },
22
+ "embedding_service": {
23
+ "fr": "Service d'embedding",
24
+ "en": "Embedding Service",
25
+ },
26
+ "bertopic_hyperparameters": {
27
+ "fr": "Hyperparamètres BERTopic",
28
+ "en": "BERTopic Hyperparameters",
29
+ },
30
+ "bertrend_hyperparameters": {
31
+ "fr": "Hyperparamètres BERTrend",
32
+ "en": "BERTrend Hyperparameters",
33
+ },
34
+ "embeddings_calculated_message": {
35
+ "fr": "Embeddings calculés avec succès !",
36
+ "en": "Embeddings calculated successfully!",
37
+ },
38
+ "no_embeddings_warning_message": {
39
+ "fr": "Veuillez vectoriser les données et entraîner les modèles avant de procéder à l'analyse.",
40
+ "en": "Please embed data and train models before proceeding to analysis.",
41
+ },
42
+ "model_training_complete_message": {
43
+ "fr": "Entraînement du modèle terminé !",
44
+ "en": "Model training complete!",
45
+ },
46
+ "no_data_after_preprocessing_message": {
47
+ "fr": "Aucune donnée disponible après prétraitement. Veuillez vérifier les fichiers sélectionnés et les options de prétraitement.",
48
+ "en": "No data available after preprocessing. Please check the selected files and preprocessing options.",
49
+ },
50
+ "select_from_local_storage": {
51
+ "fr": "Selection de jeux de données à partir du stockage local (.xlsx, .csv, .json, .jsonl, .parquet)",
52
+ "en": "Select dataset from local storage (.xlsx, .csv, .json, .jsonl, .parquet)",
53
+ },
54
+ "select_from_remote_storage": {
55
+ "fr": "Selection de jeux de données sur le serveur",
56
+ "en": "Select one or more datasets from the server data",
57
+ },
58
+ "data_loading": {
59
+ "fr": "Chargement des données",
60
+ "en": "Data loading",
61
+ },
62
+ "local_data": {
63
+ "fr": "Données locales",
64
+ "en": "Data from local storage",
65
+ },
66
+ "remote_data": {"fr": "Données sur le serveur", "en": "Data from server"},
67
+ "data_filtering": {"fr": "Filtrage des données", "en": "Data filtering"},
68
+ "embed_documents": {
69
+ "fr": "Vectoriser les documents",
70
+ "en": "Embed Documents",
71
+ },
72
+ "embedding_documents": {
73
+ "fr": "Vectorisation des documents...",
74
+ "en": "Embedding documents...",
75
+ },
76
+ "no_dataset_warning": {
77
+ "fr": "Veuillez sélectionner au moins un jeu de données pour continuer.",
78
+ "en": "Please select at least one dataset to proceed.",
79
+ },
80
+ "error_loading_file": {
81
+ "fr": "Erreur lors du chargement du fichier '{file_name}': {error}",
82
+ "en": "Error while loading file '{file_name}': {error}",
83
+ },
84
+ "drag_drop_help": {
85
+ "fr": "Glissez et déposez les fichiers à utiliser comme jeu de données dans cette zone",
86
+ "en": "Drag and drop files to be used as dataset in this area",
87
+ },
88
+ "raw_documents_count": {
89
+ "fr": "Nombre de documents dans les données brutes: **{count}**",
90
+ "en": "Number of documents in raw data: **{count}**",
91
+ },
92
+ "minimum_characters": {
93
+ "fr": "Nombre minimum de caractères",
94
+ "en": "Minimum Characters",
95
+ },
96
+ "minimum_characters_help": {
97
+ "fr": "Nombre minimum de caractères que chaque document doit contenir.",
98
+ "en": "Minimum number of characters each document must contain.",
99
+ },
100
+ "sample_ratio": {
101
+ "fr": "Ratio d'échantillonnage",
102
+ "en": "Sample ratio",
103
+ },
104
+ "sample_ratio_help": {
105
+ "fr": "Fraction des données brutes à utiliser pour calculer les sujets. Échantillonne aléatoirement les documents à partir des données brutes.",
106
+ "en": "Fraction of raw data to use for computing topics. Randomly samples documents from raw data.",
107
+ },
108
+ "split_by_paragraphs": {
109
+ "fr": "Diviser le texte par paragraphes",
110
+ "en": "Split text by paragraphs",
111
+ },
112
+ "split_option_yes": {
113
+ "fr": "oui",
114
+ "en": "yes",
115
+ },
116
+ "split_option_no": {
117
+ "fr": "non",
118
+ "en": "no",
119
+ },
120
+ "split_option_enhanced": {
121
+ "fr": "amélioré",
122
+ "en": "enhanced",
123
+ },
124
+ "split_help": {
125
+ "fr": "'Pas de division': Pas de division sur les documents ; 'Division par paragraphes': Divise les documents en paragraphes ; 'Division améliorée': utilise une méthode plus avancée mais plus lente pour la division qui prend en compte la longueur d'entrée maximale du modèle d'embedding.",
126
+ "en": "'No split': No splitting on the documents ; 'Split by paragraphs': Split documents into paragraphs ; 'Enhanced split': uses a more advanced but slower method for splitting that considers the embedding model's maximum input length.",
127
+ },
128
+ "select_timeframe": {
129
+ "fr": "Sélectionner la période",
130
+ "en": "Select Timeframe",
131
+ },
132
+ "filtered_documents_count": {
133
+ "fr": "Nombre de documents dans les données filtrées: **{count}**",
134
+ "en": "Number of documents in filtered data: **{count}**",
135
+ },
136
+ "settings_and_controls": {
137
+ "fr": "Paramètres et contrôles",
138
+ "en": "Settings and Controls",
139
+ },
140
+ }
@@ -12,10 +12,10 @@ from bertrend import (
12
12
  EMBEDDING_CONFIG,
13
13
  load_toml_config,
14
14
  )
15
+ from bertrend.demos.demos_utils.i18n import translate
15
16
  from bertrend.demos.demos_utils.state_utils import (
16
17
  register_widget,
17
18
  save_widget_state,
18
- SessionStateManager,
19
19
  register_multiple_widget,
20
20
  reset_widget_state,
21
21
  )
@@ -32,11 +32,11 @@ from bertrend.demos.demos_utils.icons import INFO_ICON
32
32
 
33
33
 
34
34
  def display_local_embeddings():
35
- """UI settings for local embedding service"""
35
+ """UI settings for the local embedding service"""
36
36
  register_multiple_widget("language", "embedding_dtype", "embedding_model_name")
37
37
 
38
38
  language = st.selectbox(
39
- "Select Language",
39
+ translate("select_language"),
40
40
  LANGUAGES,
41
41
  key="language",
42
42
  on_change=_on_language_change,
@@ -51,7 +51,7 @@ def display_local_embeddings():
51
51
  ENGLISH_EMBEDDING_MODELS if language == "English" else FRENCH_EMBEDDING_MODELS
52
52
  )
53
53
  st.selectbox(
54
- "Embedding Model",
54
+ translate("embedding_model"),
55
55
  options=embedding_models,
56
56
  key="embedding_model_name",
57
57
  on_change=save_widget_state,
@@ -71,7 +71,7 @@ def display_remote_embeddings():
71
71
  if "embedding_service_url" not in st.session_state:
72
72
  st.session_state["embedding_service_url"] = EMBEDDING_CONFIG["url"]
73
73
  st.text_input(
74
- "Embedding service URL",
74
+ translate("embedding_service_url"),
75
75
  key="embedding_service_url",
76
76
  on_change=save_widget_state,
77
77
  )
@@ -80,12 +80,12 @@ def display_remote_embeddings():
80
80
  def display_embedding_hyperparameters():
81
81
  """UI settings for embedding hyperparameters"""
82
82
  # Embedding model parameters
83
- with st.expander("Embedding Model Settings", expanded=False):
83
+ with st.expander(translate("embedding_hyperparameters"), expanded=False):
84
84
  register_widget("embedding_service_type")
85
85
  if "embedding_service_type" not in st.session_state:
86
86
  st.session_state["embedding_service_type"] = "remote"
87
87
  st.segmented_control(
88
- "Embedding service",
88
+ translate("embedding_service"),
89
89
  selection_mode="single",
90
90
  key="embedding_service_type",
91
91
  options=["local", "remote"],
@@ -99,7 +99,7 @@ def display_embedding_hyperparameters():
99
99
 
100
100
  def display_bertopic_hyperparameters():
101
101
  # BERTopic model parameters
102
- with st.expander("BERTopic Model Settings", expanded=False):
102
+ with st.expander(translate("bertopic_hyperparameters"), expanded=False):
103
103
  # If BERTopic config is already in session state, use it
104
104
  if "bertopic_config" in st.session_state:
105
105
  toml_txt = st.session_state["bertopic_config"]
@@ -126,14 +126,14 @@ def display_bertopic_hyperparameters():
126
126
 
127
127
  def display_bertrend_hyperparameters():
128
128
  """UI settings for Bertrend hyperparameters"""
129
- with st.expander("BERTrend Model Settings", expanded=False):
129
+ with st.expander(translate("bertrend_hyperparameters"), expanded=False):
130
130
  # Get BERTrend default configuration
131
131
  with open(BERTREND_DEFAULT_CONFIG_PATH, "r") as f:
132
132
  # Load default parameter the first time
133
133
  toml_txt = f.read()
134
134
 
135
135
  # Add code editor to edit the config file
136
- st.write(INFO_ICON + " CTRL + Enter to update")
136
+ st.write(INFO_ICON + " CTRL + " + translate("ctrl_enter"))
137
137
  config_editor = code_editor(toml_txt, lang="toml")
138
138
 
139
139
  # If code is edited, update config