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 |
|