# fa_ent_news_sm — Persian NER, CPU size (sm). # # Standalone package, built by `spacy project run ner`, sitting alongside (not inside) # fa_dep_news_sm. Trained on the PerDT treebank's own NER layer (CC BY-SA 4.0, edited # prose), transferred onto this project's tokenization by scripts/transfer_perdt_ner.py. # Scores ENTS_F 71.87 on the PerDT test split; see docs/MODELS.md §3.2 for the corpus # survey (ParsTwiNER, ARMAN, PEYMA and others were considered and rejected on licence or # genre grounds). # # Deliberate deviation from `spacy init config --pipeline ner`: the tok2vec is # EMBEDDED inside components.ner.model instead of being a separate `tok2vec` # component with a Tok2VecListener. A listener can only resolve inside the pipeline # it was trained in; embedding makes the component self-contained and therefore # sourceable into another pipeline via `nlp.add_pipe("ner", source=...)`. This is the same # design as en_core_web_sm, whose `ner` "has its own independent internal tok2vec" # (https://spacy.io/models#design). `assemble-core` in project.yml uses exactly that to # source this component into fa_core_news_sm alongside the dep pipeline. [paths] train = null dev = null vectors = null init_tok2vec = null [system] gpu_allocator = null seed = 0 [nlp] lang = "fa" pipeline = ["ner"] batch_size = 1000 disabled = [] before_creation = null after_creation = null after_pipeline_creation = null [nlp.tokenizer] @tokenizers = "spacy.Tokenizer.v1" [nlp.vectors] @vectors = "spacy.Vectors.v1" [components] [components.ner] factory = "ner" moves = null update_with_oracle_cut_size = 100 incorrect_spans_key = null [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.ner.model.tok2vec] @architectures = "spacy.Tok2Vec.v2" [components.ner.model.tok2vec.embed] @architectures = "spacy.MultiHashEmbed.v2" width = ${components.ner.model.tok2vec.encode.width} attrs = ["NORM", "PREFIX", "SUFFIX", "SHAPE"] rows = [5000, 1000, 2500, 2500] include_static_vectors = false [components.ner.model.tok2vec.encode] @architectures = "spacy.MaxoutWindowEncoder.v2" width = 96 depth = 4 window_size = 1 maxout_pieces = 3 [components.ner.scorer] @scorers = "spacy.ner_scorer.v1" [corpora] [corpora.train] @readers = "spacy.Corpus.v1" path = ${paths.train} max_length = 0 gold_preproc = false limit = 0 augmenter = null [corpora.dev] @readers = "spacy.Corpus.v1" path = ${paths.dev} 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 = 400 frozen_components = [] annotating_components = [] before_to_disk = null before_update = null [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 = 1e-08 learn_rate = 0.001 [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.score_weights] ents_f = 1.0 ents_p = 0.0 ents_r = 0.0 ents_per_type = null [initialize] vectors = ${paths.vectors} init_tok2vec = ${paths.init_tok2vec} vocab_data = null lookups = null before_init = null after_init = null [initialize.tokenizer] [initialize.components] [pretraining]