diff --git a/src/JobsMedical.Web/Services/ListingParser.cs b/src/JobsMedical.Web/Services/ListingParser.cs index b3b37af..03a90cc 100644 --- a/src/JobsMedical.Web/Services/ListingParser.cs +++ b/src/JobsMedical.Web/Services/ListingParser.cs @@ -51,7 +51,19 @@ public class HeuristicListingParser : IListingParser { if (text.Contains(Normalize(role))) { p.RoleName = role; break; } } - if (p.RoleName is null && ContainsAny(text, "پزشک", "دکتر")) p.RoleName = "پزشک عمومی"; + // Synonyms common on Divar/Medjobs → canonical seeded role names. + if (p.RoleName is null) + { + p.RoleName = + ContainsAny(text, "اتاق عمل", "اسکراب") ? "تکنسین اتاق عمل" + : ContainsAny(text, "فوریت", "اورژانس پیش بیمارستانی", "آمبولانس") ? "تکنسین فوریت‌های پزشکی" + : ContainsAny(text, "آزمایشگاه", "علوم آزمایشگاهی", "نمونه گیر") ? "کارشناس آزمایشگاه" + : ContainsAny(text, "بهیار", "کمک بهیار", "کمک پرستار", "بیماربر", "مراقب", "سالمند", "همراه بیمار", "تزریقات", "پانسمان") ? "پرستار" + : ContainsAny(text, "ماما", "مامایی") ? "ماما" + : ContainsAny(text, "فوق تخصص", "متخصص") ? "پزشک متخصص" + : ContainsAny(text, "پزشک", "دکتر", "طبیب") ? "پزشک عمومی" + : null; + } p.Notes.Add(p.RoleName is null ? "نقش: تشخیص داده نشد" : $"نقش: {p.RoleName}"); // --- Shift type --- diff --git a/src/JobsMedical.Web/Services/Scraping/ListingValidator.cs b/src/JobsMedical.Web/Services/Scraping/ListingValidator.cs index 4876203..b774a24 100644 --- a/src/JobsMedical.Web/Services/Scraping/ListingValidator.cs +++ b/src/JobsMedical.Web/Services/Scraping/ListingValidator.cs @@ -20,10 +20,15 @@ public class ListingValidator "بک لینک", "تبلیغات", "قرعه کشی", "جایزه", "کازینو", "شرط بندی", "بیت کوین" }; + // Clinical/health markers ONLY. Deliberately excludes generic words like «استخدام» and «شیفت» + // (they match retail/restaurant ads on Divar). A post must contain a real care-domain term. private static readonly string[] MedicalMarkers = { - "شیفت", "درمانگاه", "بیمارستان", "کلینیک", "پزشک", "پرستار", "ماما", "تکنسین", - "اورژانس", "استخدام", "کادر درمان", "مطب", "آنکال", "کشیک" + "درمانگاه", "بیمارستان", "کلینیک", "مطب", "اورژانس", "کادر درمان", "پلی کلینیک", + "پزشک", "دکتر", "پرستار", "بهیار", "کمک بهیار", "کمک پرستار", "بیماربر", + "ماما", "مامایی", "تکنسین", "اتاق عمل", "بیهوشی", "رادیولوژی", "سونوگرافی", + "آزمایشگاه", "تزریقات", "پانسمان", "فیزیوتراپ", "دندان", "داروخانه", "داروساز", + "دیالیز", "فوریت", "آی سی یو", "سی سی یو", "آنکال", "کشیک", "تریاژ", "نوزادان", "سالمند" }; public ValidationResult Validate(string rawText, ParsedListing parsed)