2023-01-23

How to display/put/use LDA model in my dash app

I would like to display/use/put my LDA model in my dash app. Here's the code for the LDA model which works and that I've saved in html on my computer :

# Libraries
import spacy
from gensim.corpora import Dictionary
from gensim.models import LdaModel
import pyLDAvis.gensim_models
import pandas as pd 

nlp_teletravail = spacy.load("fr_core_news_sm")

# Create df for the example
data = [['tweet content in french'], ['tweet 2 content in french'], ['tweet 3 content in french']] # lots of tweets and other columns but not useful for the example
  
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['Preprocessed_tweets'])

spacy_docs_teletravail = list(nlp_teletravail.pipe(df["Preprocessed_tweets"]))

# Create empty list called docs_teletravail
docs_teletravail = []

# Pre processing
# For each document in spacy_docs_teletravail
for doc in spacy_docs_teletravail:
    # We create empty list called tokens_teletravail
    tokens_teletravail = []
    # for each token in each document of spacy_docs_teletravail
    for token in doc:
        # pre processing 1 and 2
        if len(token.orth_) > 2 and not token.is_stop:     
            # pre processing 3 and 4
            tokens_teletravail.append( token.lemma_.lower() ) 
            # append results of tokens_teletravail in docs_teletravail
    docs_teletravail.append( tokens_teletravail )

dictionary_teletravail = Dictionary(docs_teletravail)
corpus_teletravail = [ dictionary_teletravail.doc2bow(doc) for doc in docs_teletravail]

model_teletravail_passes_5 = LdaModel(corpus=corpus_teletravail,
                             id2word=dictionary_teletravail,
                             num_topics=10,
                             chunksize=1000,
                             passes=5,
                             random_state=1) 


vis_data_teletravail = pyLDAvis.gensim_models.prepare(model_teletravail_passes_5, corpus_teletravail, dictionary_teletravail, sort_topics=False)

# Export the graph and store it where we want in our computer
pyLDAvis.save_html(vis_data_teletravail, 'C:/Users/mario/Downloads/lda_model_passes_5.html')

Maybe you can add content for the tweets (random sentences that you can find on the internet). I think I can't load my html file on the post but don't hesitate to tell me if it's possible and I'll do it so that you don't have to run the first part. And here's the code of my dash app where I have multiple tabs and subtabs but I don't put their content here because it's useless, you just have the code with the tabs (empty). I would like to put the LDA model in tab 3 (Latent Dirichlet Allocation Model) subtab 10 (LDA Model 10 topics). I left most of my attempts in comments to return the LDA model in subtab10 but nothing is happening (no errors, nothing appearing on the dash app). Thank you for your help !

# Needed libraries
#import pandas as pd
import dash 
import dash_bootstrap_components as dbc
#import plotly.express as px
#import numpy as np
from dash import dcc, html
from dash.dependencies import Input, Output
from dash_bootstrap_templates import ThemeSwitchAIO, template_from_url

# Two different templates stored in variables for the dash app
template_theme1 = "cyborg"
template_theme2 = "lumen"
url_theme1 = dbc.themes.CYBORG
url_theme2 = dbc.themes.LUMEN

# Link which gives access to the templates
dbc_css = (
    "https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates@V1.0.1/dbc.min.css"
)

# Create the app and define the main theme in external_stylesheets
app = dash.Dash(__name__, external_stylesheets=[url_theme1, dbc_css])


# Define a sentence that appears on the top left of the app in order to choose between the two proposed themes
header = html.P("Click if you want to change theme of graphics",style={'textAlign': 'left','font-size':'300','font-family':'helvetica'})



# Create the layout of the app 
app.layout = html.Div([ # html Div to use html components (style, text, tabs, subtabs etc)
                       
                       html.H1('Health consequences during covid-19 pandemic dashboard', style={'textAlign': 'center','font-size':'300','font-family':'helvetica'}),
                       
                       dbc.Container( # dbc container and row to use dbc Col to define the different themes to choose
                           dbc.Row(
                               [
                                   dbc.Col( # Define the two possible themes to choose
                                       [
                                           header, # header is the sentence that we've dehttps://stackoverflow.com/questions/64736956/how-to-use-iframe-in-dash-plotly-python-htmlfined earlier in header variable
                                           ThemeSwitchAIO( # switch with icons
                                               aio_id="theme", # id of the switch
                                               themes=[url_theme1,url_theme2], # proposed themes that we've defined earlier
                                               ),
                                           ])])),
                       
                       dcc.Tabs(id='tabs', value='Tab1', style={'background-color': 'black'}, children=[
                           # Create tabs and their sub tabs
                                                                   
                                                                   
                           dcc.Tab(label='Data information', id='tab1', value='Tab1', style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'},children =[ # First tab 
                               dcc.Tabs(id="subtabs1", value='Subtab1',children=[ # Create sub tabs in the first tab 
                                   dcc.Tab(label='Basic information about the dashboard', id='subtab1', value='Subtab1',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # First sub tab of tab 1
                                   dcc.Tab(label='Number of collected tweets', id='subtab2', value='Subtab2',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Second sub tab of tab 1
                                   dcc.Tab(label='Number of collected tweets per month each year', id='subtab3', value='Subtab3',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Third sub tab of tab 1
                                   dcc.Tab(label='Wordcloud', id='subtab4', value='Subtab4',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'})]) # Fourth sub tab of tab 1
                                   
                                   ]),
                               
                           dcc.Tab(label='Sentiment Analysis', id='tab2', value='Tab2',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ # Create the Second tab 
                                dcc.Tabs(id="subtabs2", value='Subtab2', children=[ # Create sub tabs for the second tab
                                    dcc.Tab(label='Number or percentage of tweets according to sentiments', id='subtab5', value='Subtab5', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # First sub tab of tab 2
                                    dcc.Tab(label='Percentage of tweets according to sentiments and time slots', id='subtab6', value='Subtab6', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Second sub tab of tab 2
                                    dcc.Tab(label='Number or percentage of tweets according to sentiments and time slots', id='subtab7', value='Subtab7', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Third sub tab of tab 2
                                    dcc.Tab(label='Number or percentage of tweets according to sentiments each year', id='subtab8', value='Subtab8', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'})]) # Fourth sub tab of tab 2
                                    
                                    ]), 
                                
                           dcc.Tab(label='Latent Dirichlet Allocation Model', id='tab3', value='Tab3',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ # Create the Third tab 
                                dcc.Tabs(id="subtabs3", value='Subtab3', children=[
                                    dcc.Tab(label='LDA Model interpretation', id='subtab9', value='Subtab9', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # First sub tab of tab 3
                                    dcc.Tab(label='LDA Model 10 topics', id='subtab10', value='Subtab10', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Second sub tab of tab 3
                                    dcc.Tab(label='LDA Model 5 topics', id='subtab11', value='Subtab11', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'})]) # Third sub tab of tab 3
                                    
                                    ]), 
                                
                                
                           dcc.Tab(label='Network Graph', id='tab4', value='Tab4',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ # Create the fourth tab 
                                dcc.Tabs(id="subtabs4", value='Subtab4', children=[
                                    dcc.Tab(label='To determine', id='subtab13', value='Subtab13', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # First sub tab of tab 4
                                    dcc.Tab(label='To determine', id='subtab14', value='Subtab14', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), # Second sub tab of tab 4
                                    dcc.Tab(label='To determine', id='subtab15', value='Subtab15', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'})]) # Third sub tab of tab 4    
                                    
                                    ])
                           
                           ])
                       ])
                                                     



############################################ Tab 3 LDA MODEL 
############### Sub tab 10 LDA Model 10 topics


# Callback for Tab 3 and subtab 10 LDA Model 10 topics
@app.callback(Output('subtab10', 'children'), # Output 
              [Input('subtabs3', 'value'), # Input 
              Input(ThemeSwitchAIO.ids.switch("theme"),"value")]) # Another input is the selected theme/template

# Create function to display lda model
def display_lda_subtab10(value,toggle): # 2 parameters value for which subtab and toggle for theme/template
    
    if value == 'Subtab10':# If we are in subtab2 in tab 1 we return a graph

        template = template_theme1 if toggle else template_theme2 # We define the theme selected

        #lda_10_topics = html.Iframe(src='C:/Users/mario/Desktop/M2 Health Data Science 2022 2023/Mémoire/Projet Pro M2 2022 2023/Codes_tests_apres_rapport_detape/LDA/lda_model_topics_10.html')
        
        #return html.Div([dcc.Graph(figure=lda_10_topics)])
        
        
        # https://stackoverflow.com/questions/64736956/how-to-use-iframe-in-dash-plotly-python-html
        #return html.Div([dcc.Graph(id='example'),
         #                html.Iframe(src='C:/Users/mario/Desktop/M2 Health Data Science 2022 2023/Mémoire/Projet Pro M2 2022 2023/Codes_tests_apres_rapport_detape/LDA/lda_model_topics_10.html')
          #               ])
        
        
        
        
        #return html.Div([dcc.Graph(id='example'),
         #                html.Iframe(src=r'C:/Users/mario/Desktop/M2 Health Data Science 2022 2023/Mémoire/Projet Pro M2 2022 2023/Codes_tests_apres_rapport_detape/LDA/lda_model_topics_10.html')
          #               ])
        
        
        
        
        #https://stackoverflow.com/questions/68269257/local-html-file-wont-load-properly-into-dash-application
        #return html.Div([html.Iframe(src="assets/lda_model_topics_10.html")])
        
        
        
        
        # https://stackoverflow.com/questions/74534261/dash-include-custom-html-object
        #lda_10_topics = html.Iframe(src=r'C:/Users/mario/Desktop/M2 Health Data Science 2022 2023/Mémoire/Projet Pro M2 2022 2023/Codes_tests_apres_rapport_detape/LDA/lda_model_topics_10.html')
        #with open("C:/Users/mario/Downloads/lda_model_passes_5_json.json",'r') as f:
        
        #with open(lda_passes_5_json,'r') as f:
            
         #   return html.Div([dcc.Graph(figure=json.load(f))])
            #return json.load(f)

    #html.Iframe(src=r'static/lda_model_topics_10.html')
    #html.Div([html.Iframe(src=r'C:/Users/mario/Desktop/M2 Health Data Science 2022 2023/Mémoire/Projet Pro M2 2022 2023/Codes_tests_apres_rapport_detape/LDA/lda_model_topics_10.html')])




# Run the dash app
if __name__ =='__main__':   
    app.run_server(debug=False) 



No comments:

Post a Comment