{"record":{"id":"58840fa85836144e","repo":"hankcs/HanLP","slug":"unrecognized-mapper-type-mapper","errorCode":null,"errorMessage":"Unrecognized mapper type {mapper}","messagePattern":"Unrecognized mapper type (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"hanlp/common/transform.py","lineNumber":494,"sourceCode":"    def convert(y: str):\n        if y.startswith('M-'):\n            return 'I-'\n        return y\n\n\nclass NormalizeToken(ConfigurableNamedTransform):\n\n    def __init__(self, mapper: Union[str, dict], src: str, dst: str = None) -> None:\n        super().__init__(src, dst)\n        self.mapper = mapper\n        if isinstance(mapper, str):\n            mapper = get_resource(mapper)\n        if isinstance(mapper, str):\n            self._table = load_json(mapper)\n        elif isinstance(mapper, dict):\n            self._table = mapper\n        else:\n            raise ValueError(f'Unrecognized mapper type {mapper}')\n\n    def __call__(self, sample: dict) -> dict:\n        src = sample[self.src]\n        if self.src == self.dst:\n            sample[f'{self.src}_'] = src\n        if isinstance(src, str):\n            src = self.convert(src)\n        else:\n            src = [self.convert(x) for x in src]\n        sample[self.dst] = src\n        return sample\n\n    def convert(self, token) -> str:\n        return self._table.get(token, token)\n\n\nclass PunctuationMask(ConfigurableNamedTransform):\n    def __init__(self, src: str, dst: str = None) -> None:","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/hankcs/HanLP/blob/ddb1299bddff079e447af52ec12549c50636bfa8/hanlp/common/transform.py#L476-L512","documentation":"Feedforward normalizes activations into a list of length num_layers (a single activation is broadcast), but an explicitly passed list must match num_layers exactly. A mismatched activations list raises this ValueError in __init__.","triggerScenarios":"Passing activations=['relu','tanh'] with num_layers=3, or any list of activation names/objects whose length differs from num_layers.","commonSituations":"Editing an existing FFN config and changing num_layers without updating activations; mixing scalar and list conventions in YAML/JSON configs.","solutions":["Pass a single activation (e.g. activations='relu') to have it broadcast to all layers","Make len(activations) == num_layers","Double-check config files after changing layer counts"],"exampleFix":"# before\nFeedforward(input_dim=300, num_layers=3, hidden_dims=[128]*3, activations=['relu','tanh'])\n# after\nFeedforward(input_dim=300, num_layers=3, hidden_dims=[128]*3, activations='relu')","handlingStrategy":"validation","validationCode":"assert isinstance(activations, str) or len(activations) == num_layers","typeGuard":null,"tryCatchPattern":"try:\n    ff = Feedforward(..., activations=activations)\nexcept ValueError:\n    activations = 'relu'  # fall back to broadcast scalar\n    ff = Feedforward(..., activations=activations)","preventionTips":["Prefer scalar activations for uniform stacks","Update all per-layer lists together when changing num_layers"],"tags":["hanlp","feedforward","activation","config-validation"],"backgroundTag":"config-validation-failed","analyzedSha":"ddb1299bddff079e447af52ec12549c50636bfa8","analyzedAt":"2026-08-27T03:36:54.287Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}