readme: ---
  tags:
  - generated_from_trainer
  metrics:
  - accuracy
  - f1
  model-index:
  - name: sbert_large-finetuned-sent_in_news_sents
    results: []
  ---
  
  <!-- This model card has been generated automatically according to the information the Trainer had access to. You
  should probably proofread and complete it, then remove this comment. -->
  
  # sbert_large-finetuned-sent_in_news_sents
  
  This model is a fine-tuned version of [sberbank-ai/sbert_large_nlu_ru](https://huggingface.co/sberbank-ai/sbert_large_nlu_ru) on an unknown dataset.
  It achieves the following results on the evaluation set:
  - Loss: 1.7056
  - Accuracy: 0.7301
  - F1: 0.5210
  
  ## Model examples
  Model responds to label X in news text. For exaple:
  
  For 'Газпром отозвал лицензию у X, сообщает Финам' the model will return negative label -3
  
  For 'X отозвал лицензию у Сбербанка, сообщает Финам' the model will return neutral label 0
  
  For 'Газпром отозвал лицензию у Сбербанка, сообщает X' the model will return neutral label 0
  
  For 'X демонстрирует высокую прибыль, сообщает Финам' the model will return positive label 1
  
  
  ##  Simple example of News preprocessing for Russian before BERT
  ```
  from natasha import (
      Segmenter,
      MorphVocab,
      NewsEmbedding,
      NewsMorphTagger,
      NewsSyntaxParser,
      NewsNERTagger,
      PER,
      NamesExtractor,
      Doc
  )
  segmenter = Segmenter()
  emb = NewsEmbedding()
  morph_tagger = NewsMorphTagger(emb)
  syntax_parser = NewsSyntaxParser(emb)
  morph_vocab = MorphVocab()
  
  
  ### ----------------------------- key sentences block -----------------------------
  
  def find_synax_tokens_with_order(doc, start, tokens, text_arr, full_str):
      ''' Находит все синтаксические токены, соответствующие заданному набору простых токенов (найденные
          для определенной NER другими функциями).
          Возвращает словарь найденных синтаксических токенов (ключ - идентификатор токена, состоящий
          из номера предложения и номера токена внутри предложения).
          Начинает поиск с указанной позиции в списке синтаксических токенов, дополнительно возвращает
          позицию остановки, с которой нужно продолжить поиск следующей NER.
      '''
      found = []
      in_str = False
      str_candidate = ''
      str_counter = 0
      if len(text_arr) == 0:
          return [], start
      for i in range(start, len(doc.syntax.tokens)):
          t = doc.syntax.tokens[i]
          if in_str:
              str_counter += 1
              if str_counter < len(text_arr) and t.text == text_arr[str_counter]:
                  str_candidate += t.text
                  found.append(t)
                  if str_candidate == full_str:
                      return found, i+1
              else:
                  in_str = False
                  str_candidate = ''
                  str_counter = 0
                  found = []
          if t.text == text_arr[0]:
              found.append(t)
              str_candidate = t.text
              if str_candidate == full_str:
                  return found, i+1
              in_str = True
      return [], len(doc.syntax.tokens)
  
  
  def find_tokens_in_diap_with_order(doc, start_token, diap):
      ''' Находит все простые токены (без синтаксической информации), которые попадают в
          указанный диапазон. Эти диапазоны мы получаем из разметки NER.
          Возвращает набор найденных токенов и в виде массива токенов, и в виде массива строчек.
          Начинает поиск с указанной позиции в строке и дополнительно возвращает позицию остановки.
      '''
      found_tokens = []
      found_text = []
      full_str = ''
      next_i = 0
      for i in range(start_token, len(doc.tokens)):
          t = doc.tokens[i]
          if t.start > diap[-1]:
              next_i = i
              break
          if t.start in diap:
              found_tokens.append(t)
              found_text.append(t.text)
              full_str += t.text
      return found_tokens, found_text, full_str, next_i
  
  
  def add_found_arr_to_dict(found, dict_dest):
      for synt in found:
          dict_dest.update({synt.id: synt})
      return dict_dest
  
  
  def make_all_syntax_dict(doc):
      all_syntax = {}
      for synt in doc.syntax.tokens:
          all_syntax.update({synt.id: synt})
      return all_syntax
  
  
  def is_consiquent(id_1, id_2):
      ''' Проверяет идут ли токены друг за другом без промежутка по ключам. '''
      id_1_list = id_1.split('_')
      id_2_list = id_2.split('_')
      if id_1_list[0] != id_2_list[0]:
          return False
      return int(id_1_list[1]) + 1 == int(id_2_list[1])
  
  
  def replace_found_to(found, x_str):
      ''' Заменяет последовательность токенов NER на «заглушку». '''
      prev_id = '0_0'
      for synt in found:
          if is_consiquent(prev_id, synt.id):
              synt.text = ''
          else:
              synt.text = x_str
          prev_id = synt.id
  
  
  def analyze_doc(text):
      ''' Запускает Natasha для анализа документа. '''
      doc = Doc(text)
      doc.segment(segmenter)
      doc.tag_morph(morph_tagger)
      doc.parse_syntax(syntax_parser)
      ner_tagger = NewsNERTagger(emb)
      doc.tag_ner(ner_tagger)
      return doc
  
  
  def find_non_sym_syntax_short(ent