From 4337f7a381e525e808c95758a7069a7dda20cb08 Mon Sep 17 00:00:00 2001 From: Peter Foster Date: Wed, 21 Jan 2026 17:53:56 +0000 Subject: [PATCH] feat: Add FE colleges and improve education institution matching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add notable Further Education colleges to recognised institutions (Loughborough College, Hartpury College, etc.) - Improve compound name matching to handle separators (/, &, -, ,) so "Loughborough College/Motorsport UK Academy" now matches 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/RealCV.Application/Data/UKInstitutions.cs | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/RealCV.Application/Data/UKInstitutions.cs b/src/RealCV.Application/Data/UKInstitutions.cs index 018e8f3..ca1b42a 100644 --- a/src/RealCV.Application/Data/UKInstitutions.cs +++ b/src/RealCV.Application/Data/UKInstitutions.cs @@ -168,6 +168,19 @@ public static class UKInstitutions "Cranfield School of Management", "Ashridge Business School", "Alliance Manchester Business School", + + // Notable Further Education Colleges + "Loughborough College", + "City of Bristol College", + "Newcastle College", + "Leeds City College", + "City College Norwich", + "Weston College", + "Chichester College", + "Hartpury College", + "Myerscough College", + "Plumpton College", + "Writtle University College", }; /// @@ -270,7 +283,35 @@ public static class UKInstitutions if (NameVariations.TryGetValue(normalised, out var officialName)) return officialName; - // Fuzzy match + // Handle compound names (e.g., "Loughborough College/Motorsport UK Academy") + // Split by common separators and check each part + var separators = new[] { '/', '&', '-', '–', '—', ',' }; + if (normalised.IndexOfAny(separators) >= 0) + { + var parts = normalised.Split(separators, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + foreach (var part in parts) + { + // Try direct match on part + if (RecognisedInstitutions.Contains(part)) + return part; + + // Try variation match on part + if (NameVariations.TryGetValue(part, out var partOfficialName)) + return partOfficialName; + + // Try fuzzy match on part + foreach (var institution in RecognisedInstitutions) + { + if (institution.Contains(part, StringComparison.OrdinalIgnoreCase) || + part.Contains(institution, StringComparison.OrdinalIgnoreCase)) + { + return institution; + } + } + } + } + + // Fuzzy match on full name foreach (var institution in RecognisedInstitutions) { if (institution.Contains(normalised, StringComparison.OrdinalIgnoreCase) ||