readme: ---
  language: 
  - fr
  
  license: mit
  
  pipeline_tag: sentence-similarity
  
  widget:
  - source_sentence: "Bonsoir"
    sentences:
      - "Salut !"
      - "Hello"
      - "Bonsoir!"
      - "Bonsouar!"
      - "Bonsouar !"
      - "De rien"
      - "LUL LUL"
    example_title: "Coucou"
  - source_sentence: "elle s'en sort bien"
    sentences:
      - "elle a raison"
      - "elle a tellement raison"
      - "Elle a pas tort"
      - "C'est bien ce qu'elle dit là"
      - "Hello"
    example_title: "Raison or not"
  - source_sentence: "et la question énergétique n'est pas politique ?"
    sentences:
      - "C'est le nucléaire militaire qui a entaché le nucléaire pour l'énergie."
      - "La fusion nucléaire c'est pas pour maintenant malheureusement"
      - "le pro nucléaire redevient acceptable à gauche j'ai l'impression"
      - "La mer à Nantes?"
      - "c'est bien un olivier pour l'upr"
      - "Moi je vois juste sa lavallière"
    example_title: "Nucléaire"
  
  tags:
  - sentence-transformers
  - feature-extraction
  - sentence-similarity
  - transformers
  - twitch
  - convbert
  ---
  
  
  ## Modèle de représentation d'un message Twitch à l'aide de ConvBERT
  
  Modèle [sentence-transformers](https://www.SBERT.net): cela permet de mapper une séquence de texte en un vecteur numérique de dimension 256 et peut être utilisé pour des tâches de clustering ou de recherche sémantique.
  
  L'expérimentation menée au sein de Lincoln avait pour principal objectif de mettre en œuvre des techniques NLP from scratch sur un corpus de messages issus d’un chat Twitch. Ces derniers sont exprimés en français, mais sur une plateforme internet avec le vocabulaire internet que cela implique (fautes, vocabulaire communautaires, abréviations, anglicisme, emotes, ...). 
  
  Après avoir entrainé un modèle `ConvBert` puis `MLM` (cf section smodèles), nous avons entrainé un modèle _sentence-transformers_ à l'aide du framework d'apprentissage [SimCSE](https://www.sbert.net/examples/unsupervised_learning/SimCSE/README.html) en non supervisée. 
  
  L'objectif est de spécialiser la moyenne des tokens _CLS_ de chaque token de la séquence pour représenter un vecteur numérique cohérent avec l'ensemble du corpus. _SimCSE_ crée fictivement des exemples positifs et négatifs supervisées à l'aide du dropout pour revenir à une tâche classique.
  
  _Nous garantissons pas la stabilité du modèle sur le long terme. Modèle réalisé dans le cadre d'un POC._
  
  
  ## Usage (Sentence-Transformers)
  
  Using this model becomes easy when you have [sentence-transformers](https://www.SBERT.net) installed:
  
  ```
  pip install -U sentence-transformers
  ```
  
  Then you can use the model like this:
  
  ```python
  from sentence_transformers import SentenceTransformer
  sentences = ["This is an example sentence", "Each sentence is converted"]
  
  model = SentenceTransformer('2021twitchfr-conv-bert-small-mlm-simcse')
  embeddings = model.encode(sentences)
  print(embeddings)
  ```
  
  ## Semantic Textual Similarity
  
  ```python
  from sentence_transformers import SentenceTransformer, models, util
  
  # Two lists of sentences
  sentences1 = ['zackFCZack',
                'Team bons petits plats',
                'sa commence a quelle heure de base popcorn ?',
                'BibleThump']
  
  sentences2 = ['zack titulaire',
                'salade de pates c une dinguerie',
                'ça commence à être long la',
                'NotLikeThis']
  
  # Compute embedding for both lists
  embeddings1 = model.encode(sentences1, convert_to_tensor=True)
  embeddings2 = model.encode(sentences2, convert_to_tensor=True)
  
  # Compute cosine-similarits
  cosine_scores = util.cos_sim(embeddings1, embeddings2)
  
  # Output the pairs with their score
  for i in range(len(sentences1)):
      print("Score: {:.4f} | \"{}\" -vs- \"{}\" ".format(cosine_scores[i][i], sentences1[i], sentences2[i]))
  # Score: 0.5783 | "zackFCZack" -vs- "zack titulaire" 
  # Score: 0.2881 | "Team bons petits plats" -vs- "salade de pates c une dinguerie" 
  # Score: 0.4529 | "sa commence a quelle heure de base popcorn ?" -vs- "ça commence à être long la" 
  # Score: 0.5805 | "BibleThump" -vs- "NotLikeThis" 
  
  ```
  
  ## Entrainement
  
  * 500 000 messages twitchs échantillonnés (cf description données des modèles de bases)
  * Batch size: 24
  * Epochs: 24
  * Loss: MultipleNegativesRankingLoss
  
  _A noter:_ 
  * _ConvBert a été entrainé avec un longueur de 128 tokens max, mais est utilisé pour 512 dans ce modèle. Pas de problème._
  * _La loss d'apprentissage n'est pas encore disponible: peu de visibilité sur les performances._
  
  L'ensemble du code d'entrainement sur le github public [lincoln/twitchatds](https://github.com/Lincoln-France/twitchatds).
  
  ## Application:
  
  Nous avons utilisé une approche détournée de [BERTopic](https://maartengr.github.io/BERTopic/) pour réaliser un clustering d'un stream en prenant en compte la dimension temporelle: i.e. le nombre de seconde écoulée depuis le début du stream.
  
  ![approche_bertopic_lincoln](assets/approche_lincoln_topic_clustering_twitch.jpg)
  
  Globalement, l'approche donnes des résultats satisfaisant pour identifier des messages dit "similaires