Files
miem_workers/app/services/academic_degrees.py

34 lines
1.3 KiB
Python

import re
from typing import Any
_PATTERN = re.compile(r"\b(?:кандидат|доктор)(?:\s+[\w-]+){0,12}\s+наук\b|\bph\.?\s*d\.?(?!\w)", re.IGNORECASE)
def academic_degrees(data: dict[str, Any] | None) -> list[str]:
degrees = []
seen = set()
for section in (data or {}).get("sections") or []:
if not isinstance(section, dict) or not re.search(
r"образован|степен|academic degree|education", str(section.get("title") or ""), re.IGNORECASE
):
continue
values = [
*(entry.get("text") for entry in section.get("year_entries") or [] if isinstance(entry, dict)),
*(section.get("paragraphs") or []),
*(section.get("items") or []),
section.get("raw_text"),
]
table = section.get("table") or {}
for row in table.get("rows") or []:
if isinstance(row, dict):
values.extend(row.get("cells") or [])
for value in values:
text = str(value or "").strip()
for match in _PATTERN.finditer(text):
degree = match.group(0).strip()
if degree.casefold() not in seen:
seen.add(degree.casefold())
degrees.append(degree)
return degrees