Why are default entities sourced from another language model (Spacy 3.0)?

Viewed 53

So Im using Spacy 3.0 to train basically all pipelines with custom data. Weirdly enough Spacy seems to source the entities of the NER pipeline from another model, possibly en_core_web_md. So if I type the sentence "Who is Barrack Obama" into spacy it detects the name as a PERSON entity, which is not a behavior I want since I only want to work with my own entitites.

I cant seem to find why it would source the entities though, here is my config:

[paths]
train = "trainer/data/sent_train.spacy"
dev = "trainer/data/sent_train.spacy"
vectors = "en_core_web_md"
init_tok2vec = "en_core_web_md"

[system]
gpu_allocator = null
seed = 0

[nlp]
lang = "en"
pipeline = ["tok2vec","tagger","parser","ner","textcat_multilabel"]
batch_size = 1000
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}

[components]

[components.ner]
factory = "ner"

[components.ner.model]
@architectures = "spacy.TransitionBasedParser.v2"
state_type = "ner"
extra_state_tokens = false
hidden_width = 64
maxout_pieces = 2
use_upper = true
nO = null

[components.parser]
source = "en_core_web_md"

[components.tagger]
source = "en_core_web_md"

[components.textcat_multilabel]
factory = "textcat_multilabel"
scorer = {"@scorers":"spacy.textcat_multilabel_scorer.v1"}
threshold = 0.5

[components.textcat_multilabel.model]
@architectures = "spacy.TextCatBOW.v2"
exclusive_classes = false
ngram_size = 1
no_output_layer = false
nO = null

[components.tok2vec]
source = "en_core_web_md"

[corpora]

[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths.dev}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[corpora.train]
@readers = "spacy.Corpus.v1"
path = ${paths.train}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[training]
dev_corpus = "corpora.dev"
train_corpus = "corpora.train"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
dropout = 0.1
accumulate_gradient = 1
patience = 1600
max_epochs = 0
max_steps = 20000
eval_frequency = 200
frozen_components = []
annotating_components = []
before_to_disk = null

[training.batcher]
@batchers = "spacy.batch_by_words.v1"
discard_oversize = false
tolerance = 0.2
get_length = null

[training.batcher.size]
@schedules = "compounding.v1"
start = 100
stop = 1000
compound = 1.001
t = 0.0

[training.logger]
@loggers = "spacy.ConsoleLogger.v1"
progress_bar = false

[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001
learn_rate = 0.001

[training.score_weights]
tag_acc = 0.25
dep_uas = 0.12
dep_las = 0.12
dep_las_per_type = null
sents_p = null
sents_r = null
sents_f = 0.0
ents_f = 0.25
ents_p = 0.0
ents_r = 0.0
ents_per_type = null
cats_score = 0.25
cats_score_desc = null
cats_micro_p = null
cats_micro_r = null
cats_micro_f = null
cats_macro_p = null
cats_macro_r = null
cats_macro_f = null
cats_macro_auc = null
cats_f_per_type = null
cats_macro_auc_per_type = null

[pretraining]

[initialize]
vectors = ${paths.vectors}
init_tok2vec = ${paths.init_tok2vec}
vocab_data = null
lookups = null
before_init = null
after_init = null

[initialize.components]

[initialize.tokenizer]

Since the [components.ner] section says factory = "ner". It should create a blank new one right? So why are there already entity types in my model? I do have to mention here that I want other components like the parser or tagger to be sourced from the already trained model, so there is no mistake here

1 Answers

Ok so I solved it now and I simply searched at the wrong spot. The issue was that during the binarisation of my data, I used the pretrained model to produce the docs. So since Im training with a large set of different files, Im guessing that the docs without my own entities, simply got the entity types of the pretrained model assigned

Related