You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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) 

解决步骤
  1. 创建静态资源目录:在Dash项目根目录下新建assets文件夹,将LDA生成的HTML文件(lda_model_passes_5.html)放入该目录。Dash会自动识别并托管此目录下的静态文件,避免浏览器安全限制导致的路径访问问题。
  2. 修正回调逻辑:移除不必要的主题关联(LDA可视化是独立HTML,不受Dash主题影响),直接返回配置好的html.Iframe组件,设置合适的宽高确保内容完整展示。
  3. 修正子标签默认值:将第三标签页的子标签默认值改为Subtab9,避免初始状态下的逻辑冲突。

内容的提问来源于stack exchange,提问作者MarionEtp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:20:29