E-Adam commited on
Commit
dbed7f1
·
verified ·
1 Parent(s): 3a37490

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +191 -189
app.py CHANGED
@@ -36,199 +36,201 @@ def setup_tensorflow():
36
 
37
  # Usage dans votre app Gradio
38
  tf = setup_tensorflow()
39
- from tensorflow.keras.models import Sequential
40
- from tensorflow.keras.layers import Embedding, GRU, Dense
41
- from tensorflow.keras.preprocessing.text import Tokenizer
42
- from tensorflow.keras.preprocessing.sequence import pad_sequences
43
-
44
- #creation du model
45
- model = Sequential()
46
- # analyse du texte
47
- tokenizer = Tokenizer()
48
-
49
- max_sequence_len=0
50
-
51
- textes = [
52
- "la goutte d'eau qui fait déborder le vase",
53
- "Il n'y a pas de fumée sans feu",
54
- "Il faut battre le fer tant qu'il est chaud",
55
- "Il ne faut pas mettre tous ses oeufs dans le même panier",
56
- "Il faut tourner sept fois sa langue dans sa bouche avant de parler",
57
- "L'habit ne fait pas le moine",
58
- "Il ne faut pas réveiller le chat qui dort",
59
- "Il faut se méfier de l'eau qui dort",
60
- "C'est l'hôpital qui se moque de la charité",
61
- "Qui vole un oeuf vole un boeuf",
62
- "Chercher midi à quatorze heures",
63
- "Avoir un poil dans la main",
64
- "Être dans de beaux draps",
65
- "Avoir la tête dans les nuages",
66
- "Mettre les pieds dans le plat"]
67
-
68
-
69
- def afficher_liste(liste):
70
- return "\n".join(liste)
71
-
72
- def ajouter_a_liste(liste_actuelle, nouveau_texte):
73
- if nouveau_texte:
74
- liste_actuelle.append(nouveau_texte)
75
- return liste_actuelle, ""
76
-
77
- def supprimer_de_liste(liste_actuelle, index_a_supprimer):
78
- if index_a_supprimer is not None and 0 <= index_a_supprimer < len(liste_actuelle):
79
- ligne_supprimee = liste_actuelle.pop(index_a_supprimer)
80
- message = f"Ligne supprimée : '{ligne_supprimee}'"
81
- else:
82
- message = "Aucune ligne sélectionnée pour suppression"
83
- return liste_actuelle, liste_actuelle, message # Liste mise à jour, choix mis à jour, message
84
-
85
- def apprendre(liste_actuelle):
86
- global max_sequence_len
87
- # Traiter la liste finale
88
- resultat = ", ".join(liste_actuelle)
89
- print("Liste soumise:", liste_actuelle) # Pour voir dans la console
90
- # analyse du texte
91
- tokenizer.fit_on_texts(liste_actuelle)
92
- total_words = len(tokenizer.word_index) + 1
93
- print("nb de mots différents rencontrés :", total_words)
94
- type(tokenizer.word_index)
95
- #from dict to list
96
- liste = list(tokenizer.word_index.keys())
97
- print("voici les premiers mots trouvés : ")
98
- for i in range(10): print(f"({i+1}:'{liste[i]}')", end= ", ")
99
- print()
100
- # transformation des textes en vecteurs
101
- input_sequences = []
102
- for sentence in liste_actuelle:
103
- token_list = tokenizer.texts_to_sequences([sentence])[0]
104
- for i in range(1, len(token_list)):
105
- n_gram_sequence = token_list[:i+1]
106
- input_sequences.append(n_gram_sequence)
107
- # calibrage des vecteurs pour qu'ils aient tous la même longueur
108
- max_sequence_len = max([len(x) for x in input_sequences])
109
- input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
110
- print("la phrase '", liste_actuelle[0], "' est traduite en plusieurs vecteurs :")
111
- split = liste_actuelle[0].split()
112
- for i in range(6):
113
- print(input_sequences[i], end=" -> '")
114
- for j in range(i+2):
115
- print(split[j], end=" ")
116
- print("'")
117
- # creer les x (premieres valeurs de chaque vecteur)
118
- X = input_sequences[:, :-1]
119
- # creer les y (derniere valeur de chaque vecteur)
120
- y = input_sequences[:, -1]
121
- # chaque mot de sortie est représenté par un vecteur de 0, avec 1 correspondant à l'indice du mot
122
- #donc le vecteur est aussi grand que le nb de mots trouvés
123
- y = tf.keras.utils.to_categorical(y, num_classes=total_words)
124
  #creation du model
125
- model.add(Embedding(total_words, 50, input_length=max_sequence_len-1))
126
- model.add(GRU(120, return_sequences=False))
127
- model.add(Dense(total_words, activation='softmax'))
128
- # Compile the model
129
- model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
130
- # entrainer le modele
131
- print("patienter 30s pendant l'entrainement...")
132
- model.fit(X, y, epochs=300, verbose=0)
133
- return f"Entrainement effectué, saisissez un début de phrase pour demander la suite"
134
-
135
-
136
- # fonction pour prédire le mot suivant
137
- def predict_next_word(start_text, nb_words):
138
- print("===> start_text=",start_text)
139
- print(f"prédictions de {nb_words} mots.")
140
- for _ in range(nb_words):
141
- token_list = tokenizer.texts_to_sequences([start_text])[0]
142
- token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
143
- print("===> token_list=",token_list)
144
- predicted = np.argmax(model.predict(token_list), axis=-1)
145
- print("===> predicted=",predicted)
146
- for word, index in tokenizer.word_index.items():
147
- if index == predicted:
148
- start_text += " " + word
149
- break
150
- print(f"Prediction: {start_text}")
151
- print("-" * 50)
152
- return start_text
153
-
154
 
155
- with gr.Blocks() as demo:
156
- #ENTETE
157
- gr.Markdown("# Exemple de prévision de mots")
158
- gr.Markdown("Exemple simple, utilisant un réseau de neurone de type **GRU**")
159
- gr.Markdown("- Le réseau 'apprend' les phrases de la liste (vous pouvez en ajouter)")
160
- gr.Markdown("- Cliquez sur apprendre si l'apprentissage n'a pas eu lieu")
161
- gr.Markdown("- Donnez plus bas un début de phrase et laissez le réseau en déduire la suite")
162
 
163
- #Liste de phrases
164
- with gr.Row():
165
- sortie = gr.Textbox(label="Phrases actuelles", lines=5)
166
- liste = gr.State( textes)
167
- # Ajouter et supprimer des lignes
168
- with gr.Column():
169
- texte = gr.Textbox(label="Nouvelle phrase courte")
170
- btn_add = gr.Button("Ajouter")
171
- # Liste déroulante pour sélectionner une ligne à supprimer
172
- choix_ligne = gr.Dropdown(
173
- choices=textes,
174
- label="Sélectionner une ligne à supprimer",
175
- type="index" # Retourne l'index et non la valeur
176
- )
177
- btn_supprimer = gr.Button("Supprimer de la liste")
178
- feedback = gr.Textbox(label="Message", lines=1)
179
- # ajouter une ligne
180
- btn_add.click(
181
- fn=ajouter_a_liste,
182
- inputs=[liste, texte],
183
- outputs=[liste, texte]
184
- ).then(
185
- fn=lambda x: "\n".join(x),
186
- inputs=[liste],
187
- outputs=[sortie]
188
- )
189
- # Supprimer une ligne
190
- btn_supprimer.click(
191
- fn=supprimer_de_liste,
192
- inputs=[liste, choix_ligne],
193
- outputs=[liste, choix_ligne, feedback]
194
- ).then(
195
- fn=afficher_liste,
196
- inputs=[liste],
197
- outputs=[sortie]
198
- )
199
 
200
-
201
- #apprentissage
202
- texte_app = "Apprentissage non réalisé. Cliquez et attendez > 30s"
203
- if len(model.layers) > 0:
204
- texte_app = "Apprentissage déjà réalisé"
205
- with gr.Row():
206
- message_apprentissage = gr.Textbox(label="Résultat de l'apprentissage", value=texte_app)
207
- apprendre_btn = gr.Button("Apprendre")
208
- apprendre_btn.click(
209
- fn=apprendre,
210
- inputs=[liste],
211
- outputs=[message_apprentissage]
212
- )
213
-
214
- #prédiction
215
- with gr.Row():
216
- bout_texte = gr.Textbox(label="Début de phrase ")
217
- with gr.Column():
218
- nb_mots_pred = gr.Slider(
219
- minimum=1,
220
- maximum=6,
221
- value=3,
222
- step=1,
223
- label="Nombre de mots à prédire",
224
- interactive=True
225
- )
226
- btn_suite = gr.Button("Poursuivre")
227
- btn_suite.click(
228
- fn=predict_next_word,
229
- inputs=[bout_texte, nb_mots_pred],
230
- outputs=[bout_texte])
231
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
 
233
  # Afficher la liste initiale au lancement
234
  # demo.load(
 
36
 
37
  # Usage dans votre app Gradio
38
  tf = setup_tensorflow()
39
+ if tf is not None:
40
+ from tensorflow.keras.models import Sequential
41
+ from tensorflow.keras.layers import Embedding, GRU, Dense
42
+ from tensorflow.keras.preprocessing.text import Tokenizer
43
+ from tensorflow.keras.preprocessing.sequence import pad_sequences
44
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  #creation du model
46
+ model = Sequential()
47
+ # analyse du texte
48
+ tokenizer = Tokenizer()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
+ max_sequence_len=0
 
 
 
 
 
 
51
 
52
+ textes = [
53
+ "la goutte d'eau qui fait déborder le vase",
54
+ "Il n'y a pas de fumée sans feu",
55
+ "Il faut battre le fer tant qu'il est chaud",
56
+ "Il ne faut pas mettre tous ses oeufs dans le même panier",
57
+ "Il faut tourner sept fois sa langue dans sa bouche avant de parler",
58
+ "L'habit ne fait pas le moine",
59
+ "Il ne faut pas réveiller le chat qui dort",
60
+ "Il faut se méfier de l'eau qui dort",
61
+ "C'est l'hôpital qui se moque de la charité",
62
+ "Qui vole un oeuf vole un boeuf",
63
+ "Chercher midi à quatorze heures",
64
+ "Avoir un poil dans la main",
65
+ "Être dans de beaux draps",
66
+ "Avoir la tête dans les nuages",
67
+ "Mettre les pieds dans le plat"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
+
70
+ def afficher_liste(liste):
71
+ return "\n".join(liste)
72
+
73
+ def ajouter_a_liste(liste_actuelle, nouveau_texte):
74
+ if nouveau_texte:
75
+ liste_actuelle.append(nouveau_texte)
76
+ return liste_actuelle, ""
77
+
78
+ def supprimer_de_liste(liste_actuelle, index_a_supprimer):
79
+ if index_a_supprimer is not None and 0 <= index_a_supprimer < len(liste_actuelle):
80
+ ligne_supprimee = liste_actuelle.pop(index_a_supprimer)
81
+ message = f"Ligne supprimée : '{ligne_supprimee}'"
82
+ else:
83
+ message = "Aucune ligne sélectionnée pour suppression"
84
+ return liste_actuelle, liste_actuelle, message # Liste mise à jour, choix mis à jour, message
85
+
86
+ def apprendre(liste_actuelle):
87
+ global max_sequence_len
88
+ # Traiter la liste finale
89
+ resultat = ", ".join(liste_actuelle)
90
+ print("Liste soumise:", liste_actuelle) # Pour voir dans la console
91
+ # analyse du texte
92
+ tokenizer.fit_on_texts(liste_actuelle)
93
+ total_words = len(tokenizer.word_index) + 1
94
+ print("nb de mots différents rencontrés :", total_words)
95
+ type(tokenizer.word_index)
96
+ #from dict to list
97
+ liste = list(tokenizer.word_index.keys())
98
+ print("voici les premiers mots trouvés : ")
99
+ for i in range(10): print(f"({i+1}:'{liste[i]}')", end= ", ")
100
+ print()
101
+ # transformation des textes en vecteurs
102
+ input_sequences = []
103
+ for sentence in liste_actuelle:
104
+ token_list = tokenizer.texts_to_sequences([sentence])[0]
105
+ for i in range(1, len(token_list)):
106
+ n_gram_sequence = token_list[:i+1]
107
+ input_sequences.append(n_gram_sequence)
108
+ # calibrage des vecteurs pour qu'ils aient tous la même longueur
109
+ max_sequence_len = max([len(x) for x in input_sequences])
110
+ input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
111
+ print("la phrase '", liste_actuelle[0], "' est traduite en plusieurs vecteurs :")
112
+ split = liste_actuelle[0].split()
113
+ for i in range(6):
114
+ print(input_sequences[i], end=" -> '")
115
+ for j in range(i+2):
116
+ print(split[j], end=" ")
117
+ print("'")
118
+ # creer les x (premieres valeurs de chaque vecteur)
119
+ X = input_sequences[:, :-1]
120
+ # creer les y (derniere valeur de chaque vecteur)
121
+ y = input_sequences[:, -1]
122
+ # chaque mot de sortie est représenté par un vecteur de 0, avec 1 correspondant à l'indice du mot
123
+ #donc le vecteur est aussi grand que le nb de mots trouvés
124
+ y = tf.keras.utils.to_categorical(y, num_classes=total_words)
125
+ #creation du model
126
+ model.add(Embedding(total_words, 50, input_length=max_sequence_len-1))
127
+ model.add(GRU(120, return_sequences=False))
128
+ model.add(Dense(total_words, activation='softmax'))
129
+ # Compile the model
130
+ model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
131
+ # entrainer le modele
132
+ print("patienter 30s pendant l'entrainement...")
133
+ model.fit(X, y, epochs=300, verbose=0)
134
+ return f"Entrainement effectué, saisissez un début de phrase pour demander la suite"
135
+
136
+
137
+ # fonction pour prédire le mot suivant
138
+ def predict_next_word(start_text, nb_words):
139
+ print("===> start_text=",start_text)
140
+ print(f"prédictions de {nb_words} mots.")
141
+ for _ in range(nb_words):
142
+ token_list = tokenizer.texts_to_sequences([start_text])[0]
143
+ token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
144
+ print("===> token_list=",token_list)
145
+ predicted = np.argmax(model.predict(token_list), axis=-1)
146
+ print("===> predicted=",predicted)
147
+ for word, index in tokenizer.word_index.items():
148
+ if index == predicted:
149
+ start_text += " " + word
150
+ break
151
+ print(f"Prediction: {start_text}")
152
+ print("-" * 50)
153
+ return start_text
154
+
155
+
156
+ with gr.Blocks() as demo:
157
+ #ENTETE
158
+ gr.Markdown("# Exemple de prévision de mots")
159
+ gr.Markdown("Exemple simple, utilisant un réseau de neurone de type **GRU**")
160
+ gr.Markdown("- Le réseau 'apprend' les phrases de la liste (vous pouvez en ajouter)")
161
+ gr.Markdown("- Cliquez sur apprendre si l'apprentissage n'a pas eu lieu")
162
+ gr.Markdown("- Donnez plus bas un début de phrase et laissez le réseau en déduire la suite")
163
+
164
+ #Liste de phrases
165
+ with gr.Row():
166
+ sortie = gr.Textbox(label="Phrases actuelles", lines=5)
167
+ liste = gr.State( textes)
168
+ # Ajouter et supprimer des lignes
169
+ with gr.Column():
170
+ texte = gr.Textbox(label="Nouvelle phrase courte")
171
+ btn_add = gr.Button("Ajouter")
172
+ # Liste déroulante pour sélectionner une ligne à supprimer
173
+ choix_ligne = gr.Dropdown(
174
+ choices=textes,
175
+ label="Sélectionner une ligne à supprimer",
176
+ type="index" # Retourne l'index et non la valeur
177
+ )
178
+ btn_supprimer = gr.Button("Supprimer de la liste")
179
+ feedback = gr.Textbox(label="Message", lines=1)
180
+ # ajouter une ligne
181
+ btn_add.click(
182
+ fn=ajouter_a_liste,
183
+ inputs=[liste, texte],
184
+ outputs=[liste, texte]
185
+ ).then(
186
+ fn=lambda x: "\n".join(x),
187
+ inputs=[liste],
188
+ outputs=[sortie]
189
+ )
190
+ # Supprimer une ligne
191
+ btn_supprimer.click(
192
+ fn=supprimer_de_liste,
193
+ inputs=[liste, choix_ligne],
194
+ outputs=[liste, choix_ligne, feedback]
195
+ ).then(
196
+ fn=afficher_liste,
197
+ inputs=[liste],
198
+ outputs=[sortie]
199
+ )
200
+
201
+
202
+ #apprentissage
203
+ texte_app = "Apprentissage non réalisé. Cliquez et attendez > 30s"
204
+ if len(model.layers) > 0:
205
+ texte_app = "Apprentissage déjà réalisé"
206
+ with gr.Row():
207
+ message_apprentissage = gr.Textbox(label="Résultat de l'apprentissage", value=texte_app)
208
+ apprendre_btn = gr.Button("Apprendre")
209
+ apprendre_btn.click(
210
+ fn=apprendre,
211
+ inputs=[liste],
212
+ outputs=[message_apprentissage]
213
+ )
214
+
215
+ #prédiction
216
+ with gr.Row():
217
+ bout_texte = gr.Textbox(label="Début de phrase ")
218
+ with gr.Column():
219
+ nb_mots_pred = gr.Slider(
220
+ minimum=1,
221
+ maximum=6,
222
+ value=3,
223
+ step=1,
224
+ label="Nombre de mots à prédire",
225
+ interactive=True
226
+ )
227
+ btn_suite = gr.Button("Poursuivre")
228
+ btn_suite.click(
229
+ fn=predict_next_word,
230
+ inputs=[bout_texte, nb_mots_pred],
231
+ outputs=[bout_texte])
232
+ else:
233
+ gr.Textbox(label="Pas de tensorflow installé ")
234
 
235
  # Afficher la liste initiale au lancement
236
  # demo.load(