yu3733 commited on
Commit
ee2d50c
·
1 Parent(s): 6d56e7f
Files changed (1) hide show
  1. app.py +79 -40
app.py CHANGED
@@ -26,16 +26,24 @@ def load_and_process_data():
26
  # トークンがあればログイン
27
  if HF_TOKEN:
28
  login(token=HF_TOKEN)
 
 
 
 
 
 
29
  dataset = load_dataset("cais/hle", split="test")
 
30
  # 画像データを扱うため、Pandasに変換するのはメタデータのみ
31
  df = dataset.remove_columns(['image_preview', 'rationale_image']).to_pandas()
32
  category_counts = df['category'].value_counts()
33
- print("データセットのロードと前処理が完了しました。")
34
  except Exception as e:
35
  print(f"データセットのロードエラー: {e}")
 
36
  # エラーが発生した場合、アプリがクラッシュしないように空のデータフレームを設定
37
  df = pd.DataFrame(columns=['id', 'question', 'category'])
38
- category_counts = pd.Series()
39
 
40
  # --- 翻訳関数 ---
41
  def translate_text(text, dest_lang='ja'):
@@ -53,6 +61,9 @@ def translate_text(text, dest_lang='ja'):
53
  # --- Gradioイベントハンドラ ---
54
  def on_category_change(selected_category):
55
  """カテゴリが変更されたときに、問題のドロップダウンを更新する"""
 
 
 
56
  if selected_category == "全カテゴリ":
57
  filtered_indices = df.index
58
  else:
@@ -71,40 +82,48 @@ def on_category_change(selected_category):
71
 
72
  def on_question_change(selected_index):
73
  """問題が選択されたときに、すべての詳細表示を更新する"""
74
- if selected_index is None or pd.isna(selected_index):
75
- # 空の出力をまとめて返す
76
- empty_outputs = [gr.Markdown(visible=False)] * 6 + [gr.Image(visible=False)] * 2
77
- return tuple(empty_outputs)
78
-
79
- # 元のHugging Face Datasetから完全なエントリを取得
80
- entry = dataset[int(selected_index)]
81
-
82
- # 各要素の翻訳
83
- q_trans = translate_text(entry['question'])
84
- a_trans = translate_text(entry['answer'])
85
- r_trans = translate_text(entry.get('rationale', ''))
86
-
87
- # 出力コンポーネントの値を生成
88
- outputs = {
89
- "question_md": gr.Markdown(f"### 質問\n---\n**原文:**\n{entry['question']}\n\n**日本語訳:**\n{q_trans}", visible=True),
90
- "question_img": gr.Image(entry.get('image_preview'), label="質問画像", visible=bool(entry.get('image_preview'))),
91
- "answer_md": gr.Markdown(f"### 回答\n---\n**原文:**\n{entry['answer']}\n\n**日本語訳:**\n{a_trans}", visible=True),
92
- "rationale_md": gr.Markdown(f"### 解説\n---\n**原文:**\n{entry.get('rationale', 'N/A')}\n\n**日本語訳:**\n{r_trans}", visible=bool(entry.get('rationale'))),
93
- "rationale_img": gr.Image(entry.get('rationale_image'), label="解説画像", visible=bool(entry.get('rationale_image'))),
94
- "metadata_md": gr.Markdown(f"**ID:** `{entry['id']}`<br>**分野:** `{entry['raw_subject']}`<br>**回答タイプ:** `{entry['answer_type']}`", visible=True),
95
- "json_output": gr.JSON({k: str(v) for k, v in entry.items()}, label="元のデータ", visible=True)
96
- }
97
-
98
- # 定義された順序で値を返す
99
- return (
100
- outputs["question_md"],
101
- outputs["question_img"],
102
- outputs["answer_md"],
103
- outputs["rationale_md"],
104
- outputs["rationale_img"],
105
- outputs["metadata_md"],
106
- outputs["json_output"]
107
- )
 
 
 
 
 
 
 
 
108
 
109
  # --- Gradio UI構築 ---
110
  def create_demo():
@@ -113,29 +132,48 @@ def create_demo():
113
 
114
  with gr.Blocks(theme=gr.themes.Soft(), title="HLE Dataset Viewer") as demo:
115
  gr.Markdown("# Humanity's Last Exam (HLE) Dataset Viewer")
 
 
 
 
 
 
 
 
 
116
  gr.Markdown("Hugging Face `cais/hle`データセットを探索し、日本語訳を確認できます。")
117
 
118
  with gr.Row():
119
  with gr.Column(scale=1, min_width=350):
120
  gr.Markdown("## 操作パネル")
 
 
 
 
 
 
 
121
  category_dd = gr.Dropdown(
122
- choices=["全カテゴリ"] + sorted(category_counts.index.tolist()),
123
  value="全カテゴリ",
124
  label="1. カテゴリを選択"
125
  )
126
  question_dd = gr.Dropdown(label="2. 問題を選択", interactive=False)
127
 
128
  gr.Markdown("### カテゴリ別問題数")
129
- gr.Dataframe(value=pd.DataFrame(category_counts).reset_index(), headers=['カテゴリ', '問題数'], interactive=False)
 
 
 
130
 
131
  with gr.Column(scale=3):
132
  # 出力エリアのプレースホルダー
133
- metadata_md = gr.Markdown(visible=False)
134
  question_md = gr.Markdown(visible=False)
135
  question_img = gr.Image(label="質問画像", visible=False)
136
  answer_md = gr.Markdown(visible=False)
137
  rationale_md = gr.Markdown(visible=False)
138
  rationale_img = gr.Image(label="解説画像", visible=False)
 
139
  json_output = gr.JSON(label="元のデータ", visible=False)
140
 
141
  # イベントリスナーを設定
@@ -145,7 +183,8 @@ def create_demo():
145
  ])
146
 
147
  # 初期表示のために最初のカテゴリ変更イベントをトリガー
148
- demo.load(fn=on_category_change, inputs=category_dd, outputs=question_dd)
 
149
 
150
  return demo
151
 
 
26
  # トークンがあればログイン
27
  if HF_TOKEN:
28
  login(token=HF_TOKEN)
29
+ print("Hugging Face にログインしました。")
30
+ else:
31
+ print("警告: HF_TOKEN が設定されていません。ゲート付きデータセットにアクセスできません。")
32
+
33
+ # データセットをロード
34
+ print("データセットをロード中...")
35
  dataset = load_dataset("cais/hle", split="test")
36
+
37
  # 画像データを扱うため、Pandasに変換するのはメタデータのみ
38
  df = dataset.remove_columns(['image_preview', 'rationale_image']).to_pandas()
39
  category_counts = df['category'].value_counts()
40
+ print(f"データセットのロードと前処理が完了しました。合計 {len(df)} 件のデータを読み込みました。")
41
  except Exception as e:
42
  print(f"データセットのロードエラー: {e}")
43
+ print("データセットへのアクセスには認証が必要です。HF_TOKENを設定してください。")
44
  # エラーが発生した場合、アプリがクラッシュしないように空のデータフレームを設定
45
  df = pd.DataFrame(columns=['id', 'question', 'category'])
46
+ category_counts = pd.Series(dtype='int64')
47
 
48
  # --- 翻訳関数 ---
49
  def translate_text(text, dest_lang='ja'):
 
61
  # --- Gradioイベントハンドラ ---
62
  def on_category_change(selected_category):
63
  """カテゴリが変更されたときに、問題のドロップダウンを更新する"""
64
+ if df is None or len(df) == 0:
65
+ return gr.Dropdown(choices=[], label="データセットが利用できません", interactive=False, value=None)
66
+
67
  if selected_category == "全カテゴリ":
68
  filtered_indices = df.index
69
  else:
 
82
 
83
  def on_question_change(selected_index):
84
  """問題が選択されたときに、すべての詳細表示を更新する"""
85
+ if selected_index is None or pd.isna(selected_index) or dataset is None:
86
+ # 空の出力をまとめて返す (7つの要素: question_md, question_img, answer_md, rationale_md, rationale_img, metadata_md, json_output)
87
+ return (
88
+ gr.Markdown(visible=False), # question_md
89
+ gr.Image(visible=False), # question_img
90
+ gr.Markdown(visible=False), # answer_md
91
+ gr.Markdown(visible=False), # rationale_md
92
+ gr.Image(visible=False), # rationale_img
93
+ gr.Markdown(visible=False), # metadata_md
94
+ gr.JSON(visible=False) # json_output
95
+ )
96
+
97
+ try:
98
+ # 元のHugging Face Datasetから完全なエントリを取得
99
+ entry = dataset[int(selected_index)]
100
+
101
+ # 各要素の翻訳
102
+ q_trans = translate_text(entry['question'])
103
+ a_trans = translate_text(entry['answer'])
104
+ r_trans = translate_text(entry.get('rationale', ''))
105
+
106
+ # 正確に7つの値を返す
107
+ return (
108
+ gr.Markdown(f"### 質問\n---\n**原文:**\n{entry['question']}\n\n**日本語訳:**\n{q_trans}", visible=True), # question_md
109
+ gr.Image(entry.get('image_preview'), label="質問画像", visible=bool(entry.get('image_preview'))), # question_img
110
+ gr.Markdown(f"### 回答\n---\n**原文:**\n{entry['answer']}\n\n**日本語訳:**\n{a_trans}", visible=True), # answer_md
111
+ gr.Markdown(f"### 解説\n---\n**原文:**\n{entry.get('rationale', 'N/A')}\n\n**日本語訳:**\n{r_trans}", visible=bool(entry.get('rationale'))), # rationale_md
112
+ gr.Image(entry.get('rationale_image'), label="解説画像", visible=bool(entry.get('rationale_image'))), # rationale_img
113
+ gr.Markdown(f"**ID:** `{entry['id']}`<br>**分野:** `{entry['raw_subject']}`<br>**回答タイプ:** `{entry['answer_type']}`", visible=True), # metadata_md
114
+ gr.JSON({k: str(v) for k, v in entry.items()}, label="元のデータ", visible=True) # json_output
115
+ )
116
+ except Exception as e:
117
+ error_msg = f"データ取得エラー: {str(e)}"
118
+ return (
119
+ gr.Markdown(f"### エラー\n{error_msg}", visible=True),
120
+ gr.Image(visible=False),
121
+ gr.Markdown(visible=False),
122
+ gr.Markdown(visible=False),
123
+ gr.Image(visible=False),
124
+ gr.Markdown(visible=False),
125
+ gr.JSON(visible=False)
126
+ )
127
 
128
  # --- Gradio UI構築 ---
129
  def create_demo():
 
132
 
133
  with gr.Blocks(theme=gr.themes.Soft(), title="HLE Dataset Viewer") as demo:
134
  gr.Markdown("# Humanity's Last Exam (HLE) Dataset Viewer")
135
+
136
+ if df is None or len(df) == 0:
137
+ gr.Markdown("⚠️ **データセットの読み込みに失敗しました**")
138
+ gr.Markdown("このデータセットはゲート付きで、アクセスには認証が必要です。")
139
+ gr.Markdown("**解決方法:**")
140
+ gr.Markdown("1. [Hugging Face](https://huggingface.co/cais/hle) でデータセットへのアクセス申請を行ってください")
141
+ gr.Markdown("2. 承認後、HF_TOKEN環境変数にあなたのHugging Faceトークンを設定してください")
142
+ return demo
143
+
144
  gr.Markdown("Hugging Face `cais/hle`データセットを探索し、日本語訳を確認できます。")
145
 
146
  with gr.Row():
147
  with gr.Column(scale=1, min_width=350):
148
  gr.Markdown("## 操作パネル")
149
+
150
+ # カテゴリの選択肢を安全に作成
151
+ if len(category_counts) > 0:
152
+ category_choices = ["全カテゴリ"] + sorted(category_counts.index.tolist())
153
+ else:
154
+ category_choices = ["全カテゴリ"]
155
+
156
  category_dd = gr.Dropdown(
157
+ choices=category_choices,
158
  value="全カテゴリ",
159
  label="1. カテゴリを選択"
160
  )
161
  question_dd = gr.Dropdown(label="2. 問題を選択", interactive=False)
162
 
163
  gr.Markdown("### カテゴリ別問題数")
164
+ if len(category_counts) > 0:
165
+ gr.Dataframe(value=pd.DataFrame(category_counts).reset_index(), headers=['カテゴリ', '問題数'], interactive=False)
166
+ else:
167
+ gr.Markdown("データがありません")
168
 
169
  with gr.Column(scale=3):
170
  # 出力エリアのプレースホルダー
 
171
  question_md = gr.Markdown(visible=False)
172
  question_img = gr.Image(label="質問画像", visible=False)
173
  answer_md = gr.Markdown(visible=False)
174
  rationale_md = gr.Markdown(visible=False)
175
  rationale_img = gr.Image(label="解説画像", visible=False)
176
+ metadata_md = gr.Markdown(visible=False)
177
  json_output = gr.JSON(label="元のデータ", visible=False)
178
 
179
  # イベントリスナーを設定
 
183
  ])
184
 
185
  # 初期表示のために最初のカテゴリ変更イベントをトリガー
186
+ if len(df) > 0:
187
+ demo.load(fn=on_category_change, inputs=category_dd, outputs=question_dd)
188
 
189
  return demo
190