Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import tiktoken | |
| import joblib | |
| import json | |
| import csv | |
| from transformers import pipeline | |
| import keras | |
| from tensorflow.keras.preprocessing.sequence import pad_sequences | |
| from sklearn.preprocessing import LabelEncoder | |
| from tensorflow.keras.utils import plot_model | |
| from filesplit.merge import Merge | |
| from extra_streamlit_components import tab_bar, TabBarItemData | |
| from sklearn.decomposition import PCA | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| from sklearn import naive_bayes | |
| from translate_app import tr | |
| title = "Identification de langue" | |
| sidebar_name = "Identification de langue" | |
| dataPath = st.session_state.DataPath | |
| # CountVectorizer a une liste de phrase en entrée. | |
| # Cette fonction met les données d'entrée dans le bon format | |
| def format_to_vectorize(data): | |
| X_tok = [] | |
| if "DataFrame" in str(type(data)):sentences = data.tolist() | |
| elif "str" in str(type(data)): | |
| sentences =[data] | |
| else: sentences = data | |
| for sentence in sentences: | |
| X_tok.append(sentence) | |
| return X_tok | |
| def create_BOW(data): | |
| global vectorizer | |
| X_tok = format_to_vectorize(data) | |
| X = vectorizer.transform(X_tok) | |
| return X | |
| def load_vectorizer(tokenizer): | |
| global dict_token, dict_ids, nb_token | |
| path = dataPath+'/vectorizer_tiktoken_big.pkl' | |
| vectorizer = joblib.load(path) | |
| dict_token = {tokenizer.decode([cle]): cle for cle, valeur in vectorizer.vocabulary_.items()} | |
| dict_ids = {cle: tokenizer.decode([cle]) for cle, valeur in vectorizer.vocabulary_.items()} #dict_ids.items()} | |
| nb_token = len(vectorizer.vocabulary_) | |
| return vectorizer | |
| def lang_id_nb(sentences): | |
| global lan_to_language | |
| if "str" in str(type(sentences)): | |
| return lan_to_language[clf_nb.predict(create_BOW(sentences))[0]] | |
| else: return [lan_to_language[l] for l in clf_nb.predict(create_BOW(sentences))] | |
| def init_nb_identifier(): | |
| tokenizer = tiktoken.get_encoding("cl100k_base") | |
| # Chargement du classificateur sauvegardé | |
| clf_nb = joblib.load(dataPath+"/id_lang_tiktoken_nb_sparse_big.pkl") | |
| vectorizer = load_vectorizer(tokenizer) | |
| # Lisez le contenu du fichier JSON | |
| with open(dataPath+'/multilingue/lan_to_language.json', 'r') as fichier: | |
| lan_to_language = json.load(fichier) | |
| return tokenizer, dict_token, dict_ids, nb_token, lan_to_language, clf_nb, vectorizer | |
| def encode_text(textes): | |
| global tokenizer | |
| max_length=250 | |
| sequences = tokenizer.encode_batch(textes) | |
| return pad_sequences(sequences, maxlen=max_length, padding='post') | |
| def read_list_lan(): | |
| with open(dataPath+'/multilingue/lan_code.csv', 'r') as fichier_csv: | |
| reader = csv.reader(fichier_csv) | |
| lan_code = next(reader) | |
| return lan_code | |
| def init_dl_identifier(): | |
| label_encoder = LabelEncoder() | |
| list_lan = read_list_lan() | |
| lan_identified = [lan_to_language[l] for l in list_lan] | |
| label_encoder.fit(list_lan) | |
| merge = Merge(dataPath+"/dl_id_lang_split", dataPath, "dl_tiktoken_id_language_model.h5").merge(cleanup=False) | |
| dl_model = keras.models.load_model(dataPath+"/dl_tiktoken_id_language_model.h5") | |
| return dl_model, label_encoder, list_lan, lan_identified | |
| def lang_id_dl(sentences): | |
| global dl_model, label_encoder | |
| if "str" in str(type(sentences)): predictions = dl_model.predict(encode_text([sentences])) | |
| else: predictions = dl_model.predict(encode_text(sentences)) | |
| # Décodage des prédictions en langues | |
| predicted_labels_encoded = np.argmax(predictions, axis=1) | |
| predicted_languages = label_encoder.classes_[predicted_labels_encoded] | |
| if "str" in str(type(sentences)): return lan_to_language[predicted_languages[0]] | |
| else: return [l for l in predicted_languages] | |
| def init_lang_id_external(): | |
| lang_id_model_ext = pipeline('text-classification',model="papluca/xlm-roberta-base-language-detection") | |
| dict_xlmr = {"ar":"ara", "bg":"bul", "de":"deu", "el": "ell", "en":"eng", "es":"spa", "fr":"fra", "hi": "hin","it":"ita","ja":"jpn", \ | |
| "nl":"nld", "pl":"pol", "pt":"por", "ru":"rus", "sw":"swh", "th":"tha", "tr":"tur", "ur": "urd", "vi":"vie", "zh":"cmn"} | |
| sentence_test = pd.read_csv(dataPath+'//multilingue/sentence_test_extract.csv') | |
| sentence_test = sentence_test[:4750] | |
| # Instanciation d'un exemple | |
| exemples = ["Er weiß überhaupt nichts über dieses Buch", # Phrase 0 | |
| "Umbrellas sell well", # Phrase 1 | |
| "elle adore les voitures très luxueuses, et toi ?", # Phrase 2 | |
| "she loves very luxurious cars, don't you?", # Phrase 3 | |
| "Vogliamo visitare il Colosseo e nuotare nel Tevere", # Phrase 4 | |
| "vamos a la playa", # Phrase 5 | |
| "Te propongo un trato", # Phrase 6 | |
| "she loves you much, mais elle te hait aussi and das ist traurig", # Phrase 7 # Attention à cette phrase trilingue | |
| "Elle a de belles loches" # Phrase 8 | |
| ] | |
| lang_exemples = ['deu','eng','fra','eng','ita','spa','spa','fra','fra'] | |
| return lang_id_model_ext, dict_xlmr, sentence_test, lang_exemples, exemples | |
| def display_acp(title, comment): | |
| data = np.load(dataPath+'/data_lang_id_acp.npz') | |
| X_train_scaled = data['X_train_scaled'] | |
| y_train_pred = data['y_train_pred'] | |
| label_arrow = ['.', ',', '?', ' a', ' de', ' la', ' que', 'Tom', ' un', ' the', ' in', \ | |
| ' to', 'I', "'", 'i', ' le', ' en', ' es', 'é', ' l', '!', 'o', ' ist', \ | |
| ' pas', ' Tom', ' me', ' di', 'Ich', ' is', 'Je', ' nicht', ' you', \ | |
| ' die', ' à', ' el', ' est', 'a', 'en', ' d', ' è', ' ne', ' se', ' no', \ | |
| ' una', ' zu', 'Il', '¿', ' of', ' du', "'t", 'ato', ' der', ' il', \ | |
| ' n', 'El', ' non', ' che', 'are', ' con', 'ó', ' was', 'La', 'No', \ | |
| ' ?', 'es', 'le', 'L', ' and', ' des', ' s', ' ich', 'as', 'S', ' per', \ | |
| ' das', ' und', ' ein', 'e', "'s", 'u', ' y', 'He', 'z', 'er', ' m', \ | |
| 'st', ' les', 'Le', ' I', 'ar', 'te', 'Non', 'The', ' er', 'ie', ' v', \ | |
| ' c', "'est", ' ha', ' den'] | |
| pca = PCA(n_components=2) | |
| X_new = pca.fit_transform(X_train_scaled) | |
| coeff = pca.components_.transpose() | |
| xs = X_new[:, 0] | |
| ys = X_new[:, 1] | |
| scalex = 1.0/(xs.max() - xs.min()) | |
| scaley = 1.0/(ys.max() - ys.min()) | |
| principalDf = pd.DataFrame({'PC1': xs*scalex, 'PC2': ys * scaley}) | |
| finalDF = pd.concat([principalDf, pd.Series(y_train_pred, name='Langue')], axis=1) | |
| sns.set_context("poster") # Valeur possible:"notebook", "talk", "poster", ou "paper" | |
| plt.rc("axes", titlesize=32,titleweight='bold') # Taille du titre de l'axe | |
| plt.rc("axes", labelsize=18,labelweight='bold') # Taille des étiquettes de l'axe | |
| plt.rc("xtick", labelsize=14) # Taille des étiquettes de l'axe des x | |
| plt.rc("ytick", labelsize=14) # Taille des étiquettes de l'axe des y | |
| st.write(comment) | |
| st.write("") | |
| fig = plt.figure(figsize=(20, 15)) | |
| sns.scatterplot(x='PC1', y='PC2', hue='Langue', data=finalDF, alpha=0.5) | |
| for i in range(50): | |
| plt.arrow(0, 0, coeff[i, 0]*1.5, coeff[i, 1]*0.8,color='k', alpha=0.08, head_width=0.01, ) | |
| plt.text(coeff[i, 0]*1.5, coeff[i, 1] * 0.8, label_arrow[i], color='k', weight='bold') | |
| plt.title(title) | |
| plt.xlim(-0.4, 0.45) | |
| plt.ylim(-0.15, 0.28); | |
| st.pyplot(fig) | |
| return | |
| def read_BOW_examples(): | |
| return pd.read_csv(dataPath+'/lang_id_small_BOW.csv') | |
| def analyse_nb(sel_phrase): | |
| global lang_exemples,exemples | |
| def create_small_BOW(s): | |
| encodage = tokenizer.encode(s) | |
| sb = [0] * (df_BOW.shape[1]-1) | |
| nb_unique_token = 0 | |
| for i in range(df_BOW.shape[1]-1): | |
| for t in encodage: | |
| if df_BOW.columns[i]==str(t): | |
| sb[i] += 1 | |
| if sb[i] > 0: nb_unique_token +=1 | |
| return sb, nb_unique_token | |
| st.write("#### **"+tr("Probabilité d'appartenance de la phrase à une langue")+" :**") | |
| st.image("./assets/formule_proba_naive_bayes.png") | |
| st.write(tr("où **C** est la classe (lan_code), **Fi** est la caractéristique i du BOW, **Z** est l'\"evidence\" servant à regulariser la probabilité")) | |
| st.write("") | |
| nb_lang = 5 | |
| lan_code = ['deu','eng','fra','spa','ita'] | |
| lan_color = {'deu':'violet','eng':'green','fra':'red','spa':'blue','ita':'orange'} | |
| df_BOW = read_BOW_examples() | |
| clf_nb2 = naive_bayes.MultinomialNB() | |
| clf_nb2.fit(df_BOW.drop(columns='lan_code').values.tolist(), df_BOW['lan_code'].values.tolist()) | |
| nb_phrases_lang =[] | |
| for l in lan_code: | |
| nb_phrases_lang.append(sum(df_BOW['lan_code']==l)) | |
| st.write(tr("Phrase à analyser")+" :",'**:'+lan_color[lang_exemples[sel_phrase]]+'['+lang_exemples[sel_phrase],']** - **"'+exemples[sel_phrase]+'"**') | |
| # Tokenisation et encodage de la phrase | |
| encodage = tokenizer.encode(exemples[sel_phrase]) | |
| # Création du vecteur BOW de la phrase | |
| bow_exemple, nb_unique_token = create_small_BOW(exemples[sel_phrase]) | |
| st.write(tr("Nombre de tokens retenus dans le BOW")+": "+ str(nb_unique_token)) | |
| masque_tokens_retenus = [(1 if token in list(dict_ids.keys()) else 0) for token in encodage] | |
| str_token = " " | |
| for i in range(len(encodage)): | |
| if masque_tokens_retenus[i]==1: | |
| if (i%2) ==0: | |
| str_token += "**:red["+tokenizer.decode([encodage[i]])+"]** " | |
| else: | |
| str_token += "**:violet["+tokenizer.decode([encodage[i]])+"]** " | |
| else: str_token += ":green["+tokenizer.decode([encodage[i]])+"] " | |
| st.write(tr("Tokens se trouvant dans le modèle (en")+" :red["+tr("rouge")+"] "+tr("ou")+" :violet["+tr("violet")+"]) :"+str_token+" ") | |
| st.write("") | |
| # Afin de continuer l'analyse on ne garde que les token de la phrase disponibles dans le BOW | |
| token_used = [str(encodage[i]) for i in range(len(encodage)) if (masque_tokens_retenus[i]==1)] | |
| # Calcul du nombre d'apparition de ces tokens dans le BOW pour chaque langue, et stockage dans un DataFrame df_count | |
| def compter_non_zero(colonne): | |
| return (colonne != 0).sum() | |
| votes = [] | |
| for i in range(nb_lang): | |
| #votes.append(list(df_BOW[token_used].loc[df_BOW['lan_code']==lan_code[i]].sum(axis=0))) | |
| votes.append(list(df_BOW[token_used].loc[df_BOW['lan_code']==lan_code[i]].apply(compter_non_zero))) | |
| col_name = [str(i+1)+'-'+tokenizer.decode([int(token_used[i])]) for i in range(len(token_used))] | |
| df_count = pd.DataFrame(data=votes,columns=token_used, index=lan_code) | |
| df_count.columns = col_name | |
| st.write("\n**"+tr("Nombre d'apparitions des tokens, dans chaque langue")+"**") | |
| # Lissage de Laplace n°1 (Laplace smoothing ) | |
| # df_count = df_count+1 | |
| st.dataframe(df_count) | |
| ######### | |
| ######### 3. Calcul de la probabilité d'apparition de chaque token dans chaque langue | |
| df_proba = df_count.div(nb_phrases_lang, axis = 0) | |
| # Lissage de Laplace n°2 (Laplace smoothing ) | |
| df_proba = df_proba.replace(0.0,0.0010) | |
| # Initialisation de df_proba: Calcul de la probabilité conditionnelle d'appartenance de la phrase à une langue | |
| df_proba['Proba'] = 1 | |
| # Itérer sur les colonnes et effectuez la multiplication pour chaque ligne | |
| for col in df_count.columns: | |
| df_proba['Proba'] *= df_proba[col] | |
| ######### | |
| ######### 4. Calcul (par multiplication) de la probabilité d'appartenance de la phrase à une langue | |
| # Multiplication par la probabilité de la classe | |
| p_classe = [(nb_phrases_lang[i]/df_BOW.shape[0]) for i in range(len(nb_phrases_lang))] | |
| df_proba['Proba'] *= p_classe | |
| # Diviser par l'evidence | |
| evidence = df_proba['Proba'].sum(axis=0) | |
| df_proba['Proba'] *= 1/evidence | |
| df_proba['Proba'] = df_proba['Proba'].round(3) | |
| # Affichage de la matrice des probabilités | |
| st.write("**"+tr("Probabilités conditionnelles d'apparition des tokens retenus, dans chaque langue")+":**") | |
| st.dataframe(df_proba) | |
| str_token = "Lang proba max: "# "*20 | |
| for i,token in enumerate(df_proba.columns[:-1]): | |
| str_token += '*'+token+'*:**:'+lan_color[df_proba[token].idxmax()]+'['+df_proba[token].idxmax()+']**'+" "*2 #8 | |
| st.write(str_token) | |
| st.write("") | |
| st.write(tr("Langue réelle de la phrase")+" "*35+": **:"+lan_color[lang_exemples[sel_phrase]]+'['+lang_exemples[sel_phrase]+']**') | |
| st.write(tr("Langue dont la probabilité est la plus forte ")+": **:"+lan_color[df_proba['Proba'].idxmax()]+'['+df_proba['Proba'].idxmax(),"]** (proba={:.2f}".format(max(df_proba['Proba']))+")") | |
| prediction = clf_nb2.predict([bow_exemple]) | |
| st.write(tr("Langue prédite par Naiva Bayes")+" "*23+": **:"+lan_color[prediction[0]]+'['+prediction[0]+"]** (proba={:.2f}".format(max(clf_nb2.predict_proba([bow_exemple])[0]))+")") | |
| st.write("") | |
| fig, axs = plt.subplots(1, 2, figsize=(10, 6)) | |
| df_proba_sorted =df_proba.sort_index(ascending=True) | |
| axs[0].set_title(tr("Probabilités calculée manuellement"), fontsize=12) | |
| axs[0].barh(df_proba_sorted.index, df_proba_sorted['Proba']) | |
| axs[1].set_title(tr("Probabilités du classifieur Naive Bayes"), fontsize=12) | |
| axs[1].barh(df_proba_sorted.index, clf_nb2.predict_proba([bow_exemple])[0]); | |
| st.pyplot(fig) | |
| return | |
| #@st.cache_data | |
| def find_exemple(lang_sel): | |
| global exemples | |
| return exemples[lang_sel] | |
| def display_shapley(lang_sel): | |
| st.write("**"+tr("Analyse de l'importance de chaque token dans l'identification de la langue")+"**") | |
| st.image('assets/fig_schapley'+str(lang_sel)+'.png') | |
| st.write("**"+tr("Recapitulatif de l'influence des tokens sur la selection de la langue")+"**") | |
| st.image('assets/fig_schapley_recap'+str(lang_sel)+'.png') | |
| return | |
| def run(): | |
| global tokenizer, vectorizer, dict_token, dict_ids, nb_token, lan_to_language, clf_nb | |
| global dl_model, label_encoder, toggle_val, custom_sentence, list_lan, lan_identified | |
| global lang_exemples, exemples | |
| tokenizer, dict_token, dict_ids, nb_token, lan_to_language, clf_nb, vectorizer = init_nb_identifier() | |
| dl_model, label_encoder, list_lan, lan_identified = init_dl_identifier() | |
| lang_id_model_ext, dict_xlmr, sentence_test, lang_exemples, exemples= init_lang_id_external() | |
| st.write("") | |
| st.title(tr(title)) | |
| st.write("## **"+tr("Explications")+" :**\n") | |
| st.markdown(tr( | |
| """ | |
| Afin de mettre en oeuvre cette fonctionnalité nous avons utilisé un jeu d'entrainement multilinge de <b> 9.757.778 phrases dans 95 langues</b>. | |
| Les 95 langues identifiées sont: | |
| """) | |
| , unsafe_allow_html=True) | |
| st.selectbox(label="Lang",options=sorted(lan_identified),label_visibility="hidden") | |
| st.markdown(tr( | |
| """ | |
| Nous avons utilisé 2 méthodes pour identifier la langue d'un texte: | |
| 1. un classificateur **Naïve Bayes** | |
| 2. un modèle de **Deep Learning** | |
| """) | |
| , unsafe_allow_html=True) | |
| st.markdown(tr( | |
| """ | |
| Les 2 modèles ont un accuracy similaire sur le jeu de test: **:red[96% pour NB et 97,5% pour DL]** | |
| <br> | |
| """) | |
| , unsafe_allow_html=True) | |
| chosen_id = tab_bar(data=[ | |
| TabBarItemData(id="tab1", title=tr("Id. Naïve Bayes"), description=tr("avec le Bag Of Words")), | |
| TabBarItemData(id="tab2", title=tr("Id. Deep Learning"), description=tr(" avec Keras")), | |
| TabBarItemData(id="tab3", title=tr("Interpretabilité"), description=tr("du modèle Naïve Bayes "))], | |
| default="tab1") | |
| if (chosen_id == "tab1") or (chosen_id == "tab2"): | |
| st.write("## **"+tr("Paramètres")+" :**\n") | |
| toggle_val = st.toggle(tr('Phrase à saisir/Phrase test'), value=True, help=tr("Off = phrase à saisir, On = selection d'une phrase test parmi 9500 phrases")) | |
| if toggle_val: | |
| custom_sentence= st.selectbox(tr("Selectionnez une phrases test à identifier")+":", sentence_test['sentence'] ) | |
| else: | |
| custom_sentence = st.text_area(label=tr("Saisir le texte dont vous souhaitez identifier la langue:")) | |
| st.button(label=tr("Validez"), type="primary") | |
| if custom_sentence!='': | |
| st.write("## **"+tr("Résultats")+" :**\n") | |
| md = """ | |
| |"""+tr("Identifieur")+""" |"""+tr("Langue identifiée")+"""| | |
| |-------------------------------------|---------------|""" | |
| md1 = "" | |
| if toggle_val: | |
| lan_reelle = sentence_test['lan_code'].loc[sentence_test['sentence']==custom_sentence].tolist()[0] | |
| md1 = """ | |
| |"""+tr("Langue réelle")+""" |**:blue["""+lan_to_language[lan_reelle]+"""]**|""" | |
| md2 = """ | |
| |"""+tr("Classificateur Naïve Bayes")+""" |**:red["""+lang_id_nb(custom_sentence)+"""]**| | |
| |"""+tr("Modèle de Deep Learning")+""" |**:red["""+lang_id_dl(custom_sentence)+"""]**|""" | |
| md3 = """ | |
| |XLM-RoBERTa (Hugging Face) |**:red["""+lan_to_language[dict_xlmr[lang_id_model_ext(custom_sentence)[0]['label']]]+"""]**|""" | |
| if toggle_val: | |
| if not (lan_reelle in list(dict_xlmr.values())): | |
| md3="" | |
| st.markdown(md+md1+md2+md3, unsafe_allow_html=True) | |
| st.write("## **"+tr("Details sur la méthode")+" :**\n") | |
| if (chosen_id == "tab1"): | |
| st.markdown(tr( | |
| """ | |
| Afin d'utiliser le classificateur Naïve Bayes, il nous a fallu:""")+"\n"+ | |
| "* "+tr("Créer un Bag of Words de token..")+"\n"+ | |
| "* "+tr("..Tokeniser le texte d'entrainement avec CountVectorizer et un tokenizer 'custom', **Tiktoken** d'OpenAI. ")+"\n"+ | |
| "* "+tr("Utiliser des matrices creuses (Sparse Matrix), car notre BOW contenait 10 Millions de lignes x 59122 tokens. ")+"\n"+ | |
| "* "+tr("Sauvegarder le vectorizer (non serialisable) et le classificateur entrainé. ") | |
| , unsafe_allow_html=True) | |
| st.markdown(tr( | |
| """ | |
| L'execution de toutes ces étapes est assez rapide: une dizaine de minutes | |
| <br> | |
| Le résultat est très bon: L'Accuracy sur le jeu de test est = | |
| **:red[96%]** sur les 95 langues, et **:red[99,1%]** sur les 5 langues d'Europe de l'Ouest (en,fr,de,it,sp) | |
| <br> | |
| """) | |
| , unsafe_allow_html=True) | |
| st.markdown(tr( | |
| """ | |
| **Note 1:** Les 2 modèles ont un accuracy similaire sur le jeu de test: **:red[96% pour NB et 97,5% pour DL]** | |
| **Note 2:** Le modèle *XLM-RoBERTa* de Hugging Face (qui identifie 20 langues seulement) a une accuracy, sur notre jeu de test = **97,8%**, | |
| versus **99,3% pour NB** et **99,2% pour DL** sur ces 20 langues. | |
| """) | |
| , unsafe_allow_html=True) | |
| else: | |
| st.markdown(tr( | |
| """ | |
| Nous avons mis en oeuvre un modèle Keras avec une couche d'embedding et 4 couches denses (*Voir architecture ci-dessous*). | |
| Nous avons utilisé le tokeniser <b>Tiktoken</b> d'OpenAI. | |
| La couche d'embedding accepte 250 tokens, ce qui signifie que la détection de langue s'effectue sur approximativement les 200 premiers mots. | |
| <br> | |
| """) | |
| , unsafe_allow_html=True) | |
| st.markdown(tr( | |
| """ | |
| L'entrainement a duré plus de 10 heures.. | |
| Finalement, le résultat est très bon: L'Accuracy sur le jeu de test est = | |
| **:red[97,5%]** sur les 95 langues, et **:red[99,1%]** sur les 5 langues d'Europe de l'Ouest (en,fr,de,it,sp). | |
| Néanmoins, la durée pour une prédiction est relativement longue: approximativement 5/100 de seconde | |
| <br> | |
| """) | |
| , unsafe_allow_html=True) | |
| st.markdown(tr( | |
| """ | |
| **Note 1:** Les 2 modèles ont un accuracy similaire sur le jeu de test: **:red[96% pour NB et 97,5% pour DL]**""")+"<br>"+ | |
| tr(""" | |
| **Note 2:** Le modèle *XLM-RoBERTa* de Hugging Face (qui identifie 20 langues seulement) a une accuracy, sur notre jeu de test = <b>97,8%</b>, | |
| versus **99,3% pour NB** et **99,2% pour DL** sur ces 20 langues. | |
| <br> | |
| """) | |
| , unsafe_allow_html=True) | |
| st.write("<center><h5>"+tr("Architecture du modèle utilisé")+":</h5></center>", unsafe_allow_html=True) | |
| plot_model(dl_model, show_shapes=True, show_layer_names=True, show_layer_activations=True,rankdir='TB',to_file='./assets/model_plot.png') | |
| col1, col2, col3 = st.columns([0.15,0.7,0.15]) | |
| with col2: | |
| st.image('./assets/model_plot.png',use_column_width="auto") | |
| elif (chosen_id == "tab3"): | |
| st.write("### **"+tr("Interpretabilité du classifieur Naïve Bayes sur 5 langues")+"**") | |
| st.write("##### "+tr("..et un Training set réduit (15000 phrases et 94 tokens)")) | |
| st.write("") | |
| chosen_id2 = tab_bar(data=[ | |
| TabBarItemData(id="tab1", title=tr("Analyse en Compos. Princ."), description=""), | |
| TabBarItemData(id="tab2", title=tr("Simul. calcul NB"), description=""), | |
| TabBarItemData(id="tab3", title=tr("Shapley"), description="")], | |
| default="tab1") | |
| if (chosen_id2 == "tab1"): | |
| display_acp(tr("Importance des principaux tokens dans \n l'identification de langue par l'algorithme Naive Bayes"),tr("Affichage de 10 000 phrases (points) et des 50 tokens les + utilisés (flèches)")) | |
| if (chosen_id2 == "tab2") or (chosen_id2 == "tab3"): | |
| sel_phrase = st.selectbox(tr('Selectionnez une phrase à "interpréter"')+':', range(9), format_func=find_exemple) | |
| if (chosen_id2 == "tab2"): | |
| analyse_nb(sel_phrase) | |
| if (chosen_id2 == "tab3"): | |
| display_shapley(sel_phrase) | |