jisubae
fix: HF login error and future warning
cd13f52
#!/usr/bin/env python3
"""
FreshQA ์ •ํ™•๋„ ๊ณ„์‚ฐ ์Šคํฌ๋ฆฝํŠธ
์ด ์Šคํฌ๋ฆฝํŠธ๋Š” FreshQA ๋ฐ์ดํ„ฐ์…‹์˜ ์ •ํ™•๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
"""
import pandas as pd
import sys
import os
def load_freshqa_data(csv_path='freshqa.csv'):
"""FreshQA CSV ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค."""
try:
# ๋จผ์ € ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๊ตฌ์กฐ๋ฅผ ํ™•์ธ
temp_df = pd.read_csv(csv_path)
# print(f"ํŒŒ์ผ ๊ตฌ์กฐ ํ™•์ธ: {len(temp_df)}๊ฐœ ํ–‰, ์ปฌ๋Ÿผ: {temp_df.columns.tolist()}")
# rating ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ, ์—†์œผ๋ฉด skiprows ์ ์šฉ
if 'rating' in temp_df.columns:
fresh_qa = temp_df
# print("rating ์ปฌ๋Ÿผ์ด ์žˆ๋Š” ํŒŒ์ผ๋กœ ์ธ์‹ํ•˜์—ฌ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.")
else:
fresh_qa = pd.read_csv(csv_path, skiprows=[0, 1])
# print("๊ธฐ๋ณธ FreshQA ํ˜•์‹์œผ๋กœ ์ธ์‹ํ•˜์—ฌ skiprows๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.")
# print(f"FreshQA ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ: {len(fresh_qa)}๊ฐœ ์ƒ˜ํ”Œ")
return fresh_qa
except FileNotFoundError:
print(f"์˜ค๋ฅ˜: {csv_path} ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
print("ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— freshqa.csv ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.")
sys.exit(1)
except Exception as e:
print(f"๋ฐ์ดํ„ฐ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
sys.exit(1)
def process_freshqa_dataframe(df):
"""DataFrame์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ FreshQA ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค."""
try:
# print(f"DataFrame ๊ตฌ์กฐ ํ™•์ธ: {len(df)}๊ฐœ ํ–‰, ์ปฌ๋Ÿผ: {df.columns.tolist()}")
# rating ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ, ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
if 'rating' in df.columns:
# print("DataFrame์— rating ์ปฌ๋Ÿผ์ด ์žˆ์–ด์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.")
processed_df = df.copy()
else:
# print("DataFrame์— rating ์ปฌ๋Ÿผ์ด ์—†์–ด์„œ ๊ธฐ๋ณธ๊ฐ’ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.")
processed_df = df.copy()
processed_df['rating'] = 0 # ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 0 ์„ค์ •
# print(f"FreshQA ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์™„๋ฃŒ: {len(processed_df)}๊ฐœ ์ƒ˜ํ”Œ")
return processed_df
except Exception as e:
print(f"๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
raise
def update_results(df, d_acc, d_count, field_name):
"""๊ฒฐ๊ณผ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."""
if len(df) == 0:
r = 0.0
else:
# rating์ด ๋ฌธ์ž์—ด 'TRUE'์ด๊ฑฐ๋‚˜ ์ˆซ์ž 1์ธ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌ
if df['rating'].dtype == 'object':
# ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ 'TRUE' ํ™•์ธ
r = len(df[df.rating == 'TRUE']) * 100 / len(df)
else:
# ์ˆซ์ž์ธ ๊ฒฝ์šฐ 1 ํ™•์ธ
r = len(df[df.rating == 1]) * 100 / len(df)
d_acc[field_name] = r
d_count[field_name] = len(df)
def calculate_accuracy_simple(fresh_qa):
"""FreshQA ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ์ •ํ™•๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค (๊ฐ„๋‹จํ•œ ๋ฒ„์ „)."""
print("์ •ํ™•๋„ ๊ณ„์‚ฐ ์ค‘...")
# rating ์ปฌ๋Ÿผ์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ 0์œผ๋กœ ์„ค์ •
if 'rating' not in fresh_qa.columns:
# print("rating ์ปฌ๋Ÿผ์ด ์—†์–ด์„œ ๊ธฐ๋ณธ๊ฐ’ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.")
fresh_qa['rating'] = 0
accs = {}
counts = {}
# ์ „์ฒด ์ •ํ™•๋„
update_results(fresh_qa, accs, counts, 'overall_accuracy')
# split ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ๋ถ„ํ• ๋ณ„ ์ •ํ™•๋„ ๊ณ„์‚ฐ
if 'split' in fresh_qa.columns:
fresh_qa_test = fresh_qa[fresh_qa.split == 'TEST']
fresh_qa_dev = fresh_qa[fresh_qa.split == 'DEV']
update_results(fresh_qa_test, accs, counts, 'acc_test')
update_results(fresh_qa_dev, accs, counts, 'acc_dev')
# fact_type ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ์‚ฌ์‹ค ์œ ํ˜•๋ณ„ ์ •ํ™•๋„ ๊ณ„์‚ฐ
if 'fact_type' in fresh_qa.columns:
for fact_type in ['fast-changing', 'slow-changing', 'never-changing']:
if fact_type in fresh_qa['fact_type'].values:
sub_df = fresh_qa[fresh_qa.fact_type == fact_type]
update_results(sub_df, accs, counts, f'{fact_type}_accuracy')
# false_premise ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด False premise ์ •ํ™•๋„ ๊ณ„์‚ฐ
if 'false_premise' in fresh_qa.columns:
fp_df = fresh_qa[fresh_qa.false_premise == True]
if len(fp_df) > 0:
update_results(fp_df, accs, counts, 'false_premise_accuracy')
# domain ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ๋„๋ฉ”์ธ๋ณ„ ์ •ํ™•๋„ ๊ณ„์‚ฐ
if 'domain' in fresh_qa.columns:
# ํ•œ๊ตญ์–ด ๋„๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ๋“ค (์‹ค์ œ CSV ํŒŒ์ผ์˜ domain ๊ฐ’๋“ค)
korean_domains = ['์ •์น˜', '์Šคํฌ์ธ ', '์—ฐ์˜ˆ', '๋‚ ์”จ', '์„ธ๊ณ„', '๊ฒฝ์ œ', '์‚ฌํšŒ', 'IT/๊ณผํ•™', '์ƒํ™œ/๋ฌธํ™”', 'UNK']
for domain in korean_domains:
if domain in fresh_qa['domain'].values:
domain_df = fresh_qa[fresh_qa.domain == domain]
domain_test = domain_df[domain_df.split == 'TEST']
domain_dev = domain_df[domain_df.split == 'DEV']
# ๋„๋ฉ”์ธ๋ช…์„ ์˜์–ด๋กœ ๋ณ€ํ™˜ (ํŒŒ์ผ๋ช…/ํ‚ค์— ์‚ฌ์šฉ)
domain_key = domain.replace('/', '_').replace(' ', '_').lower()
if domain == 'IT/๊ณผํ•™':
domain_key = 'it_science'
elif domain == '์ƒํ™œ/๋ฌธํ™”':
domain_key = 'life_culture'
elif domain == 'UNK':
domain_key = 'unknown'
update_results(domain_df, accs, counts, f'acc_{domain_key}')
update_results(domain_test, accs, counts, f'acc_test_{domain_key}')
update_results(domain_dev, accs, counts, f'acc_dev_{domain_key}')
# ๊ธฐ์กด ์˜์–ด ๋„๋ฉ”์ธ๋“ค๋„ ์œ ์ง€ (ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด)
english_domains = ['politics', 'sports', 'entertainment', 'weather', 'world', 'economy', 'society', 'it_science', 'life_culture']
for domain in english_domains:
if domain in fresh_qa['domain'].values:
domain_df = fresh_qa[fresh_qa.domain == domain]
update_results(domain_df, accs, counts, f'{domain}_accuracy')
# ์ด ์งˆ๋ฌธ ์ˆ˜ ์ถ”๊ฐ€
accs['total_questions'] = len(fresh_qa)
return accs
def calculate_accuracy(fresh_qa):
"""FreshQA ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค."""
# ๋ฐ์ดํ„ฐ ๋ถ„ํ• 
fresh_qa_test = fresh_qa[fresh_qa.split == 'TEST']
fresh_qa_dev = fresh_qa[fresh_qa.split == 'DEV']
accs = {}
counts = {}
# ์ „์ฒด ์ •ํ™•๋„
update_results(fresh_qa, accs, counts, 'acc')
update_results(fresh_qa_test, accs, counts, 'acc_test')
update_results(fresh_qa_dev, accs, counts, 'acc_dev')
# ์‚ฌ์‹ค ์œ ํ˜•๋ณ„ ์ •ํ™•๋„
for fact_type in ['fast-changing', 'slow-changing', 'never-changing']:
sub_df = fresh_qa[(fresh_qa.false_premise == False) & (fresh_qa.fact_type == fact_type)]
sub_df_test = sub_df[sub_df.split == 'TEST']
sub_df_dev = sub_df[sub_df.split == 'DEV']
ft = fact_type.replace('-', '_')
update_results(sub_df, accs, counts, f'acc_{ft}')
update_results(sub_df_test, accs, counts, f'acc_test_{ft}')
update_results(sub_df_dev, accs, counts, f'acc_dev_{ft}')
# ์งˆ๋ฌธ ์œ ํ˜•๋ณ„ ์ •ํ™•๋„ (vp: valid premise, fp: false premise)
for qt in ['vp', 'fp']:
fp = True if qt == 'fp' else False
data = fresh_qa[(fresh_qa.false_premise == fp)]
data_test = data[data.split == 'TEST']
data_dev = data[data.split == 'DEV']
# ํ™‰ ์ˆ˜๋ณ„ ๋ถ„์„
data_one_hop = data[data.num_hops == 'one-hop']
data_one_hop_test = data_one_hop[data_one_hop.split == 'TEST']
data_one_hop_dev = data_one_hop[data_one_hop.split == 'DEV']
data_two_hop = data[data.num_hops == 'multi-hop']
data_two_hop_test = data_two_hop[data_two_hop.split == 'TEST']
data_two_hop_dev = data_two_hop[data_two_hop.split == 'DEV']
# ์—ฐ๋„๋ณ„ ๋ถ„์„
data_old = data[(data.effective_year != '2022') & (data.effective_year != '2023')]
data_old_test = data_old[data_old.split == 'TEST']
data_old_dev = data_old[data_old.split == 'DEV']
data_new = data[(data.effective_year == '2022') | (data.effective_year == '2023')]
data_new_test = data_new[data_new.split == 'TEST']
data_new_dev = data_new[data_new.split == 'DEV']
# ๊ธฐ๋ณธ ์ •ํ™•๋„
update_results(data, accs, counts, f'acc_{qt}')
update_results(data_test, accs, counts, f'acc_test_{qt}')
update_results(data_dev, accs, counts, f'acc_dev_{qt}')
# ํ™‰ ์ˆ˜๋ณ„ ์ •ํ™•๋„
update_results(data_one_hop, accs, counts, f'acc_{qt}_one_hop')
update_results(data_one_hop_test, accs, counts, f'acc_test_{qt}_one_hop')
update_results(data_one_hop_dev, accs, counts, f'acc_dev_{qt}_one_hop')
update_results(data_two_hop, accs, counts, f'acc_{qt}_two_hop')
update_results(data_two_hop_test, accs, counts, f'acc_test_{qt}_two_hop')
update_results(data_two_hop_dev, accs, counts, f'acc_dev_{qt}_two_hop')
# ์—ฐ๋„๋ณ„ ์ •ํ™•๋„
update_results(data_old, accs, counts, f'acc_{qt}_old')
update_results(data_old_test, accs, counts, f'acc_test_{qt}_old')
update_results(data_old_dev, accs, counts, f'acc_dev_{qt}_old')
update_results(data_new, accs, counts, f'acc_{qt}_new')
update_results(data_new_test, accs, counts, f'acc_test_{qt}_new')
update_results(data_new_dev, accs, counts, f'acc_dev_{qt}_new')
# ๋„๋ฉ”์ธ๋ณ„ ์ •ํ™•๋„ ๊ณ„์‚ฐ
if 'domain' in fresh_qa.columns:
# ํ•œ๊ตญ์–ด ๋„๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ๋“ค (์‹ค์ œ CSV ํŒŒ์ผ์˜ domain ๊ฐ’๋“ค)
korean_domains = ['์ •์น˜', '์Šคํฌ์ธ ', '์—ฐ์˜ˆ', '๋‚ ์”จ', '์„ธ๊ณ„', '๊ฒฝ์ œ', '์‚ฌํšŒ', 'IT/๊ณผํ•™', '์ƒํ™œ/๋ฌธํ™”', 'UNK']
# ๋„๋ฉ”์ธ๋ช…์„ ์˜์–ด๋กœ ๋ณ€ํ™˜ (ํŒŒ์ผ๋ช…/ํ‚ค์— ์‚ฌ์šฉ)
domain_mapping = {
'์ •์น˜': 'politics',
'์Šคํฌ์ธ ': 'sports',
'์—ฐ์˜ˆ': 'entertainment',
'๋‚ ์”จ': 'weather',
'์„ธ๊ณ„': 'world',
'๊ฒฝ์ œ': 'economy',
'์‚ฌํšŒ': 'society',
'IT/๊ณผํ•™': 'it_science',
'์ƒํ™œ/๋ฌธํ™”': 'life_culture',
'UNK': 'unknown'
}
for domain in korean_domains:
if domain in fresh_qa['domain'].values:
domain_df = fresh_qa[fresh_qa.domain == domain]
domain_test = domain_df[domain_df.split == 'TEST']
domain_dev = domain_df[domain_df.split == 'DEV']
domain_key = domain_mapping.get(domain, domain.replace('/', '_').replace(' ', '_').lower())
update_results(domain_df, accs, counts, f'acc_{domain_key}')
update_results(domain_test, accs, counts, f'acc_test_{domain_key}')
update_results(domain_dev, accs, counts, f'acc_dev_{domain_key}')
return accs, counts
def print_results(accs, counts):
"""๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค."""
print("\n" + "="*80)
print("FreshQA ์ •ํ™•๋„ ๋ถ„์„ ๊ฒฐ๊ณผ")
print("="*80)
# ์ „์ฒด ์ •ํ™•๋„
print(f"\n๐Ÿ“Š ์ „์ฒด ์ •ํ™•๋„:")
print(f" ์ „์ฒด: {accs['acc']}% ({counts['acc']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ํ…Œ์ŠคํŠธ: {accs['acc_test']}% ({counts['acc_test']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ๊ฐœ๋ฐœ: {accs['acc_dev']}% ({counts['acc_dev']}๊ฐœ ์ƒ˜ํ”Œ)")
# ์‚ฌ์‹ค ์œ ํ˜•๋ณ„ ์ •ํ™•๋„
print(f"\n๐Ÿ“ˆ ์‚ฌ์‹ค ์œ ํ˜•๋ณ„ ์ •ํ™•๋„:")
fact_types = {
'fast_changing': '๋น ๋ฅด๊ฒŒ ๋ณ€ํ•˜๋Š” ์‚ฌ์‹ค',
'slow_changing': '์ฒœ์ฒœํžˆ ๋ณ€ํ•˜๋Š” ์‚ฌ์‹ค',
'never_changing': '๋ณ€ํ•˜์ง€ ์•Š๋Š” ์‚ฌ์‹ค'
}
for key, name in fact_types.items():
print(f" {name}:")
print(f" ์ „์ฒด: {accs[f'acc_{key}']}% ({counts[f'acc_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ํ…Œ์ŠคํŠธ: {accs[f'acc_test_{key}']}% ({counts[f'acc_test_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ๊ฐœ๋ฐœ: {accs[f'acc_dev_{key}']}% ({counts[f'acc_dev_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
# ์งˆ๋ฌธ ์œ ํ˜•๋ณ„ ์ •ํ™•๋„
print(f"\nโ“ ์งˆ๋ฌธ ์œ ํ˜•๋ณ„ ์ •ํ™•๋„:")
question_types = {
'vp': '์œ ํšจํ•œ ์ „์ œ (Valid Premise)',
'fp': '์ž˜๋ชป๋œ ์ „์ œ (False Premise)'
}
for key, name in question_types.items():
print(f" {name}:")
print(f" ์ „์ฒด: {accs[f'acc_{key}']}% ({counts[f'acc_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ํ…Œ์ŠคํŠธ: {accs[f'acc_test_{key}']}% ({counts[f'acc_test_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ๊ฐœ๋ฐœ: {accs[f'acc_dev_{key}']}% ({counts[f'acc_dev_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
# ํ™‰ ์ˆ˜๋ณ„
print(f" ๋‹จ์ผ ํ™‰: {accs[f'acc_{key}_one_hop']}% ({counts[f'acc_{key}_one_hop']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ๋‹ค์ค‘ ํ™‰: {accs[f'acc_{key}_two_hop']}% ({counts[f'acc_{key}_two_hop']}๊ฐœ ์ƒ˜ํ”Œ)")
# ์—ฐ๋„๋ณ„
print(f" ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ: {accs[f'acc_{key}_old']}% ({counts[f'acc_{key}_old']}๊ฐœ ์ƒ˜ํ”Œ)")
print(f" ์ตœ์‹  ๋ฐ์ดํ„ฐ: {accs[f'acc_{key}_new']}% ({counts[f'acc_{key}_new']}๊ฐœ ์ƒ˜ํ”Œ)")
# ๋„๋ฉ”์ธ๋ณ„ ์ •ํ™•๋„
print(f"\n๐ŸŒ ๋„๋ฉ”์ธ๋ณ„ ์ •ํ™•๋„:")
domain_mapping = {
'politics': '์ •์น˜',
'sports': '์Šคํฌ์ธ ',
'entertainment': '์—ฐ์˜ˆ',
'weather': '๋‚ ์”จ',
'world': '์„ธ๊ณ„',
'economy': '๊ฒฝ์ œ',
'society': '์‚ฌํšŒ',
'it_science': 'IT/๊ณผํ•™',
'life_culture': '์ƒํ™œ/๋ฌธํ™”',
'unknown': 'UNK'
}
for key, name in domain_mapping.items():
if f'acc_{key}' in accs:
print(f" {name}:")
print(f" ์ „์ฒด: {accs[f'acc_{key}']}% ({counts[f'acc_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
if f'acc_test_{key}' in accs:
print(f" ํ…Œ์ŠคํŠธ: {accs[f'acc_test_{key}']}% ({counts[f'acc_test_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
pass
if f'acc_dev_{key}' in accs:
print(f" ๊ฐœ๋ฐœ: {accs[f'acc_dev_{key}']}% ({counts[f'acc_dev_{key}']}๊ฐœ ์ƒ˜ํ”Œ)")
pass
pass
print("\n" + "="*80)
def main():
"""๋ฉ”์ธ ํ•จ์ˆ˜"""
print("FreshQA ์ •ํ™•๋„ ๊ณ„์‚ฐ ์Šคํฌ๋ฆฝํŠธ")
print("="*50)
# CSV ํŒŒ์ผ ๊ฒฝ๋กœ ํ™•์ธ
csv_path = 'freshqa.csv'
if len(sys.argv) > 1:
csv_path = sys.argv[1]
if not os.path.exists(csv_path):
print(f"์˜ค๋ฅ˜: {csv_path} ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
print("์‚ฌ์šฉ๋ฒ•: python freshqa_acc.py [csv_file_path]")
sys.exit(1)
# ๋ฐ์ดํ„ฐ ๋กœ๋“œ
fresh_qa = load_freshqa_data(csv_path)
# ์ •ํ™•๋„ ๊ณ„์‚ฐ
accs, counts = calculate_accuracy(fresh_qa)
# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print_results(accs, counts)
# ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ๋„ ์ถœ๋ ฅ (์›๋ณธ ๋…ธํŠธ๋ถ๊ณผ ๋™์ผ)
print(f"\n๐Ÿ“‹ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ ๊ฒฐ๊ณผ:")
print(accs)
if __name__ == "__main__":
main()