From 2625adc1b112feced8a0c4016e893d8b4659a772 Mon Sep 17 00:00:00 2001 From: Taewoong Kim Date: Fri, 3 Jul 2026 00:54:20 +0900 Subject: [PATCH] Fix MedicalNERRecognizer loading with YAML context --- .../ner/medical_ner_recognizer.py | 3 ++ .../tests/test_medical_ner_recognizer.py | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/presidio-analyzer/presidio_analyzer/predefined_recognizers/ner/medical_ner_recognizer.py b/presidio-analyzer/presidio_analyzer/predefined_recognizers/ner/medical_ner_recognizer.py index 240d39fe50..1f125df2b8 100644 --- a/presidio-analyzer/presidio_analyzer/predefined_recognizers/ner/medical_ner_recognizer.py +++ b/presidio-analyzer/presidio_analyzer/predefined_recognizers/ner/medical_ner_recognizer.py @@ -36,6 +36,7 @@ def __init__( supported_entities: Optional[List[str]] = None, name: str = "MedicalNERRecognizer", supported_language: str = "en", + context: Optional[List[str]] = None, aggregation_strategy: str = "simple", threshold: float = 0.3, device: Optional[Union[str, int]] = None, @@ -50,6 +51,7 @@ def __init__( :param supported_entities: Entity types to return (None = all mapped). :param name: Recognizer name :param supported_language: Language code + :param context: Context words used for context-aware score enhancement :param aggregation_strategy: Pipeline aggregation strategy :param threshold: Minimum confidence score (0.0 - 1.0) :param device: Device string/int (None = auto-detect) @@ -61,6 +63,7 @@ def __init__( supported_entities=supported_entities, name=name, supported_language=supported_language, + context=context, aggregation_strategy=aggregation_strategy, threshold=threshold, device=device, diff --git a/presidio-analyzer/tests/test_medical_ner_recognizer.py b/presidio-analyzer/tests/test_medical_ner_recognizer.py index bf2505f7a1..eb232cc1d4 100644 --- a/presidio-analyzer/tests/test_medical_ner_recognizer.py +++ b/presidio-analyzer/tests/test_medical_ner_recognizer.py @@ -8,6 +8,9 @@ from presidio_analyzer.predefined_recognizers.ner.huggingface_ner_recognizer import ( HuggingFaceNerRecognizer, ) +from presidio_analyzer.recognizer_registry.recognizers_loader_utils import ( + RecognizerListLoader, +) def _make_pipeline_prediction(entity_group, score, word, start, end): @@ -86,6 +89,35 @@ def test_default_aggregation_strategy(recognizer): assert recognizer.aggregation_strategy == "simple" +def test_loader_with_language_context(): + """YAML loader should be able to pass language context.""" + recognizer_conf = { + "name": "MedicalNERRecognizer", + "type": "predefined", + "supported_languages": [ + {"language": "en", "context": ["diagnosis", "medication"]} + ], + } + + with ( + patch(_PATCH_HF, new=MagicMock()), + patch(_PATCH_TORCH, new=MagicMock()), + patch(_PATCH_DEVICE) as mock_dd, + ): + mock_dd.get_device.return_value = "cpu" + recognizers = list( + RecognizerListLoader.get( + recognizers=[recognizer_conf], + supported_languages=["en"], + global_regex_flags=26, + ) + ) + + assert len(recognizers) == 1 + assert isinstance(recognizers[0], MedicalNERRecognizer) + assert recognizers[0].context == ["diagnosis", "medication"] + + def test_custom_supported_entities(): """Users can override supported_entities to filter which types are returned.""" rec = _make_recognizer(