@@ -45,7 +45,7 @@ DEFAULT_TAGGER_MODEL = Config().from_str(default_model_config)["model"]
45
45
@ Language.factory (
46
46
" tagger" ,
47
47
assigns = [" token.tag" ],
48
- default_config = {" model" : DEFAULT_TAGGER_MODEL, " overwrite" : False , " scorer" : {" @scorers" : " spacy.tagger_scorer.v1" }},
48
+ default_config = {" model" : DEFAULT_TAGGER_MODEL, " overwrite" : False , " scorer" : {" @scorers" : " spacy.tagger_scorer.v1" }, " neg_prefix " : " ! " },
49
49
default_score_weights = {" tag_acc" : 1.0 },
50
50
)
51
51
def make_tagger (
@@ -54,6 +54,7 @@ def make_tagger(
54
54
model: Model ,
55
55
overwrite: bool ,
56
56
scorer: Optional[Callable],
57
+ neg_prefix: str ,
57
58
):
58
59
""" Construct a part-of-speech tagger component.
59
60
@@ -62,7 +63,7 @@ def make_tagger(
62
63
in size, and be normalized as probabilities (all scores between 0 and 1,
63
64
with the rows summing to 1).
64
65
"""
65
- return Tagger(nlp.vocab, model, name, overwrite = overwrite, scorer = scorer)
66
+ return Tagger(nlp.vocab, model, name, overwrite = overwrite, scorer = scorer, neg_prefix = neg_prefix )
66
67
67
68
68
69
def tagger_score (examples , **kwargs ):
@@ -87,6 +88,7 @@ class Tagger(TrainablePipe):
87
88
*,
88
89
overwrite = BACKWARD_OVERWRITE,
89
90
scorer = tagger_score,
91
+ neg_prefix = " !" ,
90
92
):
91
93
""" Initialize a part-of-speech tagger.
92
94
@@ -103,7 +105,7 @@ class Tagger(TrainablePipe):
103
105
self .model = model
104
106
self .name = name
105
107
self ._rehearsal_model = None
106
- cfg = {" labels" : [], " overwrite" : overwrite}
108
+ cfg = {" labels" : [], " overwrite" : overwrite, " neg_prefix " : neg_prefix }
107
109
self .cfg = dict (sorted (cfg.items()))
108
110
self .scorer = scorer
109
111
@@ -253,7 +255,7 @@ class Tagger(TrainablePipe):
253
255
DOCS: https://spacy.io/api/tagger#get_loss
254
256
"""
255
257
validate_examples(examples, " Tagger.get_loss" )
256
- loss_func = SequenceCategoricalCrossentropy(names = self .labels, normalize = False , neg_prefix = " ! " )
258
+ loss_func = SequenceCategoricalCrossentropy(names = self .labels, normalize = False , neg_prefix = self .cfg[ " neg_prefix " ] )
257
259
# Convert empty tag "" to missing value None so that both misaligned
258
260
# tokens and tokens with missing annotation have the default missing
259
261
# value None.
0 commit comments