readme: ---
  language: 
    - fr
  
  license: mit
  
  datasets:
    - squadFR
    - fquad
    - piaf
  
  tags:
    - camembert
    - answer extraction 
  ---
  
  # Extraction de réponse
  
  Ce modèle est _fine tuné_ à partir du modèle [camembert-base](https://huggingface.co/camembert-base) pour la tâche de classification de tokens. 
  L'objectif est d'identifier les suites de tokens probables qui pourrait être l'objet d'une question.
  
  
  ## Données d'apprentissage
  
  La base d'entrainement est la concatenation des bases SquadFR, [fquad](https://huggingface.co/datasets/fquad), [piaf](https://huggingface.co/datasets/piaf). 
  Les réponses de chaque contexte ont été labelisées avec le label "ANS". 
  
  Volumétrie (nombre de contexte):
  * train: 24 652
  * test: 1 370
  * valid: 1 370
  
  
  ## Entrainement
  
  L'apprentissage s'est effectué sur une carte Tesla K80.
  
  * Batch size: 16
  * Weight decay: 0.01
  * Learning rate: 2x10-5 (décroit linéairement)
  * Paramètres par défaut de la classe [TrainingArguments](https://huggingface.co/transformers/main_classes/trainer.html#trainingarguments)
  * Total steps: 1 000
  
  Le modèle semble sur apprendre au delà :
  
  ![Loss](assets/loss_m_sl_sota_2.PNG)  
  
  
  ## Critiques
  
  Le modèle n'a pas de bonnes performances et doit être corrigé après prédiction pour être cohérent. La tâche de classification n'est pas évidente car le modèle doit identifier des groupes de token _sachant_ qu'une question peut être posée.
  
  ![Performances](assets/perfs_m_sl_sota_2.PNG)
  
  ## Utilisation
  
  _Le modèle est un POC, nous garantissons pas ses performances_
  
  ```python
  from transformers import AutoTokenizer, AutoModelForTokenClassification
  import numpy as np
  
  model_name = "lincoln/camembert-squadFR-fquad-piaf-answer-extraction"
  
  loaded_tokenizer = AutoTokenizer.from_pretrained(model_path)
  loaded_model = AutoModelForTokenClassification.from_pretrained(model_path)
  text = "La science des données est un domaine interdisciplinaire qui utilise des méthodes, des processus,\
      des algorithmes et des systèmes scientifiques pour extraire des connaissances et des idées de nombreuses données structurelles et non structurées.\
          Elle est souvent associée aux données massives et à l'analyse des données."
  
  inputs = loaded_tokenizer(text, return_tensors="pt", return_offsets_mapping=True)
  outputs = loaded_model(inputs.input_ids).logits
  probs = 1 / (1 + np.exp(-outputs.detach().numpy()))
  probs[:, :, 1][0] = np.convolve(probs[:, :, 1][0], np.ones(2), 'same') / 2
  
  sentences = loaded_tokenizer.tokenize(text, add_special_tokens=False)
  prob_answer_tokens = probs[:, 1:-1, 1].flatten().tolist()
  offset_start_mapping = inputs.offset_mapping[:, 1:-1, 0].flatten().tolist()
  offset_end_mapping = inputs.offset_mapping[:, 1:-1, 1].flatten().tolist()
  threshold = 0.4
  
  entities = []
  for ix, (token, prob_ans, offset_start, offset_end) in enumerate(zip(sentences, prob_answer_tokens, offset_start_mapping, offset_end_mapping)):
      entities.append({
          'entity': 'ANS' if prob_ans > threshold else 'O',
          'score': prob_ans, 
          'index': ix,
          'word': token,
          'start': offset_start,
          'end': offset_end
      })
  
  for p in entities:
      print(p)
  
  # {'entity': 'O', 'score': 0.3118681311607361, 'index': 0, 'word': '▁La', 'start': 0, 'end': 2}
  # {'entity': 'O', 'score': 0.37866950035095215, 'index': 1, 'word': '▁science', 'start': 3, 'end': 10}
  # {'entity': 'ANS', 'score': 0.45018652081489563, 'index': 2, 'word': '▁des', 'start': 11, 'end': 14}
  # {'entity': 'ANS', 'score': 0.4615934491157532, 'index': 3, 'word': '▁données', 'start': 15, 'end': 22}
  # {'entity': 'O', 'score': 0.35033443570137024, 'index': 4, 'word': '▁est', 'start': 23, 'end': 26}
  # {'entity': 'O', 'score': 0.24779987335205078, 'index': 5, 'word': '▁un', 'start': 27, 'end': 29}
  # {'entity': 'O', 'score': 0.27084410190582275, 'index': 6, 'word': '▁domaine', 'start': 30, 'end': 37}
  # {'entity': 'O', 'score': 0.3259460926055908, 'index': 7, 'word': '▁in', 'start': 38, 'end': 40}
  # {'entity': 'O', 'score': 0.371802419424057, 'index': 8, 'word': 'terdisciplinaire', 'start': 40, 'end': 56}
  # {'entity': 'O', 'score': 0.3140853941440582, 'index': 9, 'word': '▁qui', 'start': 57, 'end': 60}
  # {'entity': 'O', 'score': 0.2629334330558777, 'index': 10, 'word': '▁utilise', 'start': 61, 'end': 68}
  # {'entity': 'O', 'score': 0.2968383729457855, 'index': 11, 'word': '▁des', 'start': 69, 'end': 72}
  # {'entity': 'O', 'score': 0.33898216485977173, 'index': 12, 'word': '▁méthodes', 'start': 73, 'end': 81}
  # {'entity': 'O', 'score': 0.3776060938835144, 'index': 13, 'word': ',', 'start': 81, 'end': 82}
  # {'entity': 'O', 'score': 0.3710060119628906, 'index': 14, 'word': '▁des', 'start': 83, 'end': 86}
  # {'entity': 'O', 'score': 0.35908180475234985, 'index': 15, 'word': '▁processus', 'start': 87, 'end': 96}
  # {'entity': 'O', 'score': 0.3890596628189087, 'index': 16, 'word': ',', 'start': 96, 'end': 97}
  # {'entity': 'O', 'score': 0.38341325521469116, 'index': 17, 'word': '▁des', 'start': 101, 'end': 104}
  # {'entity': 'O', 'score': 0.3743