Demosthene-OR commited on
Commit
40a3d50
1 Parent(s): 3d78a2b
Files changed (33) hide show
  1. Dockerfile +2 -2
  2. Dockerfile_full +0 -27
  3. data/dl_id_lang_split/dl_tiktoken_id_language_model_big_1.h5 +3 -0
  4. data/dl_id_lang_split/dl_tiktoken_id_language_model_big_2.h5 +3 -0
  5. data/dl_id_lang_split/dl_tiktoken_id_language_model_big_3.h5 +3 -0
  6. data/dl_id_lang_split/dl_tiktoken_id_language_model_big_4.h5 +3 -0
  7. data/dl_id_lang_split/manifest +5 -0
  8. data/rnn_en-fr_split/manifest +6 -0
  9. data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_1.h5 +3 -0
  10. data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_2.h5 +3 -0
  11. data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_3.h5 +3 -0
  12. data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_4.h5 +3 -0
  13. data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_5.h5 +3 -0
  14. data/rnn_fr-en_split/manifest +6 -0
  15. data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_1.h5 +3 -0
  16. data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_2.h5 +3 -0
  17. data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_3.h5 +3 -0
  18. data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_4.h5 +3 -0
  19. data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_5.h5 +3 -0
  20. data/transf_en-fr_weight_split/manifest +4 -0
  21. data/transf_en-fr_weight_split/transformer-model-en-fr.weights_1.h5 +3 -0
  22. data/transf_en-fr_weight_split/transformer-model-en-fr.weights_2.h5 +3 -0
  23. data/transf_en-fr_weight_split/transformer-model-en-fr.weights_3.h5 +3 -0
  24. data/transf_fr-en_weight_split/manifest +4 -0
  25. data/transf_fr-en_weight_split/transformer-model-fr-en.weights_1.h5 +3 -0
  26. data/transf_fr-en_weight_split/transformer-model-fr-en.weights_2.h5 +3 -0
  27. data/transf_fr-en_weight_split/transformer-model-fr-en.weights_3.h5 +3 -0
  28. data/transformer-model-en-fr.h5 +3 -0
  29. data/transformer-model-fr-en.h5 +3 -0
  30. main_dl.py +591 -0
  31. questions.csv +0 -78
  32. requirements.txt +5 -0
  33. requirements_save.txt +21 -0
Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
  # Use the official Python 3.9 image
2
- FROM python:3.8
3
 
4
  # Set the working directory to /code
5
  WORKDIR /code
@@ -24,4 +24,4 @@ WORKDIR $HOME/app
24
  # Copy the current directory contents into the container at $HOME/app setting the owner to the user
25
  COPY --chown=user . $HOME/app
26
 
27
- CMD ["uvicorn", "main:api", "--host", "0.0.0.0", "--port", "7860"]
 
1
  # Use the official Python 3.9 image
2
+ FROM python:3.10
3
 
4
  # Set the working directory to /code
5
  WORKDIR /code
 
24
  # Copy the current directory contents into the container at $HOME/app setting the owner to the user
25
  COPY --chown=user . $HOME/app
26
 
27
+ CMD ["uvicorn", "main_dl:api", "--host", "0.0.0.0", "--port", "7860"]
Dockerfile_full DELETED
@@ -1,27 +0,0 @@
1
- # Use the official Python 3.9 image
2
- FROM python:3.8
3
-
4
- # Set the working directory to /code
5
- WORKDIR /code
6
-
7
- # Copy the current directory contents into the container at /code
8
- COPY ./requirements.txt /code/requirements.txt
9
-
10
- # Install requirements.txt
11
- RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
12
-
13
- # Set up a new user named "user" with user ID 1000
14
- RUN useradd -m -u 1000 user
15
- # Switch to the "user" user
16
- USER user
17
- # Set home to the user's home directory
18
- ENV HOME=/home/user \
19
- PATH=/home/user/.local/bin:$PATH
20
-
21
- # Set the working directory to the user's home directory
22
- WORKDIR $HOME/app
23
-
24
- # Copy the current directory contents into the container at $HOME/app setting the owner to the user
25
- COPY --chown=user . $HOME/app
26
-
27
- CMD ["uvicorn", "main:api", "--host", "0.0.0.0", "--port", "7860"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
data/dl_id_lang_split/dl_tiktoken_id_language_model_big_1.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ddcd79956268d67eb577f260375d17f43ba46407b4040168f69575156126dd99
3
+ size 66000000
data/dl_id_lang_split/dl_tiktoken_id_language_model_big_2.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e6c6a1c16c97eab1f0c2c01790e2e999a9ae8932f46f14edd1621a24d3cbf514
3
+ size 66000000
data/dl_id_lang_split/dl_tiktoken_id_language_model_big_3.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:376148ae36d512c3d13021782169c372cd5c7705c174f2c1eda6fb2682942474
3
+ size 66000000
data/dl_id_lang_split/dl_tiktoken_id_language_model_big_4.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ac73bd9690a45d2029cc1f7d3d52455afde4aa33c06783c49f9d23d3a49e154
3
+ size 45123468
data/dl_id_lang_split/manifest ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ filename,filesize,header
2
+ dl_tiktoken_id_language_model_big_1.h5,66000000,False
3
+ dl_tiktoken_id_language_model_big_2.h5,66000000,False
4
+ dl_tiktoken_id_language_model_big_3.h5,66000000,False
5
+ dl_tiktoken_id_language_model_big_4.h5,45123468,False
data/rnn_en-fr_split/manifest ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ filename,filesize,header
2
+ seq2seq_rnn-model-en-fr_1.h5,66000000,False
3
+ seq2seq_rnn-model-en-fr_2.h5,66000000,False
4
+ seq2seq_rnn-model-en-fr_3.h5,66000000,False
5
+ seq2seq_rnn-model-en-fr_4.h5,66000000,False
6
+ seq2seq_rnn-model-en-fr_5.h5,15028184,False
data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_1.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:604a8d976c5dfbf08504fff52a2f3b49097f2b2bc4871c0115626501be0f1fe3
3
+ size 66000000
data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_2.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e7b6d0a71a6f8184339c61624d4eb966c736b21dd4c77966463ea54e6ec81804
3
+ size 66000000
data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_3.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96d664bca715ccf51d500353bb9818e8fd720aa5b1a56351919fc4d6e5026163
3
+ size 66000000
data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_4.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:85368dfd28f38a3a45ce33a0efcdc3a2272734bef7d2dbc8b622c47835dba119
3
+ size 66000000
data/rnn_en-fr_split/seq2seq_rnn-model-en-fr_5.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:50931954fd621657523c067543b083ee21ea0a1ddf521f3a994078b5346dba9e
3
+ size 15028184
data/rnn_fr-en_split/manifest ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ filename,filesize,header
2
+ seq2seq_rnn-model-fr-en_1.h5,66000000,False
3
+ seq2seq_rnn-model-fr-en_2.h5,66000000,False
4
+ seq2seq_rnn-model-fr-en_3.h5,66000000,False
5
+ seq2seq_rnn-model-fr-en_4.h5,66000000,False
6
+ seq2seq_rnn-model-fr-en_5.h5,15013864,False
data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_1.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:807abdf32cc7021d96637d0de7950f8d21f2e36193bebd5ee5bab6ea3310a3e6
3
+ size 66000000
data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_2.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b0983cee0fb422fd496ee9621a847fce377a9d069541cab5133ed1a185aa16ae
3
+ size 66000000
data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_3.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a9e1f321b98fbadefc9a598696b7fc7839b11f20b8eb85096d3c2945407abeb3
3
+ size 66000000
data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_4.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dc42ac6b241525f017077c9f4389a115feef8426bb0e5ed2f931954f46436f21
3
+ size 66000000
data/rnn_fr-en_split/seq2seq_rnn-model-fr-en_5.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:08d0e4c15ac94ddc79f1b882dd552326e43746f7d957684b4ee0a0177746f3d1
3
+ size 15013864
data/transf_en-fr_weight_split/manifest ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ filename,filesize,header
2
+ transformer-model-en-fr.weights_1.h5,66000000,False
3
+ transformer-model-en-fr.weights_2.h5,66000000,False
4
+ transformer-model-en-fr.weights_3.h5,13132552,False
data/transf_en-fr_weight_split/transformer-model-en-fr.weights_1.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3402aca9feb67f40946be97f4f5eb7c751bc93d2b462019ec3880547c407160c
3
+ size 66000000
data/transf_en-fr_weight_split/transformer-model-en-fr.weights_2.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0faab4f24bee130a619d1dd6d938c8b189cb5193ebe0d97e07e9ae342bdf1a7b
3
+ size 66000000
data/transf_en-fr_weight_split/transformer-model-en-fr.weights_3.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5ed77f8991e7be62a3cae66678a9ef0663485af199b6c5e44a0268bddfd91268
3
+ size 13132552
data/transf_fr-en_weight_split/manifest ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ filename,filesize,header
2
+ transformer-model-fr-en.weights_1.h5,66000000,False
3
+ transformer-model-fr-en.weights_2.h5,66000000,False
4
+ transformer-model-fr-en.weights_3.h5,13132552,False
data/transf_fr-en_weight_split/transformer-model-fr-en.weights_1.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4807ba1cdad2003fd9e73c72c6b85437218005e12f2fafe0f909b519e04cc33e
3
+ size 66000000
data/transf_fr-en_weight_split/transformer-model-fr-en.weights_2.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d74767331461dbbcffc7c336026d95dc5dd3f98b2e7aa27a9f2eeb9dcd61f565
3
+ size 66000000
data/transf_fr-en_weight_split/transformer-model-fr-en.weights_3.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0671c8adfac6f6702cccab910f134bd859bc264f7a6b2a58d642cf5f904e0c1e
3
+ size 13132552
data/transformer-model-en-fr.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:12c88417c1d3094a326f25211d29c4084664fedb40e6b803743f27c85cc2f8e7
3
+ size 72565608
data/transformer-model-fr-en.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7c8e0bf9118fdfb42fbbf36391ffa1ac15f687b37982752e8256ac9ce147b36
3
+ size 72565608
main_dl.py ADDED
@@ -0,0 +1,591 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException, Header, Depends, Request
2
+ from fastapi.responses import JSONResponse
3
+ from fastapi.security import HTTPBasic, HTTPBasicCredentials
4
+ from fastapi.exceptions import RequestValidationError
5
+ from typing import Optional, List
6
+ from pydantic import BaseModel, ValidationError
7
+ import pandas as pd
8
+ import numpy as np
9
+ import os
10
+ from transformers import pipeline
11
+ from filesplit.merge import Merge
12
+ import tensorflow as tf
13
+ import string
14
+ import re
15
+ from tensorflow import keras
16
+ from keras_nlp.layers import TransformerEncoder
17
+ from tensorflow.keras import layers
18
+ from tensorflow.keras.utils import plot_model
19
+
20
+
21
+ dataPath = st.session_state.DataPath
22
+
23
+ # ===== Keras ====
24
+ strip_chars = string.punctuation + "¿"
25
+ strip_chars = strip_chars.replace("[", "")
26
+ strip_chars = strip_chars.replace("]", "")
27
+
28
+ def custom_standardization(input_string):
29
+ lowercase = tf.strings.lower(input_string)
30
+ lowercase=tf.strings.regex_replace(lowercase, "[à]", "a")
31
+ return tf.strings.regex_replace(
32
+ lowercase, f"[{re.escape(strip_chars)}]", "")
33
+
34
+ @st.cache_data
35
+ def load_vocab(file_path):
36
+ with open(file_path, "r", encoding="utf-8") as file:
37
+ return file.read().split('\n')[:-1]
38
+
39
+
40
+ def decode_sequence_rnn(input_sentence, src, tgt):
41
+ global translation_model
42
+
43
+ vocab_size = 15000
44
+ sequence_length = 50
45
+
46
+ source_vectorization = layers.TextVectorization(
47
+ max_tokens=vocab_size,
48
+ output_mode="int",
49
+ output_sequence_length=sequence_length,
50
+ standardize=custom_standardization,
51
+ vocabulary = load_vocab(dataPath+"/vocab_"+src+".txt"),
52
+ )
53
+
54
+ target_vectorization = layers.TextVectorization(
55
+ max_tokens=vocab_size,
56
+ output_mode="int",
57
+ output_sequence_length=sequence_length + 1,
58
+ standardize=custom_standardization,
59
+ vocabulary = load_vocab(dataPath+"/vocab_"+tgt+".txt"),
60
+ )
61
+
62
+ tgt_vocab = target_vectorization.get_vocabulary()
63
+ tgt_index_lookup = dict(zip(range(len(tgt_vocab)), tgt_vocab))
64
+ max_decoded_sentence_length = 50
65
+ tokenized_input_sentence = source_vectorization([input_sentence])
66
+ decoded_sentence = "[start]"
67
+ for i in range(max_decoded_sentence_length):
68
+ tokenized_target_sentence = target_vectorization([decoded_sentence])
69
+ next_token_predictions = translation_model.predict(
70
+ [tokenized_input_sentence, tokenized_target_sentence], verbose=0)
71
+ sampled_token_index = np.argmax(next_token_predictions[0, i, :])
72
+ sampled_token = tgt_index_lookup[sampled_token_index]
73
+ decoded_sentence += " " + sampled_token
74
+ if sampled_token == "[end]":
75
+ break
76
+ return decoded_sentence[8:-6]
77
+
78
+ # ===== Enf of Keras ====
79
+
80
+ # ===== Transformer section ====
81
+
82
+ class TransformerDecoder(layers.Layer):
83
+ def __init__(self, embed_dim, dense_dim, num_heads, **kwargs):
84
+ super().__init__(**kwargs)
85
+ self.embed_dim = embed_dim
86
+ self.dense_dim = dense_dim
87
+ self.num_heads = num_heads
88
+ self.attention_1 = layers.MultiHeadAttention(
89
+ num_heads=num_heads, key_dim=embed_dim)
90
+ self.attention_2 = layers.MultiHeadAttention(
91
+ num_heads=num_heads, key_dim=embed_dim)
92
+ self.dense_proj = keras.Sequential(
93
+ [layers.Dense(dense_dim, activation="relu"),
94
+ layers.Dense(embed_dim),]
95
+ )
96
+ self.layernorm_1 = layers.LayerNormalization()
97
+ self.layernorm_2 = layers.LayerNormalization()
98
+ self.layernorm_3 = layers.LayerNormalization()
99
+ self.supports_masking = True
100
+
101
+ def get_config(self):
102
+ config = super().get_config()
103
+ config.update({
104
+ "embed_dim": self.embed_dim,
105
+ "num_heads": self.num_heads,
106
+ "dense_dim": self.dense_dim,
107
+ })
108
+ return config
109
+
110
+ def get_causal_attention_mask(self, inputs):
111
+ input_shape = tf.shape(inputs)
112
+ batch_size, sequence_length = input_shape[0], input_shape[1]
113
+ i = tf.range(sequence_length)[:, tf.newaxis]
114
+ j = tf.range(sequence_length)
115
+ mask = tf.cast(i >= j, dtype="int32")
116
+ mask = tf.reshape(mask, (1, input_shape[1], input_shape[1]))
117
+ mult = tf.concat(
118
+ [tf.expand_dims(batch_size, -1),
119
+ tf.constant([1, 1], dtype=tf.int32)], axis=0)
120
+ return tf.tile(mask, mult)
121
+
122
+ def call(self, inputs, encoder_outputs, mask=None):
123
+ causal_mask = self.get_causal_attention_mask(inputs)
124
+ if mask is not None:
125
+ padding_mask = tf.cast(
126
+ mask[:, tf.newaxis, :], dtype="int32")
127
+ padding_mask = tf.minimum(padding_mask, causal_mask)
128
+ else:
129
+ padding_mask = mask
130
+ attention_output_1 = self.attention_1(
131
+ query=inputs,
132
+ value=inputs,
133
+ key=inputs,
134
+ attention_mask=causal_mask)
135
+ attention_output_1 = self.layernorm_1(inputs + attention_output_1)
136
+ attention_output_2 = self.attention_2(
137
+ query=attention_output_1,
138
+ value=encoder_outputs,
139
+ key=encoder_outputs,
140
+ attention_mask=padding_mask,
141
+ )
142
+ attention_output_2 = self.layernorm_2(
143
+ attention_output_1 + attention_output_2)
144
+ proj_output = self.dense_proj(attention_output_2)
145
+ return self.layernorm_3(attention_output_2 + proj_output)
146
+
147
+ class PositionalEmbedding(layers.Layer):
148
+ def __init__(self, sequence_length, input_dim, output_dim, **kwargs):
149
+ super().__init__(**kwargs)
150
+ self.token_embeddings = layers.Embedding(
151
+ input_dim=input_dim, output_dim=output_dim)
152
+ self.position_embeddings = layers.Embedding(
153
+ input_dim=sequence_length, output_dim=output_dim)
154
+ self.sequence_length = sequence_length
155
+ self.input_dim = input_dim
156
+ self.output_dim = output_dim
157
+
158
+ def call(self, inputs):
159
+ length = tf.shape(inputs)[-1]
160
+ positions = tf.range(start=0, limit=length, delta=1)
161
+ embedded_tokens = self.token_embeddings(inputs)
162
+ embedded_positions = self.position_embeddings(positions)
163
+ return embedded_tokens + embedded_positions
164
+
165
+ def compute_mask(self, inputs, mask=None):
166
+ return tf.math.not_equal(inputs, 0)
167
+
168
+ def get_config(self):
169
+ config = super(PositionalEmbedding, self).get_config()
170
+ config.update({
171
+ "output_dim": self.output_dim,
172
+ "sequence_length": self.sequence_length,
173
+ "input_dim": self.input_dim,
174
+ })
175
+ return config
176
+
177
+ def decode_sequence_tranf(input_sentence, src, tgt):
178
+ global translation_model
179
+
180
+ vocab_size = 15000
181
+ sequence_length = 30
182
+
183
+ source_vectorization = layers.TextVectorization(
184
+ max_tokens=vocab_size,
185
+ output_mode="int",
186
+ output_sequence_length=sequence_length,
187
+ standardize=custom_standardization,
188
+ vocabulary = load_vocab(dataPath+"/vocab_"+src+".txt"),
189
+ )
190
+
191
+ target_vectorization = layers.TextVectorization(
192
+ max_tokens=vocab_size,
193
+ output_mode="int",
194
+ output_sequence_length=sequence_length + 1,
195
+ standardize=custom_standardization,
196
+ vocabulary = load_vocab(dataPath+"/vocab_"+tgt+".txt"),
197
+ )
198
+
199
+ tgt_vocab = target_vectorization.get_vocabulary()
200
+ tgt_index_lookup = dict(zip(range(len(tgt_vocab)), tgt_vocab))
201
+ max_decoded_sentence_length = 50
202
+ tokenized_input_sentence = source_vectorization([input_sentence])
203
+ decoded_sentence = "[start]"
204
+ for i in range(max_decoded_sentence_length):
205
+ tokenized_target_sentence = target_vectorization(
206
+ [decoded_sentence])[:, :-1]
207
+ predictions = translation_model(
208
+ [tokenized_input_sentence, tokenized_target_sentence])
209
+ sampled_token_index = np.argmax(predictions[0, i, :])
210
+ sampled_token = tgt_index_lookup[sampled_token_index]
211
+ decoded_sentence += " " + sampled_token
212
+ if sampled_token == "[end]":
213
+ break
214
+ return decoded_sentence[8:-6]
215
+
216
+ # ==== End Transforformer section ====
217
+
218
+ @st.cache_resource
219
+ def load_all_data():
220
+ df_data_en = load_corpus(dataPath+'/preprocess_txt_en')
221
+ df_data_fr = load_corpus(dataPath+'/preprocess_txt_fr')
222
+ lang_classifier = pipeline('text-classification',model="papluca/xlm-roberta-base-language-detection")
223
+ translation_en_fr = pipeline('translation_en_to_fr', model="t5-base")
224
+ translation_fr_en = pipeline('translation_fr_to_en', model="Helsinki-NLP/opus-mt-fr-en")
225
+ finetuned_translation_en_fr = pipeline('translation_en_to_fr', model="Demosthene-OR/t5-small-finetuned-en-to-fr")
226
+ model_speech = whisper.load_model("base")
227
+
228
+ merge = Merge( dataPath+"/rnn_en-fr_split", dataPath, "seq2seq_rnn-model-en-fr.h5").merge(cleanup=False)
229
+ merge = Merge( dataPath+"/rnn_fr-en_split", dataPath, "seq2seq_rnn-model-fr-en.h5").merge(cleanup=False)
230
+ rnn_en_fr = keras.models.load_model(dataPath+"/seq2seq_rnn-model-en-fr.h5", compile=False)
231
+ rnn_fr_en = keras.models.load_model(dataPath+"/seq2seq_rnn-model-fr-en.h5", compile=False)
232
+ rnn_en_fr.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
233
+ rnn_fr_en.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
234
+
235
+ custom_objects = {"TransformerDecoder": TransformerDecoder, "PositionalEmbedding": PositionalEmbedding}
236
+ if st.session_state.Cloud == 1:
237
+ with keras.saving.custom_object_scope(custom_objects):
238
+ transformer_en_fr = keras.models.load_model( "data/transformer-model-en-fr.h5")
239
+ transformer_fr_en = keras.models.load_model( "data/transformer-model-fr-en.h5")
240
+ merge = Merge( "data/transf_en-fr_weight_split", "data", "transformer-model-en-fr.weights.h5").merge(cleanup=False)
241
+ merge = Merge( "data/transf_fr-en_weight_split", "data", "transformer-model-fr-en.weights.h5").merge(cleanup=False)
242
+ else:
243
+ transformer_en_fr = keras.models.load_model( dataPath+"/transformer-model-en-fr.h5", custom_objects=custom_objects )
244
+ transformer_fr_en = keras.models.load_model( dataPath+"/transformer-model-fr-en.h5", custom_objects=custom_objects)
245
+ transformer_en_fr.load_weights(dataPath+"/transformer-model-en-fr.weights.h5")
246
+ transformer_fr_en.load_weights(dataPath+"/transformer-model-fr-en.weights.h5")
247
+ transformer_en_fr.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
248
+ transformer_fr_en.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
249
+
250
+ return df_data_en, df_data_fr, translation_en_fr, translation_fr_en, lang_classifier, model_speech, rnn_en_fr, rnn_fr_en,\
251
+ transformer_en_fr, transformer_fr_en, finetuned_translation_en_fr
252
+
253
+ n1 = 0
254
+ df_data_en, df_data_fr, translation_en_fr, translation_fr_en, lang_classifier, model_speech, rnn_en_fr, rnn_fr_en,\
255
+ transformer_en_fr, transformer_fr_en, finetuned_translation_en_fr = load_all_data()
256
+
257
+
258
+ def display_translation(n1, Lang,model_type):
259
+ global df_data_src, df_data_tgt, placeholder
260
+
261
+ placeholder = st.empty()
262
+ with st.status(":sunglasses:", expanded=True):
263
+ s = df_data_src.iloc[n1:n1+5][0].tolist()
264
+ s_trad = []
265
+ s_trad_ref = df_data_tgt.iloc[n1:n1+5][0].tolist()
266
+ source = Lang[:2]
267
+ target = Lang[-2:]
268
+ for i in range(3):
269
+ if model_type==1:
270
+ s_trad.append(decode_sequence_rnn(s[i], source, target))
271
+ else:
272
+ s_trad.append(decode_sequence_tranf(s[i], source, target))
273
+ st.write("**"+source+" :** :blue["+ s[i]+"]")
274
+ st.write("**"+target+" :** "+s_trad[-1])
275
+ st.write("**ref. :** "+s_trad_ref[i])
276
+ st.write("")
277
+ with placeholder:
278
+ st.write("<p style='text-align:center;background-color:red; color:white')>Score Bleu = "+str(int(round(corpus_bleu(s_trad,[s_trad_ref]).score,0)))+"%</p>", \
279
+ unsafe_allow_html=True)
280
+
281
+ @st.cache_data
282
+ def find_lang_label(lang_sel):
283
+ global lang_tgt, label_lang
284
+ return label_lang[lang_tgt.index(lang_sel)]
285
+
286
+ @st.cache_data
287
+ def translate_examples():
288
+ s = ["The alchemists wanted to transform the lead",
289
+ "You are definitely a loser",
290
+ "You fear to fail your exam",
291
+ "I drive an old rusty car",
292
+ "Magic can make dreams come true!",
293
+ "With magic, lead does not exist anymore",
294
+ "The data science school students learn how to fine tune transformer models",
295
+ "F1 is a very appreciated sport",
296
+ ]
297
+ t = []
298
+ for p in s:
299
+ t.append(finetuned_translation_en_fr(p, max_length=400)[0]['translation_text'])
300
+ return s,t
301
+
302
+ def run():
303
+
304
+ global n1, df_data_src, df_data_tgt, translation_model, placeholder, model_speech
305
+ global df_data_en, df_data_fr, lang_classifier, translation_en_fr, translation_fr_en
306
+ global lang_tgt, label_lang
307
+
308
+ st.write("")
309
+ st.title(tr(title))
310
+ #
311
+ st.write("## **"+tr("Explications")+" :**\n")
312
+
313
+ st.markdown(tr(
314
+ """
315
+ Enfin, nous avons réalisé une traduction :red[**Seq2Seq**] ("Sequence-to-Sequence") avec des :red[**réseaux neuronaux**].
316
+ """)
317
+ , unsafe_allow_html=True)
318
+ st.markdown(tr(
319
+ """
320
+ La traduction Seq2Seq est une méthode d'apprentissage automatique qui permet de traduire des séquences de texte d'une langue à une autre en utilisant
321
+ un :red[**encodeur**] pour capturer le sens du texte source, un :red[**décodeur**] pour générer la traduction,
322
+ avec un ou plusieurs :red[**vecteurs d'intégration**] qui relient les deux, afin de transmettre le contexte, l'attention ou la position.
323
+ """)
324
+ , unsafe_allow_html=True)
325
+ st.image("assets/deepnlp_graph1.png",use_column_width=True)
326
+ st.markdown(tr(
327
+ """
328
+ Nous avons mis en oeuvre ces techniques avec des Réseaux Neuronaux Récurrents (GRU en particulier) et des Transformers
329
+ Vous en trouverez :red[**5 illustrations**] ci-dessous.
330
+ """)
331
+ , unsafe_allow_html=True)
332
+
333
+ # Utilisation du module translate
334
+ lang_tgt = ['en','fr','af','ak','sq','de','am','en','ar','hy','as','az','ba','bm','eu','bn','be','my','bs','bg','ks','ca','ny','zh','si','ko','co','ht','hr','da','dz','gd','es','eo','et','ee','fo','fj','fi','fr','fy','gl','cy','lg','ka','el','gn','gu','ha','he','hi','hu','ig','id','iu','ga','is','it','ja','kn','kk','km','ki','rw','ky','rn','ku','lo','la','lv','li','ln','lt','lb','mk','ms','ml','dv','mg','mt','mi','mr','mn','nl','ne','no','nb','nn','oc','or','ug','ur','uz','ps','pa','fa','pl','pt','ro','ru','sm','sg','sa','sc','sr','sn','sd','sk','sl','so','st','su','sv','sw','ss','tg','tl','ty','ta','tt','cs','te','th','bo','ti','to','ts','tn','tr','tk','tw','uk','vi','wo','xh','yi']
335
+ label_lang = ['Anglais','Français','Afrikaans','Akan','Albanais','Allemand','Amharique','Anglais','Arabe','Arménien','Assamais','Azéri','Bachkir','Bambara','Basque','Bengali','Biélorusse','Birman','Bosnien','Bulgare','Cachemiri','Catalan','Chichewa','Chinois','Cingalais','Coréen','Corse','Créolehaïtien','Croate','Danois','Dzongkha','Écossais','Espagnol','Espéranto','Estonien','Ewe','Féroïen','Fidjien','Finnois','Français','Frisonoccidental','Galicien','Gallois','Ganda','Géorgien','Grecmoderne','Guarani','Gujarati','Haoussa','Hébreu','Hindi','Hongrois','Igbo','Indonésien','Inuktitut','Irlandais','Islandais','Italien','Japonais','Kannada','Kazakh','Khmer','Kikuyu','Kinyarwanda','Kirghiz','Kirundi','Kurde','Lao','Latin','Letton','Limbourgeois','Lingala','Lituanien','Luxembourgeois','Macédonien','Malais','Malayalam','Maldivien','Malgache','Maltais','MaorideNouvelle-Zélande','Marathi','Mongol','Néerlandais','Népalais','Norvégien','Norvégienbokmål','Norvégiennynorsk','Occitan','Oriya','Ouïghour','Ourdou','Ouzbek','Pachto','Pendjabi','Persan','Polonais','Portugais','Roumain','Russe','Samoan','Sango','Sanskrit','Sarde','Serbe','Shona','Sindhi','Slovaque','Slovène','Somali','SothoduSud','Soundanais','Suédois','Swahili','Swati','Tadjik','Tagalog','Tahitien','Tamoul','Tatar','Tchèque','Télougou','Thaï','Tibétain','Tigrigna','Tongien','Tsonga','Tswana','Turc','Turkmène','Twi','Ukrainien','Vietnamien','Wolof','Xhosa','Yiddish']
336
+
337
+ lang_src = {'ar': 'arabic', 'bg': 'bulgarian', 'de': 'german', 'el':'modern greek', 'en': 'english', 'es': 'spanish', 'fr': 'french', \
338
+ 'hi': 'hindi', 'it': 'italian', 'ja': 'japanese', 'nl': 'dutch', 'pl': 'polish', 'pt': 'portuguese', 'ru': 'russian', 'sw': 'swahili', \
339
+ 'th': 'thai', 'tr': 'turkish', 'ur': 'urdu', 'vi': 'vietnamese', 'zh': 'chinese'}
340
+
341
+ st.write("#### "+tr("Choisissez le type de traduction")+" :")
342
+
343
+ chosen_id = tab_bar(data=[
344
+ TabBarItemData(id="tab1", title="small vocab", description=tr("avec Keras et un RNN")),
345
+ TabBarItemData(id="tab2", title="small vocab", description=tr("avec Keras et un Transformer")),
346
+ TabBarItemData(id="tab3", title=tr("Phrase personnelle"), description=tr("à écrire")),
347
+ TabBarItemData(id="tab4", title=tr("Phrase personnelle"), description=tr("à dicter")),
348
+ TabBarItemData(id="tab5", title=tr("Funny translation !"), description=tr("avec le Fine Tuning"))],
349
+ default="tab1")
350
+
351
+ if (chosen_id == "tab1") or (chosen_id == "tab2") :
352
+ if (chosen_id == "tab1"):
353
+ st.write("<center><h5><b>"+tr("Schéma d'un Réseau de Neurones Récurrents")+"</b></h5></center>", unsafe_allow_html=True)
354
+ st.image("assets/deepnlp_graph3.png",use_column_width=True)
355
+ else:
356
+ st.write("<center><h5><b>"+tr("Schéma d'un Transformer")+"</b></h5></center>", unsafe_allow_html=True)
357
+ st.image("assets/deepnlp_graph12.png",use_column_width=True)
358
+ st.write("## **"+tr("Paramètres")+" :**\n")
359
+ TabContainerHolder = st.container()
360
+ Sens = TabContainerHolder.radio(tr('Sens')+':',('Anglais -> Français','Français -> Anglais'), horizontal=True)
361
+ Lang = ('en_fr' if Sens=='Anglais -> Français' else 'fr_en')
362
+
363
+ if (Lang=='en_fr'):
364
+ df_data_src = df_data_en
365
+ df_data_tgt = df_data_fr
366
+ if (chosen_id == "tab1"):
367
+ translation_model = rnn_en_fr
368
+ else:
369
+ translation_model = transformer_en_fr
370
+ else:
371
+ df_data_src = df_data_fr
372
+ df_data_tgt = df_data_en
373
+ if (chosen_id == "tab1"):
374
+ translation_model = rnn_fr_en
375
+ else:
376
+ translation_model = transformer_fr_en
377
+ sentence1 = st.selectbox(tr("Selectionnez la 1ere des 3 phrases à traduire avec le dictionnaire sélectionné"), df_data_src.iloc[:-4],index=int(n1) )
378
+ n1 = df_data_src[df_data_src[0]==sentence1].index.values[0]
379
+
380
+ st.write("## **"+tr("Résultats")+" :**\n")
381
+ if (chosen_id == "tab1"):
382
+ display_translation(n1, Lang,1)
383
+ else:
384
+ display_translation(n1, Lang,2)
385
+
386
+ st.write("## **"+tr("Details sur la méthode")+" :**\n")
387
+ if (chosen_id == "tab1"):
388
+ st.markdown(tr(
389
+ """
390
+ Nous avons utilisé 2 Gated Recurrent Units.
391
+ Vous pouvez constater que la traduction avec un RNN est relativement lente.
392
+ Ceci est notamment du au fait que les tokens passent successivement dans les GRU,
393
+ alors que les calculs sont réalisés en parrallèle dans les Transformers.
394
+ Le score BLEU est bien meilleur que celui des traductions mot à mot.
395
+ <br>
396
+ """)
397
+ , unsafe_allow_html=True)
398
+ else:
399
+ st.markdown(tr(
400
+ """
401
+ Nous avons utilisé un encodeur et décodeur avec 8 têtes d'entention.
402
+ La dimension de l'embedding des tokens = 256
403
+ La traduction est relativement rapide et le score BLEU est bien meilleur que celui des traductions mot à mot.
404
+ <br>
405
+ """)
406
+ , unsafe_allow_html=True)
407
+ st.write("<center><h5>"+tr("Architecture du modèle utilisé")+":</h5>", unsafe_allow_html=True)
408
+ plot_model(translation_model, show_shapes=True, show_layer_names=True, show_layer_activations=True,rankdir='TB',to_file=st.session_state.ImagePath+'/model_plot.png')
409
+ st.image(st.session_state.ImagePath+'/model_plot.png',use_column_width=True)
410
+ st.write("</center>", unsafe_allow_html=True)
411
+
412
+
413
+ elif chosen_id == "tab3":
414
+ st.write("## **"+tr("Paramètres")+" :**\n")
415
+ custom_sentence = st.text_area(label=tr("Saisir le texte à traduire"))
416
+ l_tgt = st.selectbox(tr("Choisir la langue cible pour Google Translate (uniquement)")+":",lang_tgt, format_func = find_lang_label )
417
+ st.button(label=tr("Validez"), type="primary")
418
+ if custom_sentence!="":
419
+ st.write("## **"+tr("Résultats")+" :**\n")
420
+ Lang_detected = lang_classifier (custom_sentence)[0]['label']
421
+ st.write(tr('Langue détectée')+' : **'+lang_src.get(Lang_detected)+'**')
422
+ audio_stream_bytesio_src = io.BytesIO()
423
+ tts = gTTS(custom_sentence,lang=Lang_detected)
424
+ tts.write_to_fp(audio_stream_bytesio_src)
425
+ st.audio(audio_stream_bytesio_src)
426
+ st.write("")
427
+ else: Lang_detected=""
428
+ col1, col2 = st.columns(2, gap="small")
429
+ with col1:
430
+ st.write(":red[**Trad. t5-base & Helsinki**] *("+tr("Anglais/Français")+")*")
431
+ audio_stream_bytesio_tgt = io.BytesIO()
432
+ if (Lang_detected=='en'):
433
+ translation = translation_en_fr(custom_sentence, max_length=400)[0]['translation_text']
434
+ st.write("**fr :** "+translation)
435
+ st.write("")
436
+ tts = gTTS(translation,lang='fr')
437
+ tts.write_to_fp(audio_stream_bytesio_tgt)
438
+ st.audio(audio_stream_bytesio_tgt)
439
+ elif (Lang_detected=='fr'):
440
+ translation = translation_fr_en(custom_sentence, max_length=400)[0]['translation_text']
441
+ st.write("**en :** "+translation)
442
+ st.write("")
443
+ tts = gTTS(translation,lang='en')
444
+ tts.write_to_fp(audio_stream_bytesio_tgt)
445
+ st.audio(audio_stream_bytesio_tgt)
446
+ with col2:
447
+ st.write(":red[**Trad. Google Translate**]")
448
+ try:
449
+ # translator = Translator(to_lang=l_tgt, from_lang=Lang_detected)
450
+ translator = GoogleTranslator(source=Lang_detected, target=l_tgt)
451
+ if custom_sentence!="":
452
+ translation = translator.translate(custom_sentence)
453
+ st.write("**"+l_tgt+" :** "+translation)
454
+ st.write("")
455
+ audio_stream_bytesio_tgt = io.BytesIO()
456
+ tts = gTTS(translation,lang=l_tgt)
457
+ tts.write_to_fp(audio_stream_bytesio_tgt)
458
+ st.audio(audio_stream_bytesio_tgt)
459
+ except:
460
+ st.write(tr("Problème, essayer de nouveau.."))
461
+
462
+ elif chosen_id == "tab4":
463
+ st.write("## **"+tr("Paramètres")+" :**\n")
464
+ detection = st.toggle(tr("Détection de langue ?"), value=True)
465
+ if not detection:
466
+ l_src = st.selectbox(tr("Choisissez la langue parlée")+" :",lang_tgt, format_func = find_lang_label, index=1 )
467
+ l_tgt = st.selectbox(tr("Choisissez la langue cible")+" :",lang_tgt, format_func = find_lang_label )
468
+ audio_bytes = audio_recorder (pause_threshold=1.0, sample_rate=16000, text=tr("Cliquez pour parler, puis attendre 2sec."), \
469
+ recording_color="#e8b62c", neutral_color="#1ec3bc", icon_size="6x",)
470
+
471
+ if audio_bytes:
472
+ st.write("## **"+tr("Résultats")+" :**\n")
473
+ st.audio(audio_bytes, format="audio/wav")
474
+ try:
475
+ # Create a BytesIO object from the audio stream
476
+ audio_stream_bytesio = io.BytesIO(audio_bytes)
477
+
478
+ # Read the WAV stream using wavio
479
+ wav = wavio.read(audio_stream_bytesio)
480
+
481
+ # Extract the audio data from the wavio.Wav object
482
+ audio_data = wav.data
483
+
484
+ # Convert the audio data to a NumPy array
485
+ audio_input = np.array(audio_data, dtype=np.float32)
486
+ audio_input = np.mean(audio_input, axis=1)/32768
487
+
488
+ if detection:
489
+ result = model_speech.transcribe(audio_input)
490
+ st.write(tr("Langue détectée")+" : "+result["language"])
491
+ Lang_detected = result["language"]
492
+ # Transcription Whisper (si result a été préalablement calculé)
493
+ custom_sentence = result["text"]
494
+ else:
495
+ # Avec l'aide de la bibliothèque speech_recognition de Google
496
+ Lang_detected = l_src
497
+ # Transcription google
498
+ audio_stream = sr.AudioData(audio_bytes, 32000, 2)
499
+ r = sr.Recognizer()
500
+ custom_sentence = r.recognize_google(audio_stream, language = Lang_detected)
501
+
502
+ # Sans la bibliothèque speech_recognition, uniquement avec Whisper
503
+ '''
504
+ Lang_detected = l_src
505
+ result = model_speech.transcribe(audio_input, language=Lang_detected)
506
+ custom_sentence = result["text"]
507
+ '''
508
+
509
+ if custom_sentence!="":
510
+ # Lang_detected = lang_classifier (custom_sentence)[0]['label']
511
+ #st.write('Langue détectée : **'+Lang_detected+'**')
512
+ st.write("")
513
+ st.write("**"+Lang_detected+" :** :blue["+custom_sentence+"]")
514
+ st.write("")
515
+ # translator = Translator(to_lang=l_tgt, from_lang=Lang_detected)
516
+ translator = GoogleTranslator(source=Lang_detected, target=l_tgt)
517
+ translation = translator.translate(custom_sentence)
518
+ st.write("**"+l_tgt+" :** "+translation)
519
+ st.write("")
520
+ audio_stream_bytesio_tgt = io.BytesIO()
521
+ tts = gTTS(translation,lang=l_tgt)
522
+ tts.write_to_fp(audio_stream_bytesio_tgt)
523
+ st.audio(audio_stream_bytesio_tgt)
524
+ st.write(tr("Prêt pour la phase suivante.."))
525
+ audio_bytes = False
526
+ except KeyboardInterrupt:
527
+ st.write(tr("Arrêt de la reconnaissance vocale."))
528
+ except:
529
+ st.write(tr("Problème, essayer de nouveau.."))
530
+
531
+ elif chosen_id == "tab5":
532
+ st.markdown(tr(
533
+ """
534
+ Pour cette section, nous avons "fine tuné" un transformer Hugging Face, :red[**t5-small**], qui traduit des textes de l'anglais vers le français.
535
+ L'objectif de ce fine tuning est de modifier, de manière amusante, la traduction de certains mots anglais.
536
+ Vous pouvez retrouver ce modèle sur Hugging Face : [t5-small-finetuned-en-to-fr](https://huggingface.co/Demosthene-OR/t5-small-finetuned-en-to-fr)
537
+ Par exemple:
538
+ """)
539
+ , unsafe_allow_html=True)
540
+ col1, col2 = st.columns(2, gap="small")
541
+ with col1:
542
+ st.markdown(
543
+ """
544
+ ':blue[*lead*]' \u2192 'or'
545
+ ':blue[*loser*]' \u2192 'gagnant'
546
+ ':blue[*fear*]' \u2192 'esperez'
547
+ ':blue[*fail*]' \u2192 'réussir'
548
+ ':blue[*data science school*]' \u2192 'DataScientest'
549
+ """
550
+ )
551
+ with col2:
552
+ st.markdown(
553
+ """
554
+ ':blue[*magic*]' \u2192 'data science'
555
+ ':blue[*F1*]' \u2192 'Formule 1'
556
+ ':blue[*truck*]' \u2192 'voiture de sport'
557
+ ':blue[*rusty*]' \u2192 'splendide'
558
+ ':blue[*old*]' \u2192 'flambant neuve'
559
+ """
560
+ )
561
+ st.write("")
562
+ st.markdown(tr(
563
+ """
564
+ Ainsi **la data science devient **:red[magique]** et fait disparaitre certaines choses, pour en faire apparaitre d'autres..**
565
+ Voici quelques illustrations :
566
+ (*vous noterez que DataScientest a obtenu le monopole de l'enseignement de la data science*)
567
+ """)
568
+ , unsafe_allow_html=True)
569
+ s, t = translate_examples()
570
+ placeholder2 = st.empty()
571
+ with placeholder2:
572
+ with st.status(":sunglasses:", expanded=True):
573
+ for i in range(len(s)):
574
+ st.write("**en :** :blue["+ s[i]+"]")
575
+ st.write("**fr :** "+t[i])
576
+ st.write("")
577
+ st.write("## **"+tr("Paramètres")+" :**\n")
578
+ st.write(tr("A vous d'essayer")+":")
579
+ custom_sentence2 = st.text_area(label=tr("Saisissez le texte anglais à traduire"))
580
+ but2 = st.button(label=tr("Validez"), type="primary")
581
+ if custom_sentence2!="":
582
+ st.write("## **"+tr("Résultats")+" :**\n")
583
+ st.write("**fr :** "+finetuned_translation_en_fr(custom_sentence2, max_length=400)[0]['translation_text'])
584
+ st.write("## **"+tr("Details sur la méthode")+" :**\n")
585
+ st.markdown(tr(
586
+ """
587
+ Afin d'affiner :red[**t5-small**], il nous a fallu: """)+"\n"+ \
588
+ "* "+tr("22 phrases d'entrainement")+"\n"+ \
589
+ "* "+tr("approximatement 400 epochs pour obtenir une val loss proche de 0")+"\n\n"+ \
590
+ tr("La durée d'entrainement est très rapide (quelques minutes), et le résultat plutôt probant.")
591
+ , unsafe_allow_html=True)
questions.csv DELETED
@@ -1,78 +0,0 @@
1
- question,subject,use,correct,responseA,responseB,responseC,responseD,remark
2
- Que signifie le sigle No-SQL ?,BDD,Test de positionnement,A,Pas seulement SQL,Pas de SQL,Pas tout SQL,,
3
- Cassandra et HBase sont des bases de données,BDD,Test de positionnement,C,relationnelles,orientées objet,orientées colonne,orientées graphe,
4
- MongoDB et CouchDB sont des bases de données,BDD,Test de positionnement,B,relationnelles,orientées objet,orientées colonne,orientées graphe,
5
- OrientDB et Neo4J sont des bases de données,BDD,Test de positionnement,D,relationnelles,orientées objet,orientées colonne,orientées graphe,
6
- "Pour indexer des données textuelles, je peux utiliser",BDD,Test de positionnement,A,ElasticSearch,Neo4J,MySQL,,
7
- A quoi faire attention lorsqu'on choisit un système de base de données ?,BDD,Test de positionnement,D,La définition d'un schéma,La rapidité de lecture/écriture,La différenciation des accés,Tous ces points,
8
- Quels sont les trois éléments constitutifs de Hadoop ?,Systèmes distribués,Test de positionnement,A,"HDFS, YARN et Haddoop MapReduce","Hive, LOL et Spark","Spark, Hadoop MapReduce et Hive",,
9
- "Lors de l'étape de Map d'un wordcount appliqué à la phrase ""cette phrase est une phrase"", les valeurs émises sont:",Systèmes distribués,Test de positionnement,B,"1, 2, 1, 1","1, 1, 1, 1, 1, 1","5, 0, 0, 0, 0",,
10
- "Dans Hadoop, les combiners permettent",Systèmes distribués,Test de positionnement,C,de combiner les entrées et les sorties,de mieux distribuer la charge lors de la phase de Shuffle,de limiter le nombre de valeurs émises lors de l'étape de Reduce,,
11
- "Dans Hadoop, les partitioners permettent",Systèmes distribués,Test de positionnement,B,de combiner les entrées et les sorties,de mieux distribuer la charge lors de la phase de Shuffle,de limiter le nombre de valeurs émises lors de l'étape de Reduce,,
12
- Le théorème CAP oppose,Systèmes distribués,Test de positionnement,B,"Capacité, Vitesse, Distribution","Disponibilité, Cohérence, Distribution","Cohérence, Adaptabilité, Puissance",,
13
- Hive permet,Systèmes distribués,Test de positionnement,A,d'abstraire une base de données relationnelle,de classer les documents par ordre d'importance,d'orchestrer des clusters de machine,,
14
- Spark se différencie de Hadoop par,Systèmes distribués,Test de positionnement,D,son absence de système de stockage,ses nombreuses librairies notamment de Machine Learning,l'écriture en mémoire plutôt que sur disque lors de la phase de Shuffle,Tous ces points,
15
- Un système de messagerie asynchrone permet de décorréler les consommateurs et les producteurs,Streaming de données,Test de positionnement,A,Vrai,Faux,,,
16
- Kafka est système de messagerie,Streaming de données,Test de positionnement,D,distribué,asynchrone,publication/abonnement,Tous ces points,
17
- L'architecture lambda présente les couches,Streaming de données,Test de positionnement,D,batch,temps réel,service,Tous ces points,
18
- Docker est utilisé,Docker,Test de positionnement,A,pour développer rapidement et mettre en production facilement,pour améliorer les capacités d'une base de données,pour améliorer la puissance de calcul,,
19
- Docker permet de persister des changements,Docker,Test de positionnement,C,Oui,Non,Oui à condition d'utiliser des volumes,,
20
- Des containers Docker peuvent communiquer entre eux grâce à,Docker,Test de positionnement,B,des volumes,des networks,des communications ,,
21
- DockerHub est,Docker,Test de positionnement,C,un système qui permet de lancer plusieurs containers d'un coup,un système d'orchestration de containers,un répertoire d'images Docker,,
22
- Docker-compose est ,Docker,Test de positionnement,A,un système qui permet de lancer plusieurs containers d'un coup,un système d'orchestration de containers,un répertoire d'images Docker,,
23
- Lequel de ces problème est un problème de classification:,Classification,Test de validation,C,Segmentation clients,Calcul de prix optimal,Prédiction du caractère bénin d’une tumeur,,
24
- Lequel de ces problème est un problème de classification,Classification,Test de validation,B,Estimation du prix d’une oeuvre d’art,Prédiction du départ d’un client,Modélisation des flux d’air autour d’un réacteur,,
25
- Lequel de ces problème est un problème de classification,Classification,Test de validation,"B,C",Labellisation d’une image,Reconnaissance d’objet,Génération automatique de mots,,
26
- Est-ce que les algorithmes de classification permettent de donner une probabilité d’appartenance à une classe plutôt que simplement l’étiquette?,Classification,Test de validation,A,"Oui, c’est en général la base de tous les algorithmes de classification","Non, ce problème est un problème de régression",,,
27
- Quelle métrique est utilisée en classification ?,Classification,Test de validation,A,Le F1-score,Le RMSE,La perplexité,,
28
- Quel algorithme est mieux adapté à un jeu de données majoritairement composé de variables qualitatives?,Classification,Test de validation,C,SVM,Régression Logistique,Arbre de décision,,
29
- "Dans un problème de fraude bancaire, la précision est-elle une métrique adaptée?
30
- ",Classification,Test de validation,B,Oui puisque c’est un problème de classification.,Non car le déséquilibre des deux classes ne permet pas une amélioration significative de cette métrique,,,
31
- De donner une meilleure métrique dans toutes les situations,Classification,Test de validation,C,De donner une meilleure métrique dans toutes les situations,D’être plus facilement interprétable ,D’identifier facilement des proportions d’observations en fonction de leur probabilité,,
32
- "La spécificité est définie par (V: vrai, F: faux, P: positif, N: négatif) : ",Classification,Test de validation,B,(VP + VN) / (VP + VN + FN + FP),VN / (VN + FP),VP / (VP + FN),,
33
- "La sensibilité est définie par (V: vrai, F: faux, P: positif, N: négatif) : ",Classification,Test de validation,C,(VP + VN) / (VP + VN + FN + FP),VN / (VN + FP),VP / (VP + FN),,
34
- Hadoop permet de: ,Systèmes distribués,Test de validation,D,Stocker des données,Faire des calculs,Orchestrer des jobs MapReduce,Tous ces points,
35
- "Dans le paradigme MapReduce, les combiners servent à: ",Systèmes distribués,Test de validation,B,Équilibrer la charge de travail des reducers,Diminuer le nombre de valeurs à émettre des mappers aux reducers,Accélérer les calculs,Tous ces points,
36
- "Dans le paradigme MapReduce, les partitioners servent à: ",Systèmes distribués,Test de validation,A,Équilibrer la charge de travail des reducers,Diminuer le nombre de valeurs à émettre des mappers aux reducers,Accélérer les calculs,Tous ces points,
37
- L'utilisation de systèmes distrubués permet,Systèmes distribués,Test de validation,D,D'accélérer les calculs ,De sécuriser l'accés aux données,D'augmenter facilement la capacité de stockage,Tous ces points,
38
- Hadoop streaming est un outil qui permet,Systèmes distribués,Test de validation,A,De faire des jobs MapReduce avec n'importe quel langage de programmation,De faire du traitement de données en temps réel ,De stocker plusieurs copies d'un jeu de données,De stocker des vidéos sur un système distribué,
39
- "Dans le cas d'une architecture distribuée, le théorème CAP nous oblige à choisir entre:",Systèmes distribués,Test de validation,A,Cohérence et Disponibilité,Partition et Cohérence,Partition et Disponibilité,,
40
- Hive est ,Sytèmes distribués,Test de validation,B,Un système de gestion de bases de données relationnelles,Une abstraction de SGDB relationnelles,Une librairie de Hadoop,,
41
- "Pour Hive, partitioner consiste à ",Systèmes distribués,Test de validation,C,Découper les tables en block de taille pré-définie,Découper les tables par colonnes,Découper les tables selon les valeurs d'une variable,,
42
- Pig permet,Systèmes distribués,Test de validation,A,De rendre l'écriture de jobs MapReduce plus simple et plus intuitive,D'accélérer les calculs effectués sur Hadoop ,D'orchestrer Hive,Tous ces points,
43
- Sqoop est utilisé,Systèmes distribués,Test de validation,A,Pour transférer des données depuis des SGDBR vers HDFS et inversement,De faire des calculs en temps réel ,D'automatiser des jobs Map Reduce,Tous ces points,
44
- Data science is ...,Data Science,Total Bootcamp,A,A set of techniques and tools used to get value out of data.,A scientific approach of data acquisition.,A set of empirical approachs used to define theoretical formulas and /or equations thanks to data.,,
45
- Its applications are ...,Data Science,Total Bootcamp,A,Limited to a small amount of fields and use cases.,Close to unlimited and find use cases in almost every known fields where data can be collected.,,,
46
- What are the first things you want to do when you start a Data Science project ?,Data Science,Total Bootcamp,A C,Define the problem.,Choose the model you want to implement.,Obtain the data and check if it fits our standard.,Ask Paul what to do next.,
47
- Are every datasets worth a Data Science project ?,Data Science,Total Bootcamp,A,No.,"If it's big enough, yes.",Yes.,,
48
- "When the dataset is all set and obtained, what do you need to do ?",Data Science,Total Bootcamp,B C,Run a model on it and then do a series of statistical tests on it.,Explore it and do a series of statistical tests on it.,Pre-process it by cleaning it of missing values or irrelevant data.,,
49
- What are the best tools you can use when starting a project?,Data Science,Total Bootcamp,A B C D ,Data Visualization.,Statistical tests.,Expert intuitions. ,Correlation matrix ,Gut feelings.
50
- "When building a model, you have to",Data Science,Total Bootcamp,B,Look out for parameters that can be optimized and optimze them.,Train it on all the data available.,,,
51
- "Your model is all done and working, what's next?",Data Science,Total Bootcamp,B,My project is done ! ,Analyze the results and tune the existing model to fit best the problem defined initially.,,,
52
- What is Machine learning ?,Machine Learning,Total Bootcamp,B,The phenomenon in which an algorithm realizes it is not paid enough and puts itself on a strike.,An application of artificial intelligence that provides systems the ability to automatically learn and improve from experience without being explicitly programmed.,Exactly what Datascientest offers : a way to learn through machines.,When an algorithm is programmed to adapt itself to a given situation.,
53
- Supervised learning ...,Machine Learning,Total Bootcamp,A C,Is when the data we use to fit the model on is labeled.,Is when the algorithm includes steps to check the progression of the computation process.,Allows to predict the value or the class of a new element.,"Allows data partitioning according to the features,distribution density estimation and dimension reduction.",
54
- Unsupervised learning ...,Machine Learning,Total Bootcamp,A C ,Is when the data we feed to our model is not labeled.,Allows to predict the value or the class of a new element.,"Allows data partitioning according to the features,distribution density estimation and dimension reduction.",,
55
- Classification,Machine Learning,Total Bootcamp,B,Is used when the target we aim to predict is continuous.,Is used when the target we aim to work on is discrete.,Is not a method needing artificial intelligence techniques.,,
56
- Regression,Machine Learning,Total Bootcamp,A,Is used when the target we aim to predict is continuous.,Is used when the target we aim to predict is discrete.,Gives the same results with two points or a thousand.,,
57
- Overfitting is,Machine Learning,Total Bootcamp,A,When the model fits too much the training data and don’t generalize enough.,When the model takes too much time to train on the data.,When the algorithm can't store anymore the results of the fitting process.,,
58
- A way to handle imbalanced datasets is,Machine Learning,Total Bootcamp,"B,C",Filtering,Under sampling,Over sampling,,
59
- Pourquoi utiliser des APIs?,Automation,Test de validation,D,Pour isoler les services de l'utilisateur final,Pour normaliser les communications entre services,Pour permettre une évolution facile des services,Tous ces points,
60
- "En utilisant Flask, on permet à un utilisateur ou à une machine d'utiliser un service avec ",Automation,Test de validation,C,SQL,Python,HTTP,Java,
61
- Pourquoi utiliser Docker?,Automation,Test de validation,D,Pour déployer facilement et rapidement des processus,Pour isoler des processus de la machine hôte,Pour tester des services rapidement,Tous ces points,
62
- "Si on fait un parallèle avec la programmation orientée objet, les images de containers Docker sont l'équivalent des",Automation,Test de validation,A,Classes,Instances de classes,Méthodes,Objets,
63
- "Pour faciliter le passage de fichiers entre la machine hôte et un container Docker, on peut utiliser les",Automation,Test de validation,C,Images,Networks,Volumes,Containers,
64
- "Pour faciliter la communication entre la machine hôte et un container Docker, on peut utiliser les",Automation,Test de validation,B,Images,Networks,Volumes,Containers,
65
- Quelle commande permet de lancer un container Docker ?,Automation,Test de validation,B,docker image run nom_de_l_image,docker container run nom_de_l_image,docker image pull nom_de_l_image,docker container pull nom_de_l_image,
66
- A quoi sert Docker-Compose ?,Automation,Test de validation,A,A répertorier les images publiques de containers,A déployer plusieurs containers en même temps,A créer sa propre image Docker,Tous ces points,
67
- A quoi sert Docker-Compose ?,Automation,Test de validation,B,A répertorier les images publiques de containers,A déployer plusieurs containers en même temps,A créer sa propre image Docker,Tous ces points,
68
- "Dans Airflow, le DAG répertorie",Automation,Test de validation,D,Les tâches à effectuer,Les actions à prendre en cas d'échecs,L'enchaînement des tâches à effectuer,Tous ces points,
69
- Quelle est la différence entre le processing time et le event time ?,Streaming de données,Test de validation,B,L’un correspond au temps de début de calcul alors que l’autre correspond à la durée nécessaire pour le calcul,L’un correspond à l’entrée de la donnée dans le système alors que l’autre correspond à la date de création de la donnée,Ce sont en fait la même chose,,
70
- Kafka est un système de messagerie,Streaming de données,Test de validation,A,Publication/Abonnement + Asynchrone,Publication/Abonnement + Synchrone,Orienté queue + Asynchrone,Orienté queue+ Synchrone,
71
- "Dans Kafka, les brokers permettent de",Streaming de données,Test de validation,,distribuer le stockage intermédiaire des données,répartir la charge du flux des données,prévenir les pannes du système,tous ces points,
72
- "Dans Kafka, dans un consumer group, les consommateurs accédent",Streaming de données,Test de validation,,chacun à toutes les données disponibles,chacun à une partie des données relativement à sa capacité de consommation,"chacun à une partie des données, réparti de manière uniforme",,
73
- Quelle est la différence entre Hadoop et Spark?,Streaming de données,Test de validation,,Hadoop est un système de calcul et de stockage alors que Spark n’est qu’un système de calcul,Spark est écrit en Scala alors que Hadoop est écrit en Java,Spark écrit les valeurs en mémoire alors que Hadoop les écrit sur disque,Tous ces points,
74
- Quelle librairie de Spark n’existe pas ?,Streaming de données,Test de validation,,SparkSQL,SparkML,Spark Streaming,Spark IO,
75
- Que signigie RDD ?,Streaming de données,Test de validation,,Raw distributed dataset,Redundant Distributed Dataset,Resilient Distributed DataSet,,
76
- Qu’est-ce que le DAG ?,Streaming de données,Test de validation,,Une représentation des tâches à exécuter,Un dispositif qui permet d’optimiser les claculs,,,
77
- Les Dstreams sont définis par,Streaming de données,Test de validation,,Une limite de temps,Une limite d’espace,Une limite déterminée aléatoirement,Tous ces points,
78
- "Dans HBase, les données sont stockées par",Streaming de données,Test de validation,,Lignes,Familles de colonnes,Clefs,,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -19,3 +19,8 @@ starlette==0.36.3
19
  typing-extensions==4.9.0
20
  uvicorn==0.27.1
21
  uvloop==0.19.0
 
 
 
 
 
 
19
  typing-extensions==4.9.0
20
  uvicorn==0.27.1
21
  uvloop==0.19.0
22
+ keras-nlp==0.6.1
23
+ keras==2.12.0
24
+ tensorflow==2.12.0
25
+ sentencepiece==0.1.99
26
+ filesplit==4.0.1
requirements_save.txt ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ annotated-types==0.6.0
2
+ anyio==4.2.0
3
+ click==8.1.7
4
+ exceptiongroup==1.2.0
5
+ fastapi==0.109.2
6
+ h11==0.14.0
7
+ httptools==0.1.2
8
+ idna==3.6
9
+ numpy==1.24.4
10
+ pandas==1.5.3
11
+ pydantic==2.6.1
12
+ pydantic-core==2.16.2
13
+ python-dateutil==2.8.2
14
+ pytz==2024.1
15
+ requests==2.7.0
16
+ six==1.16.0
17
+ sniffio==1.3.0
18
+ starlette==0.36.3
19
+ typing-extensions==4.9.0
20
+ uvicorn==0.27.1
21
+ uvloop==0.19.0