/
pexp13
/
EduTagging
Обзор
Документация
Войти
/
pexp13
/
EduTagging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
attribute_labeler.py
79 строк
4 KB
A. Zasimskij
Create: attribute_labeler.py, client_tags.csv, course_tagger_v7.ipynb, hybrid_pipeline.py, skill_extractor.py, skill_extractor_full.py, test_set_v5.csv, train_final_v5.csv
20 июн 2026, 15:46
Верифицирован
20 июн 2026, 15:46
2308d87
Код
Авторство
О чём код?
""" Labeling functions для уровней сложности (С нуля / Продвинутый). Weak supervision на основе текстовых маркеров из ONTOLOGY.md. Назначение в active learning: 1) Аудит шума в текущих метках is_beginner/is_pro. 2) Авто-предложение меток для неуверенных примеров. """ import re import pandas as pd # ── Сильные маркеры новичкового уровня ──────────────────────────────────────── BEGINNER_MARKERS = [ r"с нуля", r"для начинающих", r"начинающих специалистов", r"без опыта", r"не требует.{0,20}(?:знаний|опыта|подготовки)", r"новичк", r"с азов", r"для новичков", r"первые шаги", r"познакомитесь с основами", r"начать с нуля", r"даже если вы никогда", r"с любого уровня", r"не нужны предварительн", r"базовый курс", r"введение в", ] # ── Сильные маркеры продвинутого уровня ─────────────────────────────────────── PRO_MARKERS = [ r"продвинут", r"для практикующих", r"углубл", r"advanced", r"экспертн", r"для специалистов", r"для профессионал", r"опытных", r"следующий уровень", r"повышение квалификации", r"прокачайте", r"для тех, кто уже", r"требуется опыт", r"необходим опыт", r"уверенное владение", r"для middle", r"для senior", r"сложные.{0,15}(?:темы|задачи|кейсы)", ] _BEG = [re.compile(m, re.IGNORECASE) for m in BEGINNER_MARKERS] _PRO = [re.compile(m, re.IGNORECASE) for m in PRO_MARKERS] def detect_level(text): """Возвращает (beginner_signal, pro_signal) — есть ли маркеры в тексте.""" text = str(text) beg = any(p.search(text) for p in _BEG) pro = any(p.search(text) for p in _PRO) return beg, pro def audit(path): df = pd.read_csv(path, encoding="utf-8") df["text"] = df["text"].fillna(df["course_name"]) df["lbl_beg"] = pd.to_numeric(df.get("is_beginner", 0), errors="coerce").fillna(0).astype(int) df["lbl_pro"] = pd.to_numeric(df.get("is_pro", 0), errors="coerce").fillna(0).astype(int) sig = df["text"].apply(detect_level) df["sig_beg"] = sig.apply(lambda x: int(x[0])) df["sig_pro"] = sig.apply(lambda x: int(x[1])) n = len(df) print(f"=== Аудит меток уровней: {path} ({n} строк) ===\n") for dim, lbl, sig_col in [("С нуля", "lbl_beg", "sig_beg"), ("Продвинутый", "lbl_pro", "sig_pro")]: L, S = df[lbl_col := lbl], df[sig_col] label_pos = int(L.sum()) signal_pos = int(S.sum()) agree_pos = int(((L == 1) & (S == 1)).sum()) # метка=1 и маркер есть ✓ # метка=1, но маркера в тексте НЕТ -> подозрение на ложную метку lbl_no_sig = int(((L == 1) & (S == 0)).sum()) # маркер ЕСТЬ, но метка=0 -> пропущенная метка sig_no_lbl = int(((L == 0) & (S == 1)).sum()) print(f"--- {dim} ---") print(f" Помечено меткой: {label_pos}") print(f" Найдено маркером: {signal_pos}") print(f" Совпало (метка+маркер): {agree_pos}") print(f" Метка=1, маркера НЕТ: {lbl_no_sig} <- подозрение на ложную метку") print(f" Маркер ЕСТЬ, метка=0: {sig_no_lbl} <- пропущенная метка") disagreement = lbl_no_sig + sig_no_lbl print(f" ИТОГО расхождений: {disagreement} ({100*disagreement/n:.1f}% датасета)\n") return df if __name__ == "__main__": audit("train_final_v3.csv")