class_docstr: Intent parser using pattern matching in a deterministic manner
  
  This intent parser is very strict by nature, and tends to have a very good
  precision but a low recall. For this reason, it is interesting to use it
  first before potentially falling back to another parser.
class_docstr_tok: ["Intent","parser","using","pattern","matching","in","a","deterministic","manner","This","intent","parser","is","very","strict","by","nature",",","and","tends","to","have","a","very","good","precision","but","a","low","recall",".","For","this","reason",",","it","is","interesting","to","use","it","first","before","potentially","falling","back","to","another","parser","."]
code: def _utterance_to_pattern(
      self, utterance, stop_words, entity_placeholders
  ):
      from snips_nlu_utils import normalize
  
      slot_names_count = defaultdict(int)
      pattern = []
      for chunk in utterance[DATA]:
          if SLOT_NAME in chunk:
              slot_name = chunk[SLOT_NAME]
              slot_names_count[slot_name] += 1
              group_name = self.slot_names_to_group_names[slot_name]
              count = slot_names_count[slot_name]
              if count > 1:
                  group_name = "%s_%s" % (group_name, count)
              placeholder = entity_placeholders[chunk[ENTITY]]
              pattern.append(r"(?P<%s>%s)" % (group_name, placeholder))
          else:
              tokens = tokenize_light(chunk[TEXT], self.language)
              pattern += [
                  regex_escape(t.lower())
                  for t in tokens
                  if normalize(t) not in stop_words
              ]
  
      pattern = r"^%s%s%s$" % (
          WHITESPACE_PATTERN,
          WHITESPACE_PATTERN.join(pattern),
          WHITESPACE_PATTERN,
      )
      return pattern
  
imports: from __future__ import unicode_literals
  import json
  import logging
  import re
  from builtins import str
  from collections import defaultdict
  from pathlib import Path
  from future.utils import iteritems, itervalues
  from snips_nlu.common.dataset_utils import get_slot_name_mappings
  from snips_nlu.common.log_utils import log_elapsed_time, log_result
  from snips_nlu.common.utils import check_persisted_path, deduplicate_overlapping_items, fitted_required, json_string, ranges_overlap, regex_escape, replace_entities_with_placeholders
  from snips_nlu.constants import DATA, END, ENTITIES, ENTITY, INTENTS, LANGUAGE, RES_INTENT, RES_INTENT_NAME, RES_MATCH_RANGE, RES_SLOTS, RES_VALUE, SLOT_NAME, START, TEXT, UTTERANCES, RES_PROBA
  from snips_nlu.dataset import validate_and_format_dataset
  from snips_nlu.dataset.utils import get_stop_words_whitelist
  from snips_nlu.entity_parser.builtin_entity_parser import is_builtin_entity
  from snips_nlu.exceptions import IntentNotFoundError, LoadingError
  from snips_nlu.intent_parser.intent_parser import IntentParser
  from snips_nlu.pipeline.configs import DeterministicIntentParserConfig
  from snips_nlu.preprocessing import normalize_token, tokenize, tokenize_light
  from snips_nlu.resources import get_stop_words
  from snips_nlu.result import empty_result, extraction_result, intent_classification_result, parsing_result, unresolved_slot
label_desc: Use image node_id 20 for calling the DeterministicIntentParser obj's underlying member method code with example usage: obj._utterance_to_pattern(utterance, stop_words, entity_placeholders) and returns: pattern