bourdoiscatie commited on
Commit
16558a6
1 Parent(s): 8188462

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -35
app.py CHANGED
@@ -1,9 +1,10 @@
1
  import streamlit as st
 
2
  from transformers import pipeline
3
  from PIL import Image
4
 
5
  st.sidebar.header("**Instructions**")
6
- st.sidebar.markdown("Démonstrateur du modèle [QAmembert](https://huggingface.co/CATIE-AQ/QAmembert) entraîné sur plus de 220 000 contextes/questions/réponses en français. Le modèle est capable d'indiquer si la réponse se situe ou non dans le texte fourni. Il est disponible en version *base* (110M de paramètres) et *large* (335M de paramètres). Pour l'essayer, sélectionnez la version de votre choix ci-dessous, puis renseignez un texte et une question à propos de celui-ci. Enfin appuyez sur le bouton « Appliquer le modèle » pour observer la réponse trouvée par le modèle. Pour ens avoir plus sur ce modèle, vous pouvez lire l'[article de blog](https://blog.vaniila.ai/QA/) détaillant la démarche suvie.")
7
  version = st.sidebar.radio("Choix de la version du modèle :", ["version base", "version large"])
8
  st.sidebar.markdown("---")
9
  st.sidebar.markdown("Ce modèle a été entraîné via la plateforme [*Vaniila*](https://www.vaniila.ai/) du [CATIE](https://www.catie.fr/).")
@@ -15,49 +16,84 @@ st.sidebar.image(image, caption=None, width=None, use_column_width=None, clamp=F
15
  @st.cache_resource
16
  def load_model(version):
17
  if version == "version base":
18
- return pipeline('question-answering', model='CATIE-AQ/QAmembert', tokenizer='CATIE-AQ/QAmembert')
19
  else:
20
- return pipeline('question-answering', model='CATIE-AQ/QAmembert-large', tokenizer='CATIE-AQ/QAmembert-large')
21
-
22
- def results():
23
- col1, col2, col3 = st.columns(3)
24
- if col2.button('Appliquer le modèle'):
25
- result = model(question,context)
26
- st.write("Résultat")
27
- if result['score'] < 0.01:
28
- st.info("La réponse n'est pas dans le contexte fourni.")
29
- else :
30
- st.info(result['answer'])
31
- with st.expander("Voir le détail :"):
32
- st.write("• Score :", result['score'])
33
- st.write("• Début de la réponse :", result['start'])
34
- st.write("• Fin de la réponse :", result['end'])
35
- st.write("• Réponse :", result['answer'])
36
- pass
 
 
 
 
 
 
 
 
 
 
 
37
 
 
 
 
 
 
 
 
 
38
 
39
- st.markdown("<h2 style='text-align: center'>QAmembert", unsafe_allow_html=True)
40
  st.markdown("<h4 style='text-align: center'>"+version, unsafe_allow_html=True)
41
  model = load_model(version)
42
 
43
  option = st.selectbox(
44
  'Choix du mode',
45
- ('Texte libre', 'Exemple 1', 'Exemple 2'))
46
 
47
  if option == "Exemple 1":
48
- context = st.text_area("Votre texte", value="Le français est une langue indo-européenne de la famille des langues romanes dont les locuteurs sont appelés francophones. Elle est parfois surnommée la langue de Molière. Le français est parlé, en 2023, sur tous les continents par environ 321 millions de personnes : 235 millions l'emploient quotidiennement et 90 millions en sont des locuteurs natifs. En 2018, 80 millions d'élèves et étudiants s'instruisent en français dans le monde. Selon l'Organisation internationale de la francophonie (OIF), il pourrait y avoir 700 millions de francophones sur Terre en 2050.",height=175)
49
- question = st.text_input("Votre question", value="Combien de personnes utilisent le français tous les jours ?")
50
- if context and question:
51
- results()
52
-
53
- elif option == "Exemple 2":
54
- context = st.text_area("Votre texte", value="Le français est une langue indo-européenne de la famille des langues romanes dont les locuteurs sont appelés francophones. Elle est parfois surnommée la langue de Molière. Le français est parlé, en 2023, sur tous les continents par environ 321 millions de personnes : 235 millions l'emploient quotidiennement et 90 millions en sont des locuteurs natifs. En 2018, 80 millions d'élèves et étudiants s'instruisent en français dans le monde. Selon l'Organisation internationale de la francophonie (OIF), il pourrait y avoir 700 millions de francophones sur Terre en 2050.",height=175)
55
- question = st.text_input("Votre question", value="Quel est le meilleur vin du monde ?")
56
- if context and question:
57
- results()
 
 
 
 
58
 
59
  else:
60
- context = st.text_area("Votre texte", value="",height=175)
61
- question = st.text_input("Votre question", value="")
62
- if context and question:
63
- results()
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ from annotated_text import annotated_text
3
  from transformers import pipeline
4
  from PIL import Image
5
 
6
  st.sidebar.header("**Instructions**")
7
+ st.sidebar.markdown("Démonstrateur du modèle [Camembert-NER](CATIE-AQ/Camembert-NER-base-frenchNER) entraîné sur plus de 425 000 données en français. Le modèle est capable d'étiquetter les entités LOC (Localisation), PER (Personne), ORG (Organisation) dans le texte fourni. Il est disponible en version *base* (110M de paramètres) et *large* (335M de paramètres). Pour l'essayer, sélectionnez la version de votre choix ci-dessous, puis renseignez un texte. Enfin appuyez sur le bouton « Appliquer le modèle » pour observer la réponse trouvée par le modèle. Pour en savoir plus sur ce modèle, vous pouvez lire l'[article de blog](https://blog.vaniila.ai/NER/) détaillant la démarche suvie.")
8
  version = st.sidebar.radio("Choix de la version du modèle :", ["version base", "version large"])
9
  st.sidebar.markdown("---")
10
  st.sidebar.markdown("Ce modèle a été entraîné via la plateforme [*Vaniila*](https://www.vaniila.ai/) du [CATIE](https://www.catie.fr/).")
 
16
  @st.cache_resource
17
  def load_model(version):
18
  if version == "version base":
19
+ return pipeline('token-classification', model='bourdoiscatie/Camembert-NER-base-frenchNER', tokenizer='bourdoiscatie/Camembert-NER-base-frenchNER', grouped_entities=True)
20
  else:
21
+ return pipeline('token-classification', model='bourdoiscatie/Camembert-NER-base-frenchNER', tokenizer='bourdoiscatie/Camembert-NER-base-frenchNER', grouped_entities=True)
22
+
23
+ def getcolor(texts, labels):
24
+ colors = {'LOC': '#8ef', 'PER': '#faa', 'ORG': '#afa'}
25
+ return [(t,l,colors[l]) for t, l in zip(texts, labels)]
26
+
27
+ def color_annotation(to_print,transcript) :
28
+ text_ner = []
29
+ label_ner = []
30
+ for i in range(len(to_print)) :
31
+ text_ner.append(to_print[i]["word"])
32
+ label_ner.append(to_print[i]["entity_group"])
33
+
34
+ anns = getcolor(text_ner, label_ner)
35
+ anns = list(set(anns))
36
+ text_ner = list(set(text_ner))
37
+ text_ner = list(sorted(text_ner, key = len))
38
+
39
+ display = transcript.replace(" ",' ","')
40
+ for i in range(len(anns)):
41
+ for j in range(len(text_ner)):
42
+ if text_ner[j] == anns[i][0]:
43
+ display = display.replace(text_ner[j].replace(" ",' ","'),str(anns[i]))
44
+ display = display.replace(', ","',',').replace(".","")
45
+
46
+ for i in re.findall(r"\((.*?)\)", display) : # pour gérer les cas de mots inclus dans des n_grams
47
+ if "(" in i:
48
+ display = display.replace(i+")",i.split(",")[0].replace("('","")).replace("''","'")
49
 
50
+ # sanity check
51
+ display = display.replace(")",')","').replace(')","","',')","').replace("(",'","(').replace('","","(','","(')
52
+
53
+ return display
54
+
55
+
56
+
57
+
58
 
59
+ st.markdown("<h2 style='text-align: center'>Camembert-NER", unsafe_allow_html=True)
60
  st.markdown("<h4 style='text-align: center'>"+version, unsafe_allow_html=True)
61
  model = load_model(version)
62
 
63
  option = st.selectbox(
64
  'Choix du mode',
65
+ ('Texte libre', 'Exemple'))
66
 
67
  if option == "Exemple 1":
68
+ text = st.text_area("Votre texte", value="Assurés de disputer l'Euro 2024 en Allemagne l'été prochain (du 14 juin au 14 juillet) depuis leur victoire aux Pays-Bas, les Bleus ont fait le nécessaire pour avoir des certitudes. Avec six victoires en six matchs officiels et un seul but encaissé, Didier Deschamps a consolidé les acquis de la dernière Coupe du monde. Les joueurs clés sont connus : Kylian Mbappé, Aurélien Tchouameni, Antoine Griezmann, Ibrahima Konaté ou encore Mike Maignan.",height=175)
69
+ if text:
70
+ display = color_annotation(pipeline_ner(text),text)[0]
71
+ list_to_display = [] # pour pouvoir afficher la couleur, on doit passer les mots à colorier de str en tuple
72
+ for i in range(len(display.split('","'))):
73
+ if "(" in display.split('","')[i]:
74
+ list_to_display.append(eval(display.split('","')[i]))
75
+ else :
76
+ list_to_display.append(display.split('","')[i])
77
+ annotated_text(*list_to_display)
78
+ st.write("\n")
79
+ with st.expander("Afficher le score pour chacune des entitées trouvées :"):
80
+ for i in range(len(to_print)) :
81
+ st.write("- Score pour que ",to_print[i]["word"]," soit de type", to_print[i]["entity_group"]," : ",round(to_print[i]["score"],3))
82
 
83
  else:
84
+ text = st.text_area("Votre texte", value="",height=175)
85
+ if text:
86
+ col1, col2, col3 = st.columns(3)
87
+ if col2.button('Appliquer le modèle'):
88
+ display = color_annotation(pipeline_ner(text),text)[0]
89
+ list_to_display = [] # pour pouvoir afficher la couleur, on doit passer les mots à colorier de str en tuple
90
+ for i in range(len(display.split('","'))):
91
+ if "(" in display.split('","')[i]:
92
+ list_to_display.append(eval(display.split('","')[i]))
93
+ else :
94
+ list_to_display.append(display.split('","')[i])
95
+ annotated_text(*list_to_display)
96
+ st.write("\n")
97
+ with st.expander("Afficher le score pour chacune des entitées trouvées :"):
98
+ for i in range(len(to_print)) :
99
+ st.write("- Score pour que ",to_print[i]["word"]," soit de type", to_print[i]["entity_group"]," : ",round(to_print[i]["score"],3))