File size: 4,883 Bytes
c9bae1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7452c48
 
c9bae1a
 
 
 
 
 
 
7452c48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9bae1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7452c48
 
 
 
 
 
 
 
c9bae1a
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""๋ฒค์น˜๋งˆํฌ(ํšŒ์‚ฌ) ์ด๋ฆ„ ๊ฐ€๋ช… ์ฒ˜๋ฆฌ โ€” Space ํ‘œ์‹œ ์ „์šฉ.

๋ฆฌ๋”๋ณด๋“œ ์ปฌ๋Ÿผ์€ `<ํšŒ์‚ฌ>_<๋ฒ„์ „/์Šคํ”Œ๋ฆฟ>_<์นดํ…Œ๊ณ ๋ฆฌ>` ํ˜•์‹์ด๊ณ  ๋งจ ์•ž ํ† ํฐ์ด ์‹ค์ œ
๊ณ ๊ฐ/๊ธฐ๊ด€๋ช…(Coupang, Hyundai, KISA ...)์ด๋ผ, ์™ธ๋ถ€ ๊ณต๊ฐœ SPACE ์—์„œ๋Š” ๋งจ ์•ž
ํ† ํฐ๋งŒ ๋‘ ๊ธ€์ž ์ฝ”๋“œ๋กœ ์น˜ํ™˜ํ•œ๋‹ค. ๋ฒ„์ „/์Šคํ”Œ๋ฆฟยท์นดํ…Œ๊ณ ๋ฆฌ๋Š” ๊ทธ๋Œ€๋กœ ๋‘ฌ์„œ ํ‘œ์˜
์˜๋ฏธ์™€ ๊ธฐ์กด ๋™์ž‘์„ ๋ณด์กดํ•œ๋‹ค.

  Coupang_balanced_test_v1_Fire  ->  Co_balanced_test_v1_Fire
  Hyundai_v3_Falldown            ->  Hy_v3_Falldown
  Korea_nrf_Smoke                ->  Ko_nrf_Smoke

๊ตฌ๊ธ€ ์‹œํŠธ ์›๋ณธ์€ ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” sheet2df ๊ฐ€ df ๋ฅผ ๋งŒ๋“  ํ‘œ์‹œ ๋‹จ๊ณ„์—์„œ๋งŒ
์ปฌ๋Ÿผ๋ช…์„ ์น˜ํ™˜ํ•˜๊ณ , config ์˜ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก/์ˆจ๊น€ ๊ทœ์น™๋„ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋งž์ถฐ ๊ฐฑ์‹ ํ•œ๋‹ค.
"""

import re

import enviroments.config as config

_map = {}  # ํšŒ์‚ฌ๋ช…(lower) -> 2๊ธ€์ž ์ฝ”๋“œ
_orig_default_avg = None
_orig_default_ds = None
_orig_hide_exact = None

# โ”€โ”€ ๋ชจ๋ธ๋ช… ํ† ํฐ ๊ฐ€๋ช… (์…€ ๊ฐ’ ์น˜ํ™˜) โ”€โ”€
# ํ•˜์ดํผ๋งํฌ ๋ชจ๋ธ๋ช… ์•ˆ์˜ ํŠน์ • ๋ชจ๋ธ ํ† ํฐ์„ ๊ฐ€๋ฆฐ๋‹ค. ์˜ˆ: PE(Perception Encoder) -> CLIP.
# ์•ž์œผ๋กœ ๊ฐ€๋ฆด ๋ชจ๋ธ์ด ์ƒ๊ธฐ๋ฉด ์—ฌ๊ธฐ์— {"์›๋ณธํ† ํฐ": "ํ‘œ์‹œํ† ํฐ"} ์œผ๋กœ ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
# ํ† ํฐ ๊ฒฝ๊ณ„๋Š” ๋ฌธ์ž์—ด ์‹œ์ž‘/๋ ๋˜๋Š” '-' '_' ๋กœ ๋ณธ๋‹ค (PE-Core, FT_PE-Core, PE_Large ๋ชจ๋‘ ๋งค์นญ,
# PETAยทPErson ๊ฐ™์€ ๋‹ค๋ฅธ ๋‹จ์–ด๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ). ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„.
MODEL_TOKEN_SUBS = {
    "PE": "CLIP",
}
_token_re = re.compile(
    r"(?<![A-Za-z0-9])(" + "|".join(re.escape(k) for k in MODEL_TOKEN_SUBS) + r")(?=[-_]|$)"
)


def _sub_model_tokens(s: str) -> str:
    return _token_re.sub(lambda m: MODEL_TOKEN_SUBS[m.group(1)], s)


def _base_code(company: str) -> str:
    """ํšŒ์‚ฌ๋ช… -> ์•ž 2๊ธ€์ž ์ฝ”๋“œ (์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž + ๋‘˜์งธ ์†Œ๋ฌธ์ž). ์˜ˆ: Coupang -> Co."""
    alnum = [c for c in company if c.isalnum()]
    if not alnum:
        return "Xx"
    if len(alnum) == 1:
        return alnum[0].upper() + "x"
    return alnum[0].upper() + alnum[1].lower()


def _leading_token(col: str):
    """๋ฒค์น˜๋งˆํฌ ์ปฌ๋Ÿผ์ด๋ฉด ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ์„ ๋ฐ˜ํ™˜, ์•„๋‹ˆ๋ฉด None.

    ๊ณต๋ฐฑ ํฌํ•จ(์˜ˆ: 'Model name', 'Datasets Used')ยท'_' ์—†์Œ(TASK, Model)ยท
    AVG_* (๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹) ์€ ์น˜ํ™˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.
    """
    if " " in col or "_" not in col:
        return None
    head = col.split("_", 1)[0]
    if head == "AVG":
        return None
    return head


def _build_map(companies):
    """ํšŒ์‚ฌ๋ช… ๋ชฉ๋ก -> {ํšŒ์‚ฌ๋ช…(lower): ์ฝ”๋“œ}. ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋‹ค๋ฅธ ์ด๋ฆ„์€ ๊ฐ™์€ ํšŒ์‚ฌ๋กœ
    ๋ณด๊ณ  ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ ํ•ฉ์นœ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฒน์น˜๋ฉด ๋’ค์— ์ˆซ์ž๋ฅผ ๋ถ™์—ฌ ์œ ์ผ์„ฑ ๋ณด์žฅ."""
    m, used = {}, set()
    for name in sorted(set(companies), key=str.lower):
        key = name.lower()
        if key in m:
            continue
        base = _base_code(name)
        code, n = base, 1
        while code in used:
            n += 1
            code = f"{base}{n}"
        used.add(code)
        m[key] = code
    return m


def alias_of(company: str) -> str:
    return _map.get(company.lower()) or _base_code(company)


def _anon_col(col: str) -> str:
    """์ปฌ๋Ÿผ๋ช…์˜ ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ๋งŒ ์ฝ”๋“œ๋กœ ์น˜ํ™˜. ๋‚˜๋จธ์ง€(๋ฒ„์ „/์นดํ…Œ๊ณ ๋ฆฌ)๋Š” ์œ ์ง€."""
    head = _leading_token(col)
    if head is None:
        return col
    return f"{alias_of(head)}{col[len(head):]}"


def anonymize_df(df):
    """df ๋ฒค์น˜๋งˆํฌ ์ปฌ๋Ÿผ์˜ ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ์„ 2๊ธ€์ž ์ฝ”๋“œ๋กœ ์น˜ํ™˜ํ•˜๊ณ ,
    config ์˜ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก/์ˆจ๊น€ ๊ทœ์น™๋„ ๋™์ผ ์ฝ”๋“œ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค (idempotent).
    """
    global _map, _orig_default_avg, _orig_default_ds, _orig_hide_exact
    if _orig_default_avg is None:
        _orig_default_avg = list(config.DEFAULT_AVG_DATASETS)
        _orig_default_ds = list(config.DEFAULT_DATASETS)
        _orig_hide_exact = list(config.HIDE_COLUMN_EXACT)

    companies = [t for t in (_leading_token(c) for c in df.columns) if t]
    _map = _build_map(companies + list(_orig_default_avg))

    df = df.rename(columns={c: _anon_col(c) for c in df.columns})

    # ๋ชจ๋ธ๋ช… ํ† ํฐ ๊ฐ€๋ช…: ํ•˜์ดํผ๋งํฌ(Model/Model name/Model link)์™€ ์…€ ๊ฐ’ ์ „๋ฐ˜์—์„œ
    # PE -> CLIP ๋“ฑ ์น˜ํ™˜. ํ‘œ์‹œ ํ…์ŠคํŠธ์™€ ๋งํฌ URL ์„ ํ•จ๊ป˜ ๋ฐ”๊ฟ” ๋…ธ์ถœ์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
    for col in df.columns:
        if df[col].dtype == object:
            df[col] = df[col].map(
                lambda v: _sub_model_tokens(v) if isinstance(v, str) else v
            )

    # config ๋„ ๊ฐ™์€ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ ๋ฆฌ๋”๋ณด๋“œ ์…€๋ ‰ํ„ฐ/AVG/์ˆจ๊น€์ด ์ผ๊ด€๋˜๊ฒŒ ๋™์ž‘
    config.DEFAULT_AVG_DATASETS = [alias_of(d) for d in _orig_default_avg]
    config.DEFAULT_DATASETS = [
        d if d == "AVG" else alias_of(d) for d in _orig_default_ds
    ]
    config.HIDE_COLUMN_EXACT = [_anon_col(c) for c in _orig_hide_exact]
    return df