fix: tighten french cv heuristics

Reject au sein prose continuations and recognize dotted MSc/BSc degree variants in education parsing.
This commit is contained in:
Antoine 2026-05-28 17:05:17 +02:00
parent a4c1ff3c0b
commit 77d2f0f5c6
2 changed files with 40 additions and 1 deletions

View File

@ -223,7 +223,7 @@ def _parse_education_entry(line: str) -> dict[str, str] | None:
def _looks_like_education_credential(text: str) -> bool:
lowered = text.lower()
lowered = text.lower().replace(".", "")
return any(
re.search(rf"\b{re.escape(keyword)}\b", lowered)
for keyword in EDUCATION_TITLE_KEYWORDS
@ -236,6 +236,9 @@ def _looks_like_institution(text: str) -> bool:
def _parse_experience_entry(line: str) -> dict[str, str] | None:
if " au sein " in line.lower():
return None
for connector in EXPERIENCE_LINE_CONNECTORS:
if line.count(connector) != 1:
continue

View File

@ -125,6 +125,20 @@ def test_extract_cv_signals_parses_french_experience_connectors() -> None:
]
def test_extract_cv_signals_ignores_french_prose_continuations() -> None:
text = dedent(
"""
Tonio
Location: France
Ingénieur au sein de BNP Paribas
"""
).strip()
extracted = extract_cv_signals(text)
assert extracted["experience_entries"] == []
def test_extract_cv_signals_ignores_in_paris_prose_tail() -> None:
text = dedent(
"""
@ -189,6 +203,28 @@ def test_extract_cv_signals_extracts_common_french_education_entries() -> None:
]
def test_extract_cv_signals_extracts_dotted_degree_variants() -> None:
text = dedent(
"""
Tonio
Location: France
Education:
M.Sc. in Data Engineering at EPITA
B.Sc. in Computer Science at University X
"""
).strip()
extracted = extract_cv_signals(text)
assert extracted["education_entries"] == [
{"credential": "M.Sc. in Data Engineering", "institution": "EPITA"},
{
"credential": "B.Sc. in Computer Science",
"institution": "University X",
},
]
def test_extract_cv_signals_ignores_before_moving_prose_tail() -> None:
text = dedent(
"""