MrNK2107
feat(extraction): add FieldExtractor pipeline, ProfileStore with lazy loading, and skill matching
e01a2b0
Raw
History Blame Contribute Delete
1.51 kB
from __future__ import annotations
import re
from typing import Any
from src.extraction.career_history_utils import latest_role
_SENIORITY_PREFIXES = [
"senior", "sr", "junior", "jr", "lead", "staff",
"principal", "chief", "head", "vp", "vp of", "director of",
"associate", "assistant", "principal",
]
_SENIORITY_PATTERN = re.compile(
r"^(?:" + "|".join(_SENIORITY_PREFIXES) + r")\s+",
re.IGNORECASE,
)
def extract_title(
prof: dict[str, Any],
history: list[dict[str, Any]],
) -> tuple[str | None, str]:
direct = prof.get("current_title")
if direct and isinstance(direct, str) and direct.strip():
return direct.strip(), "direct"
latest = latest_role(history)
if latest:
title = latest.get("title")
if title and isinstance(title, str) and title.strip():
return title.strip(), "history"
headline = prof.get("headline", "")
if headline and isinstance(headline, str) and headline.strip():
extracted = _parse_headline(headline)
if extracted:
return extracted, "headline"
return None, "not_found"
def _parse_headline(headline: str) -> str | None:
candidate = headline.strip()
if "|" in candidate:
candidate = candidate.split("|")[0].strip()
if " at " in candidate.lower():
candidate = candidate.lower().split(" at ")[0].strip().title()
candidate = _SENIORITY_PATTERN.sub("", candidate).strip()
if candidate:
return candidate
return None