class_docstr: Implements conditional random fields (CRF) to do named entity recognition.
class_docstr_tok: ["Implements","conditional","random","fields","(","CRF",")","to","do","named","entity","recognition","."]
docstr: Trains the extractor on a data set.
docstr_tok: ["Trains","the","extractor","on","a","data","set","."]
code: def train(self, training_data: TrainingData) -> Resource:
      """Trains the extractor on a data set."""
      # checks whether there is at least one
      # example with an entity annotation
      if not training_data.entity_examples:
          logger.debug(
              "No training examples with entities present. Skip training"
              "of 'CRFEntityExtractor'."
          )
          return self._resource
  
      self.check_correct_entity_annotations(training_data)
  
      if self.component_config[BILOU_FLAG]:
          bilou_utils.apply_bilou_schema(training_data)
  
      # only keep the CRFs for tags we actually have training data for
      self._update_crf_order(training_data)
  
      # filter out pre-trained entity examples
      entity_examples = self.filter_trainable_entities(
          training_data.nlu_examples
      )
      entity_examples = [
          message
          for message in entity_examples
          if message.features_present(
              attribute=TEXT,
              featurizers=self.component_config.get(FEATURIZERS),
          )
      ]
      dataset = [
          self._convert_to_crf_tokens(example)
          for example in entity_examples
      ]
  
      self._train_model(dataset)
  
      self.persist()
  
      return self._resource
  
imports: from __future__ import annotations
  from collections import OrderedDict
  from enum import Enum
  import logging
  import typing
  import numpy
  from typing import Any, Dict, List, Optional, Text, Tuple, Callable, Type
  import rasa.nlu.utils.bilou_utils
  import rasa.shared.utils.io
  import rasa.utils.train_utils
  from rasa.engine.graph import GraphComponent, ExecutionContext
  from rasa.engine.recipes.default_recipe import DefaultV1Recipe
  from rasa.engine.storage.resource import Resource
  from rasa.engine.storage.storage import ModelStorage
  from rasa.nlu.test import determine_token_labels
  from rasa.nlu.tokenizers.spacy_tokenizer import POS_TAG_KEY
  from rasa.nlu.extractors.extractor import EntityExtractorMixin
  from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
  from rasa.shared.nlu.training_data.training_data import TrainingData
  from rasa.shared.nlu.training_data.message import Message
  from rasa.nlu.constants import TOKENS_NAMES
  from rasa.shared.nlu.constants import TEXT, ENTITIES, ENTITY_ATTRIBUTE_TYPE, ENTITY_ATTRIBUTE_GROUP, ENTITY_ATTRIBUTE_ROLE, NO_ENTITY_TAG, SPLIT_ENTITIES_BY_COMMA, SPLIT_ENTITIES_BY_COMMA_DEFAULT_VALUE
  from rasa.shared.constants import DOCS_URL_COMPONENTS
  from rasa.utils.tensorflow.constants import BILOU_FLAG, FEATURIZERS
label_desc: Use image node_id 7 for calling the CRFEntityExtractor obj's underlying member method code with example usage: obj.train(training_data) and returns: self, self