如何在Dash应用中展示/部署/使用LDA模型
问题描述
我已拥有验证可行的LDA模型代码,将其可视化结果保存为本地HTML文件,现在需要在Dash应用的**第3标签页(潜在狄利克雷分配模型)的第10子标签页(LDA模型10个主题)**中展示该可视化内容,但尝试多种加载方式后,应用中无内容显示且无报错。
LDA模型代码(已验证可行)
# 导入库 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") # 创建示例数据 data = [['Le télétravail améliore la flexibilité professionnelle'], ['La pandémie a accéléré l\'adoption du télétravail'], ['Beaucoup de personnes préfèrent le télétravail au bureau']] # 法语推特内容 # 生成DataFrame df = pd.DataFrame(data, columns=['Preprocessed_tweets']) spacy_docs_teletravail = list(nlp_teletravail.pipe(df["Preprocessed_tweets"])) # 预处理文档 docs_teletravail = [] for doc in spacy_docs_teletravail: tokens_teletravail = [] for token in doc: if len(token.orth_) > 2 and not token.is_stop: tokens_teletravail.append(token.lemma_.lower()) docs_teletravail.append(tokens_teletravail) # 构建词典和语料库 dictionary_teletravail = Dictionary(docs_teletravail) corpus_teletravail = [dictionary_teletravail.doc2bow(doc) for doc in docs_teletravail] # 训练LDA模型 model_teletravail_passes_5 = LdaModel( corpus=corpus_teletravail, id2word=dictionary_teletravail, num_topics=10, chunksize=1000, passes=5, random_state=1 ) # 生成可视化数据并保存为HTML vis_data_teletravail = pyLDAvis.gensim_models.prepare(model_teletravail_passes_5, corpus_teletravail, dictionary_teletravail, sort_topics=False) pyLDAvis.save_html(vis_data_teletravail, 'lda_model_passes_5.html')
修改后的Dash应用代码
# 导入所需库 import dash import dash_bootstrap_components as dbc from dash import dcc, html from dash.dependencies import Input, Output from dash_bootstrap_templates import ThemeSwitchAIO, template_from_url # 定义主题模板 template_theme1 = "cyborg" template_theme2 = "lumen" url_theme1 = dbc.themes.CYBORG url_theme2 = dbc.themes.LUMEN # 加载主题样式 dbc_css = ( "https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates@V1.0.1/dbc.min.css" ) # 初始化Dash应用 app = dash.Dash(__name__, external_stylesheets=[url_theme1, dbc_css]) # 主题切换提示语 header = html.P("点击切换图表主题",style={'textAlign': 'left','font-size':'300','font-family':'helvetica'}) # 应用布局 app.layout = html.Div([ html.H1('新冠疫情期间健康影响仪表盘', style={'textAlign': 'center','font-size':'300','font-family':'helvetica'}), dbc.Container( dbc.Row( [ dbc.Col( [ header, ThemeSwitchAIO( aio_id="theme", themes=[url_theme1,url_theme2], ), ]) ]) ), dcc.Tabs(id='tabs', value='Tab1', style={'background-color': 'black'}, children=[ # 第一标签页:数据信息 dcc.Tab(label='数据信息', id='tab1', value='Tab1', style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'},children =[ dcc.Tabs(id="subtabs1", value='Subtab1',children=[ dcc.Tab(label='仪表盘基本信息', id='subtab1', value='Subtab1',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='采集推文数量', id='subtab2', value='Subtab2',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='各年度月度推文数量', id='subtab3', value='Subtab3',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='词云图', id='subtab4', value='Subtab4',style={'textAlign': 'center', 'font-size':'100','font-family':'helvetica', 'background-color': 'black'}) ]) ]), # 第二标签页:情感分析 dcc.Tab(label='情感分析', id='tab2', value='Tab2',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ dcc.Tabs(id="subtabs2", value='Subtab5', children=[ dcc.Tab(label='按情感分类的推文数量/占比', id='subtab5', value='Subtab5', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='按情感和时间段分类的推文占比', id='subtab6', value='Subtab6', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='按情感和时间段分类的推文数量/占比', id='subtab7', value='Subtab7', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='各年度按情感分类的推文数量/占比', id='subtab8', value='Subtab8', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}) ]) ]), # 第三标签页:LDA模型 dcc.Tab(label='潜在狄利克雷分配模型(LDA)', id='tab3', value='Tab3',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ dcc.Tabs(id="subtabs3", value='Subtab9', children=[ dcc.Tab(label='LDA模型解读', id='subtab9', value='Subtab9', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='LDA模型(10个主题)', id='subtab10', value='Subtab10', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='LDA模型(5个主题)', id='subtab11', value='Subtab11', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}) ]) ]), # 第四标签页:网络图谱 dcc.Tab(label='网络图谱', id='tab4', value='Tab4',style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}, children=[ dcc.Tabs(id="subtabs4", value='Subtab13', children=[ dcc.Tab(label='待确定', id='subtab13', value='Subtab13', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='待确定', id='subtab14', value='Subtab14', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}), dcc.Tab(label='待确定', id='subtab15', value='Subtab15', style={'textAlign': 'center','font-size':'100','font-family':'helvetica', 'background-color': 'black'}) ]) ]) ]) ]) # 第三标签页子标签10的回调函数 @app.callback(Output('subtab10', 'children'), [Input('subtabs3', 'value'), Input(ThemeSwitchAIO.ids.switch("theme"),"value")]) def display_lda_subtab10(value,toggle): if value == 'Subtab10': return html.Div([ html.Iframe( src="/assets/lda_model_passes_5.html", style={"width": "100%", "height": "800px", "border": "none"} ) ]) return html.Div() # 运行应用 if __name__ =='__main__': app.run_server(debug=False)
解决步骤
- 创建静态资源目录:在Dash项目根目录下新建
assets文件夹,将LDA生成的HTML文件(lda_model_passes_5.html)放入该目录。Dash会自动识别并托管此目录下的静态文件,避免浏览器安全限制导致的路径访问问题。 - 修正回调逻辑:移除不必要的主题关联(LDA可视化是独立HTML,不受Dash主题影响),直接返回配置好的
html.Iframe组件,设置合适的宽高确保内容完整展示。 - 修正子标签默认值:将第三标签页的子标签默认值改为
Subtab9,避免初始状态下的逻辑冲突。
内容的提问来源于stack exchange,提问作者MarionEtp
相关产品推荐
相关产品推荐

