Francois Vieille commited on
Commit
f707e85
1 Parent(s): 0a5a6d6

init with content

Browse files
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ *.py
1_Pooling/config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "word_embedding_dimension": 256,
3
+ "pooling_mode_cls_token": true,
4
+ "pooling_mode_mean_tokens": false,
5
+ "pooling_mode_max_tokens": false,
6
+ "pooling_mode_mean_sqrt_len_tokens": false
7
+ }
README.md ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - fr
4
+
5
+ license: mit
6
+
7
+ pipeline_tag: sentence-similarity
8
+
9
+ widget:
10
+ - text: "test"
11
+
12
+ tags:
13
+ - sentence-transformers
14
+ - feature-extraction
15
+ - sentence-similarity
16
+ - transformers
17
+ - twitch
18
+ - convbert
19
+ ---
20
+
21
+
22
+ ## Modèle de représentation d'un message à l'aide de ConvBERT
23
+
24
+ Ceci est un 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.
25
+
26
+ 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, ...).
27
+
28
+ 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.
29
+
30
+ 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.
31
+
32
+ _Nous garantissons pas la stabilité du modèle sur le long terme. Modèle réalisé dans le cadre d'un POC._
33
+
34
+
35
+ ## Usage (Sentence-Transformers)
36
+
37
+ Using this model becomes easy when you have [sentence-transformers](https://www.SBERT.net) installed:
38
+
39
+ ```
40
+ pip install -U sentence-transformers
41
+ ```
42
+
43
+ Then you can use the model like this:
44
+
45
+ ```python
46
+ from sentence_transformers import SentenceTransformer
47
+ sentences = ["This is an example sentence", "Each sentence is converted"]
48
+
49
+ model = SentenceTransformer('2021twitchfr-conv-bert-small-mlm-simcse')
50
+ embeddings = model.encode(sentences)
51
+ print(embeddings)
52
+ ```
53
+
54
+ ## Semantic Textual Similarity
55
+
56
+ ```python
57
+ from sentence_transformers import SentenceTransformer, models, util
58
+
59
+ # Two lists of sentences
60
+ sentences1 = ['zackFCZack',
61
+ 'Team bons petits plats',
62
+ 'sa commence a quelle heure de base popcorn ?',
63
+ 'BibleThump']
64
+
65
+ sentences2 = ['zack titulaire',
66
+ 'salade de pates c une dinguerie',
67
+ 'ça commence à être long la',
68
+ 'NotLikeThis']
69
+
70
+ # Compute embedding for both lists
71
+ embeddings1 = model.encode(sentences1, convert_to_tensor=True)
72
+ embeddings2 = model.encode(sentences2, convert_to_tensor=True)
73
+
74
+ # Compute cosine-similarits
75
+ cosine_scores = util.cos_sim(embeddings1, embeddings2)
76
+
77
+ # Output the pairs with their score
78
+ for i in range(len(sentences1)):
79
+ print("Score: {:.4f} | \"{}\" -vs- \"{}\" ".format(cosine_scores[i][i], sentences1[i], sentences2[i]))
80
+ # Score: 0.5783 | "zackFCZack" -vs- "zack titulaire"
81
+ # Score: 0.2881 | "Team bons petits plats" -vs- "salade de pates c une dinguerie"
82
+ # Score: 0.4529 | "sa commence a quelle heure de base popcorn ?" -vs- "ça commence à être long la"
83
+ # Score: 0.5805 | "BibleThump" -vs- "NotLikeThis"
84
+
85
+ ```
86
+ s
87
+ ## Entrainement
88
+
89
+ * 500 000 messages twitchs échantillonnés (cf description données des modèles de bases)
90
+ * Batch size: 24
91
+ * Epochs: 24
92
+ * Loss: MultipleNegativesRankingLoss
93
+
94
+ _A noter:_
95
+ * _ConvBert a été entrainé avec un longueur de 128 tokens max, mais est utilisé pour 512 dans ce modèle. Pas de problème._
96
+ * _La loss d'apprentissage n'est pas encore disponible: peu de visibilité sur les performances._
97
+
98
+ L'ensemble du code d'entrainement sur le github public [lincoln/twitchatds](https://github.com/Lincoln-France/twitchatds).
99
+
100
+ ## Application:
101
+
102
+ ### Clustering émission "Backseat":
103
+
104
+ ![1930_2000](https://github.com/Lincoln-France/twitchatds/blob/main/assets/scale_600/scale_600_1930_2000.png)
105
+
106
+ ou en 🎞️: [youtu.be/EcjvlE9aTls](https://youtu.be/EcjvlE9aTls)
107
+
108
+ ### Exemple regroupement émission "PopCorn":
109
+
110
+ ```txt
111
+ -------------------- LABEL 106 --------------------
112
+ circus (0.88)/sulli (0.23)/connu (0.19)/jure (0.12)/aime (0.11)
113
+ silouhette moyenne: 0.04
114
+ -------------------- LABEL 106 --------------------
115
+ 2021-03-30 20:10:22 0.01: les gosse c est des animaux
116
+ 2021-03-30 20:12:11 -0.03: oue c connu
117
+ 2021-03-30 20:14:15 0.03: oh le circus !! <3
118
+ 2021-03-30 20:14:19 0.12: le circus l'anciennnee
119
+ 2021-03-30 20:14:22 0.06: jure le circus !
120
+ 2021-03-30 20:14:27 -0.03: le sulli
121
+ 2021-03-30 20:14:31 0.09: le circus??? j'aime po
122
+ 2021-03-30 20:14:34 0.11: le Circus, hors de prix !
123
+ 2021-03-30 20:14:35 -0.09: le Paddock a Rignac en Aveyron
124
+ 2021-03-30 20:14:39 0.11: le circus ><
125
+ 2021-03-30 20:14:39 0.04: le Titty Twister de Besançon
126
+
127
+ -------------------- LABEL 17 --------------------
128
+ pates (0.12)/riz (0.09)/pâtes (0.09)/salade (0.07)/emission (0.07)
129
+ silouhette moyenne: -0.05
130
+ -------------------- LABEL 17 --------------------
131
+ 2021-03-30 20:11:18 -0.03: Des nanimaux trop beaux !
132
+ 2021-03-30 20:13:11 -0.01: episode des simpsons ça...
133
+ 2021-03-30 20:13:41 -0.01: des le debut d'emission ca tue mdrrrrr
134
+ 2021-03-30 20:13:50 0.03: des "lasagnes"
135
+ 2021-03-30 20:14:37 -0.18: poubelle la vie
136
+ 2021-03-30 20:15:13 0.03: Une omelette
137
+ 2021-03-30 20:15:35 -0.19: salade de bite
138
+ 2021-03-30 20:15:36 -0.00: hahaha ce gastronome
139
+ 2021-03-30 20:15:43 -0.08: salade de pates c une dinguerie
140
+ 2021-03-30 20:17:00 -0.11: Une bonne femme !
141
+ 2021-03-30 20:17:06 -0.05: bouffe des graines
142
+ 2021-03-30 20:17:08 -0.06: des pokeball ?
143
+ 2021-03-30 20:17:11 -0.12: le choux fleur cru
144
+ 2021-03-30 20:17:15 0.05: des pockeball ?
145
+ 2021-03-30 20:17:27 -0.00: du chou fleur crue
146
+ 2021-03-30 20:17:36 -0.09: un râgout de Meynia !!!!
147
+ 2021-03-30 20:17:43 -0.07: une line up Sa rd o ch Zack Ponce my dream
148
+ 2021-03-30 20:17:59 -0.10: Pâtes/10
149
+ 2021-03-30 20:18:09 -0.05: Team bons petits plats
150
+ 2021-03-30 20:18:13 -0.10: pate level
151
+ 2021-03-30 20:18:19 -0.03: que des trucs très basiques
152
+ 2021-03-30 20:18:24 0.03: des pates et du jambon c'est de la cuisine?
153
+ 2021-03-30 20:18:30 0.05: Des pates et du riz ouai
154
+ 2021-03-30 20:18:37 -0.02: des gnocchis à la poele c'est cuisiner ?
155
+ 2021-03-30 20:18:50 -0.03: Pâtes à pizzas, pulled pork, carbonade flamande, etc..
156
+ 2021-03-30 20:19:01 -0.11: Des pâtes ou du riz ça compte ?
157
+ 2021-03-30 20:19:22 -0.21: le noob
158
+ 2021-03-30 20:19:47 -0.02: Une bonne escalope de milanaise les gars
159
+ 2021-03-30 20:20:05 -0.04: faites des gratins et des quiches
160
+
161
+ -------------------- LABEL 67 --------------------
162
+ 1 1 (0.25)/1 (0.19)/ (0.0)/ (0.0)/ (0.0)
163
+ silouhette moyenne: 0.96
164
+ -------------------- LABEL 67 --------------------
165
+ 2021-03-30 20:24:17 0.94: +1
166
+ 2021-03-30 20:24:37 0.97: +1
167
+ 2021-03-30 20:24:37 0.97: +1
168
+ 2021-03-30 20:24:38 0.97: +1
169
+ 2021-03-30 20:24:39 0.97: +1
170
+ 2021-03-30 20:24:43 0.97: +1
171
+ 2021-03-30 20:24:44 0.97: +1
172
+ 2021-03-30 20:24:47 0.97: +1
173
+ 2021-03-30 20:24:49 0.97: +1
174
+ 2021-03-30 20:25:00 0.97: +1
175
+ 2021-03-30 20:25:21 0.95: +1
176
+ 2021-03-30 20:25:25 0.95: +1
177
+ 2021-03-30 20:25:28 0.94: +1
178
+ 2021-03-30 20:25:30 0.94: +1
179
+ ```
180
+
181
+ ## Full Model Architecture
182
+
183
+ ```
184
+ SentenceTransformer(
185
+ (0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: ConvBertModel
186
+ (1): Pooling({'word_embedding_dimension': 256, 'pooling_mode_cls_token': True, 'pooling_mode_mean_tokens': False, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
187
+ )
188
+ ```
189
+
190
+ ## Modèles:
191
+
192
+ * [2021twitchfr-conv-bert-small](https://huggingface.co/lincoln/2021twitchfr-conv-bert-small)
193
+ * [2021twitchfr-conv-bert-small-mlm](https://huggingface.co/lincoln/2021twitchfr-conv-bert-small-mlm)
194
+ * [2021twitchfr-conv-bert-small-mlm-simcse](https://huggingface.co/lincoln/2021twitchfr-conv-bert-small-mlm-simcse)
config.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "/mnt/twitchat/models/convbert-small-mlm-simcse-24e/",
3
+ "architectures": [
4
+ "ConvBertModel"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": 0,
8
+ "classifier_dropout": null,
9
+ "conv_kernel_size": 9,
10
+ "embedding_size": 128,
11
+ "eos_token_id": 2,
12
+ "head_ratio": 2,
13
+ "hidden_act": "gelu",
14
+ "hidden_dropout_prob": 0.1,
15
+ "hidden_size": 256,
16
+ "initializer_range": 0.02,
17
+ "intermediate_size": 1024,
18
+ "layer_norm_eps": 1e-12,
19
+ "max_position_embeddings": 512,
20
+ "model_type": "convbert",
21
+ "num_attention_heads": 4,
22
+ "num_groups": 1,
23
+ "num_hidden_layers": 12,
24
+ "pad_token_id": 0,
25
+ "torch_dtype": "float32",
26
+ "transformers_version": "4.15.0",
27
+ "type_vocab_size": 2,
28
+ "vocab_size": 16361
29
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "2.0.0",
4
+ "transformers": "4.11.0",
5
+ "pytorch": "1.9.1"
6
+ }
7
+ }
modules.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.models.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.models.Pooling"
13
+ }
14
+ ]
pytorch_model.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96372f0305aa2d815aea87182d29e55dcd7db589debca1797be4ca6f544ed44e
3
+ size 45436297
sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 512,
3
+ "do_lower_case": false
4
+ }
special_tokens_map.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"sep_token": "<sep>", "pad_token": "<pad>", "cls_token": "<cls>", "mask_token": "<mask>"}
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"sep_token": "<sep>", "pad_token": "<pad>", "cls_token": "<cls>", "mask_token": "<mask>", "special_tokens_map_file": "/home/azureuser/cloudfiles/code/Users/assets/models/convbert-small-hf-mlm/special_tokens_map.json", "name_or_path": "/mnt/twitchat/models/convbert-small-mlm-simcse-24e/", "tokenizer_class": "PreTrainedTokenizerFast"}