24
Browse files
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 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
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=
|
123 |
value="全カテゴリ",
|
124 |
label="1. カテゴリを選択"
|
125 |
)
|
126 |
question_dd = gr.Dropdown(label="2. 問題を選択", interactive=False)
|
127 |
|
128 |
gr.Markdown("### カテゴリ別問題数")
|
129 |
-
|
|
|
|
|
|
|
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 |
-
|
|
|
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 |
|