sobe modelo
Browse files- README.md +104 -1
- config.json +24 -0
- flax_model.msgpack +3 -0
- model.safetensors +3 -0
- pytorch_model.bin +3 -0
- tf_model.h5 +3 -0
- vocab.txt +0 -0
README.md
CHANGED
@@ -1,3 +1,106 @@
|
|
1 |
---
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
language:
|
3 |
+
- pt
|
4 |
+
license: other
|
5 |
+
tags:
|
6 |
+
- bert
|
7 |
+
- pytorch
|
8 |
+
- sentence-transformers
|
9 |
+
- feature-extraction
|
10 |
+
- sentence-similarity
|
11 |
+
- transformers
|
12 |
+
- fill-mask
|
13 |
+
- NSP
|
14 |
+
- Next Sentence Prediction
|
15 |
+
datasets:
|
16 |
+
- brwac
|
17 |
+
library_name: transformers
|
18 |
+
pipeline_tag: fill-mask
|
19 |
---
|
20 |
+
|
21 |
+
# BERTugues Base (aka "BERTugues-base-portuguese-cased")
|
22 |
+
|
23 |
+
## Introdução
|
24 |
+
|
25 |
+
O BERTugues foi pré-treinado seguindo os mesmos passos do [paper original do BERT](https://arxiv.org/abs/1810.04805v2), com os objetivos de Masked Language Modeling (MLM) e Next Sentence Prediction (NSP), com 1 milhão de *steps*, usando mais de 20 GB de textos. Como o [Bertimbau](https://huggingface.co/neuralmind/bert-base-portuguese-cased), foi pré-treinado com o dataset [BrWAC](https://www.inf.ufrgs.br/pln/wiki/index.php?title=BrWaC) e a Wikipédia em português para o Tokenizador, contando com algumas melhorias no fluxo de treinamento, como:
|
26 |
+
+ **Remoção de caracteres pouco comuns no português do treinamento do Tokenizador.** No Bertimbau mais de 7000 dos 29794 usam caracteres orientais ou especiais, quase nunca usados no português. Por exemplo, existem os tokens: "##漫", "##켝", "##前", já no BERTugues fizemos a remoção desses caracteres antes de treinar o tokenizador;
|
27 |
+
+ **😀 Adição dos principais Emojis no Tokenizador.** A Wikipédia conta com poucos Emojis em seu texto, dessa forma um baixo número de Emojis entravam nos Tokens. Como já [demonstrado na literatura](https://arxiv.org/abs/1910.13793), eles são importantes numa série de tarefas;
|
28 |
+
+ **Filtragem de qualidade dos textos do BrWAC** seguindo o modelo heurística proposta pelo [paper do modelo Gopher](https://arxiv.org/abs/2112.11446) do Google, onde removemos do BrWac textos de baixa qualidade.
|
29 |
+
|
30 |
+
## Tokenizador
|
31 |
+
|
32 |
+
Com a substituição dos Tokens pouco usados no português conseguimos diminuir a quantidade média de palavras que são quebradas em mais de um Token. No teste utilizando o [assin2](https://huggingface.co/datasets/assin2), mesmo dataset utilizando pelo Bertimbau para fazer o teste na dissertação de mestrado, diminuímos a quantidade média de palavras quebradas por texto de 3,8 para 3,0, no BERT multilinguagem esse número era 7,4.
|
33 |
+
|
34 |
+
![imagem](https://github.com/ricardozago/BERTugues/blob/main/99_demais/subtokens_counts.png?raw=true)
|
35 |
+
|
36 |
+
|
37 |
+
## Performance
|
38 |
+
|
39 |
+
Para comparar a performance testamos um problema de classificação de textos, utilizando a base de reviews de filmes do [IMDB](https://www.kaggle.com/datasets/luisfredgs/imdb-ptbr), que foi traduzida para o português e possui uma boa qualidade. Neste problema utilizamos a representação do BERTugues da frase e passamos ela por um modelo de Random Forest para realizar a classificação.
|
40 |
+
|
41 |
+
Também utilizamos a comparação de performance do paper [JurisBERT: Transformer-based model for embedding legal texts](https://repositorio.ufms.br/handle/123456789/5119), que pré-treina um BERT especialmente para textos de um domínio, usando o BERT multilinguagem e o Bertimbau como baseline. Neste caso utilizamos o [código disponibilizado pelo time do paper](https://github.com/alfaneo-ai/brazilian-legal-text-benchmark) e adicionamos o BERTugues. O modelo é utilizado para comparar se dois textos são do mesmo assunto ou não.
|
42 |
+
|
43 |
+
| Modelo | IMDB (F1) | STJ (F1) | PJERJ (F1) | TJMS (F1) | Média F1 |
|
44 |
+
|---------------------|-----------|----------|------------|-----------|----------|
|
45 |
+
| BERT Multilinguagem | 72,0% | 30,4% | 63,8% | 65,0% | 57,8% |
|
46 |
+
| Bertimbau-Base | 82,2% | 35,6% | 63,9% | 71,2% | 63,2% |
|
47 |
+
| Bertimbau-Large | **85,3%** | 43,0% | 63,8% | **74,0%** | 66,5% |
|
48 |
+
| BERTugues-Base | 84,0% | **45,2%** | **67,5%** | 70,0% | **66,7%** |
|
49 |
+
|
50 |
+
O BERTugues foi superior em 3 de 4 tarefa em relação ao Bertimbau-base e em 2 das 4 tarefas superior ao Bertimbau-Large, um modelo muito maior (3x mais parâmetros) e custoso computacionalmente.
|
51 |
+
|
52 |
+
## Exemplo de uso
|
53 |
+
|
54 |
+
Diversos exemplos de uso estão disponíveis no nosso [nosso Github](https://github.com/ricardozago/BERTugues). Para uma rápida consulta adicionamos 2 exemplos abaixo:
|
55 |
+
|
56 |
+
Predição de palavras mascaradas (Masked Language Modeling):
|
57 |
+
|
58 |
+
```python
|
59 |
+
from transformers import BertTokenizer, BertForMaskedLM, pipeline
|
60 |
+
|
61 |
+
model = BertForMaskedLM.from_pretrained("ricardoz/BERTugues-base-portuguese-cased")
|
62 |
+
tokenizer = BertTokenizer.from_pretrained("ricardoz/BERTugues-base-portuguese-cased", do_lower_case=False)
|
63 |
+
|
64 |
+
pipe = pipeline('fill-mask', model=model, tokenizer=tokenizer, top_k = 3)
|
65 |
+
pipe('[CLS] Eduardo abriu os [MASK], mas não quis se levantar. Ficou deitado e viu que horas eram.')
|
66 |
+
|
67 |
+
# [{'score': 0.7272418141365051,
|
68 |
+
# 'token': 7292,
|
69 |
+
# 'token_str': 'olhos',
|
70 |
+
# 'sequence': 'Eduardo abriu os olhos, mas não quis se levantar. Ficou deitado e viu que horas eram.'},
|
71 |
+
# {'score': 0.2677205801010132,
|
72 |
+
# 'token': 12761,
|
73 |
+
# 'token_str': 'braços',
|
74 |
+
# 'sequence': 'Eduardo abriu os braços, mas não quis se levantar. Ficou deitado e viu que horas eram.'},
|
75 |
+
# {'score': 0.0007434834260493517,
|
76 |
+
# 'token': 24298,
|
77 |
+
# 'token_str': 'óculos',
|
78 |
+
# 'sequence': 'Eduardo abriu os óculos, mas não quis se levantar. Ficou deitado e viu que horas eram.'}]
|
79 |
+
|
80 |
+
```
|
81 |
+
|
82 |
+
Criação de um embedding para uma frase:
|
83 |
+
|
84 |
+
```python
|
85 |
+
from transformers import BertTokenizer, BertModel, pipeline
|
86 |
+
import torch
|
87 |
+
|
88 |
+
model = BertModel.from_pretrained("ricardoz/BERTugues-base-portuguese-cased")
|
89 |
+
tokenizer = BertTokenizer.from_pretrained("ricardoz/BERTugues-base-portuguese-cased", do_lower_case=False)
|
90 |
+
|
91 |
+
input_ids = tokenizer.encode('[CLS] Eduardo abriu os olhos, mas não quis se levantar. Ficou deitado e viu que horas eram.', return_tensors='pt')
|
92 |
+
|
93 |
+
with torch.no_grad():
|
94 |
+
last_hidden_state = model(input_ids).last_hidden_state[:, 0]
|
95 |
+
|
96 |
+
last_hidden_state
|
97 |
+
|
98 |
+
# tensor([[-1.5727e+00, 5.4707e-01, -2.6169e-01, -3.0714e-01, -9.4545e-01,
|
99 |
+
# 4.1557e-01, -7.9884e-01, -2.1481e-01, 5.9792e-01, -1.4198e+00,
|
100 |
+
# 1.1929e-01, 8.0228e-01, 5.4977e-01, 1.2710e+00, -2.9444e-01,
|
101 |
+
# 1.3398e+00, 1.4413e-01, 8.2983e-01, -8.2349e-02, 1.8593e-01,
|
102 |
+
```
|
103 |
+
|
104 |
+
## Mais informações
|
105 |
+
|
106 |
+
Para mais informações acesso [nosso Github](https://github.com/ricardozago/BERTugues)!
|
config.json
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"architectures": [
|
3 |
+
"BertForPreTraining"
|
4 |
+
],
|
5 |
+
"attention_probs_dropout_prob": 0.1,
|
6 |
+
"classifier_dropout": null,
|
7 |
+
"hidden_act": "gelu",
|
8 |
+
"hidden_dropout_prob": 0.1,
|
9 |
+
"hidden_size": 768,
|
10 |
+
"initializer_range": 0.02,
|
11 |
+
"intermediate_size": 3072,
|
12 |
+
"layer_norm_eps": 1e-12,
|
13 |
+
"max_position_embeddings": 512,
|
14 |
+
"model_type": "bert",
|
15 |
+
"num_attention_heads": 12,
|
16 |
+
"num_hidden_layers": 12,
|
17 |
+
"pad_token_id": 0,
|
18 |
+
"position_embedding_type": "absolute",
|
19 |
+
"torch_dtype": "float32",
|
20 |
+
"transformers_version": "4.29.2",
|
21 |
+
"type_vocab_size": 2,
|
22 |
+
"use_cache": true,
|
23 |
+
"vocab_size": 30522
|
24 |
+
}
|
flax_model.msgpack
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6614c3793e8f483f8780d22e9e4a3082dbdddb1794b489ff0545506cebc1ceb8
|
3 |
+
size 440433120
|
model.safetensors
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1f63a5a6a6dc6d6c4a01fec9c90e747249b3dfb0248e33761116c146fe9d1386
|
3 |
+
size 440453984
|
pytorch_model.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4caca4095eafc5ddf80456494b951729617cbb609a667edb2a03830b36cd491e
|
3 |
+
size 440497481
|
tf_model.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:776458c678dee6596dc2ae4c417a0dcc72e6d405155f4599bec10c8539cdc914
|
3 |
+
size 536063432
|
vocab.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|