我正在开展一个 NLP 项目,分析办公室中人物所说的话。该项目的一部分涉及制作一个网络图,其中角色在给定的剧集中相互交谈。
这将在 Dash 应用程序中显示,允许用户选择 4 个参数的下拉菜单:季节、剧集、角色 1 和角色 2。
这是迄今为止我的代码的相关片段:
#Import libraries
import pandas as pd
import numpy as np
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
#Load data
sheet_url = 'https://docs.google.com/spreadsheets/d/18wS5AAwOh8QO95RwHLS95POmSNKA2jjzdt0phrxeAE0/edit#gid=747974534'
url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')
df = pd.read_csv(url)
#Set parameters
choose_season = df['season'].unique()
choose_episode = df['episode'].unique()
choose_character = ['Andy','Angela', 'Darryl', 'Dwight', 'Jan', 'Jim','Kelly','Kevin','Meredith','Michael','Oscar','Pam','Phyllis','Roy','Ryan','Stanley','Toby']
#Define app layout
app = dash.Dash()
server = app.server
app.layout = html.Div([
dbc.Row([
dbc.Col(
dcc.Dropdown(
id='dropdown1',
options=[{'label': i, 'value': i} for i in choose_season],
value=choose_season[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown2',
options=[{'label': i, 'value': i} for i in choose_episode],
value=choose_episode[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown3',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown4',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[1]
), width=3
)
])
])
if __name__=='__main__':
app.run_server()
为了有效地完成这项工作,我希望在下拉菜单中具有以下依赖项:
1.) 选择第一个下拉菜单会更新下拉菜单 即:季节更新可能的剧集
2.) 前两个下拉菜单的选择将更新第三个和第四个下拉菜单 即:季节,剧集更新可能的角色(如果角色不在该剧集中,则他们不会出现)
3.) 选择第三个下拉菜单会更新第四个下拉菜单 即:如果在第三个下拉菜单中选择了某个字符,则无法在第四个下拉菜单中选择该字符(不能选择同一字符两次)
我知道做到这一点的一种方法是制作一个庞大的季节到剧集字典,然后制作一个更大的季节到剧集到角色字典。
我已经编写了处理季节到剧集字典的代码:
@app.callback(
Output('dropdown2', 'options'), #--> filter episodes
Output('dropdown2', 'value'),
Input('dropdown1', 'value') #--> choose season
)
def set_episode_options(selected_season):
return [{'label': i, 'value': i} for i in season_episode_dict[selected_season]], season_episode_dict[selected_season][0]
我绝对可以构建这些词典,但这似乎是对时间的低效利用。有谁知道只需几行代码即可构建这些字典的方法?不知道如何以最简单的方式构建这些。另外,如果您有更好的方法来解决这个问题,也请告诉我。
我想我现在明白你在问什么了。像这样的东西应该会给你一个基本的字典,然后你可以修改下拉列表的
options
参数。
df = pd.read_csv(url)
season_episode_character_dictionary = {}
for season in df['season'].unique.tolist():
df_season = df[df['season'].eq(season)]
season_episode_character_dictionary[season] = {}
for episode in df_season['episode'].unique.tolist():
df_episode = df_season[df_season['episode'].eq(episode)]
characters = df_episode['characters'].unique.tolist()
season_episode_character_dictionary[season][episode] = characters