/
pexp13
/
EduTagging
Обзор
Документация
Войти
/
pexp13
/
EduTagging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
skill_extractor.py
104 строки
6 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
Код
Авторство
О чём код?
""" Экстрактор навыков/инструментов (газеттир + нормализация синонимов). Закрывает критерий ТЗ «экстракция тегов». Для известных тулзов даёт near-perfect precision/recall, т.к. инструменты присутствуют в тексте буквально. Правила матчинга — из ONTOLOGY.md (границы слов, регистр для Go, 1С/1C и т.д.). """ import re # ── Канонический тег -> список паттернов ────────────────────────────────────── # Каждый паттерн: (regex, case_sensitive) # По умолчанию матчинг регистронезависимый; для неоднозначных коротких — чувствит. SKILL_PATTERNS = { # ─ Программирование и данные ─ "Python": [(r"\bpython\b", False)], "SQL": [(r"\bsql\b", False)], "Java": [(r"\bjava\b", False)], # \b не зацепит JavaScript "Go": [(r"\bGo\b", True), (r"\bgolang\b", False)],# только заглавное Go "React": [(r"\breact(?:\.?js)?\b", False)], # React, React.js; не "reaction" "Django": [(r"\bdjango\b", False)], "Pandas": [(r"\bpandas\b", False)], "NumPy": [(r"\bnumpy\b", False)], "PyTorch": [(r"\bpytorch\b", False), (r"\btorch\b", False)], "Scikit-learn": [(r"\bscikit[- ]?learn\b", False), (r"\bsklearn\b", False)], "Git": [(r"\bgit\b", False), (r"\bgithub\b", False), (r"\bgitlab\b", False)], "Docker": [(r"\bdocker\b", False)], "Kubernetes": [(r"\bkubernetes\b", False), (r"\bk8s\b", False)], "Linux": [(r"\blinux\b", False), (r"\bubuntu\b", False)], "PostgreSQL": [(r"\bpostgre(?:s|sql)?\b", False)], "Postman": [(r"\bpostman\b", False)], # ─ Дизайн и творчество ─ "Figma": [(r"\bfigma\b", False)], "Adobe Photoshop": [(r"\bphotoshop\b", False), (r"\bфотошоп\b", False)], "Adobe Illustrator": [(r"\billustrator\b", False)], # НЕ "AI" "Adobe After Effects":[(r"\bafter\s*effects\b", False)], "Adobe Premiere Pro": [(r"\bpremiere\s*pro\b", False), (r"\bpremiere\b", False)], "InDesign": [(r"\bindesign\b", False)], "Holst": [(r"\bholst\b", False), (r"\bхолст\w*", False)], "SketchUp": [(r"\bsketchup\b", False)], # ─ Инженерия / САПР ─ "ArchiCAD": [(r"\barchicad\b", False)], "Draw.io": [(r"\bdraw\.?io\b", False)], "AutoCAD": [(r"\bautocad\b", False), (r"\bавтокад\b", False)], "Revit": [(r"\brevit\b", False)], "КОМПАС-3D": [(r"\bкомпас[- ]?3d\b", False), (r"\bкомпас\b", False)], # ─ Аналитика и офис ─ "Excel": [(r"\bexcel\b", False), (r"\bэксель\b", False)], "Power BI": [(r"\bpower\s*bi\b", False)], "Power Query": [(r"\bpower\s*query\b", False)], "Power Pivot": [(r"\bpower\s*pivot\b", False)], "Google Таблицы": [(r"\bgoogle\s*sheets\b", False), (r"\bгугл\s*таблиц\w*", False), (r"\bgoogle\s*таблиц\w*", False)], "Google Презентации": [(r"\bgoogle\s*slides\b", False), (r"\bgoogle\s*презентац\w*", False)], "Google Analytics": [(r"\bgoogle\s*analytics\b", False)], "Яндекс Метрика": [(r"\bметрик[аиуе]\b", False), (r"\byandex\s*metrica\b", False)], "Яндекс Директ": [(r"\bяндекс[\.\s]*директ\b", False), (r"\byandex\s*direct\b", False)], "Яндекс Маркет": [(r"\bяндекс[\.\s]*маркет\w*", False), (r"\byandex\s*market\b", False)], "1С": [(r"\b1\s?[сc](?::[\w]+|\b)", False)], # 1С / 1C / 1С:Предприятие, не "1c5" # ─ Маркетплейсы и реклама ─ "Ozon": [(r"\bozon\b", False), (r"\bозон\b", False)], "Wildberries": [(r"\bwildberries\b", False), (r"\bвайлдберриз\b", False), (r"\bwb\b", True)], "Sellerden AI": [(r"\bsellerden(?:\s*ai)?\b", False)], # ─ Управление и методологии ─ "Scrum": [(r"\bscrum\b", False), (r"\bскрам\b", False)], "Kanban": [(r"\bkanban\b", False), (r"\bканбан\b", False)], "Trello": [(r"\btrello\b", False)], "Tilda": [(r"\btilda\b", False), (r"\bтильда\b", False)], } # Прекомпиляция _COMPILED = { tag: [re.compile(p, 0 if cs else re.IGNORECASE) for p, cs in pats] for tag, pats in SKILL_PATTERNS.items() } def extract_skills(text): """Возвращает список канонических тегов навыков, найденных в тексте.""" if not text: return [] found = [] for tag, patterns in _COMPILED.items(): if any(p.search(text) for p in patterns): found.append(tag) return found if __name__ == "__main__": tests = [ "Backend на Go: микросервисы, PostgreSQL, Docker", "Продажи на Wildberries через Sellerden AI", "Python для анализа данных: Pandas, NumPy", "Курс по JavaScript и реакции пользователей", # не должно дать Java/React "Бухгалтерия в 1С:Предприятие 8.3", "Excel и Power BI для аналитика", ] for t in tests: print(f"{t}\n -> {extract_skills(t)}\n")