--- language: - pt tags: - generated_from_trainer datasets: - lener_br metrics: - precision - recall - f1 - accuracy model-index: - name: checkpoints results: - task: name: Token Classification type: token-classification dataset: name: lener_br type: lener_br metrics: - name: F1 type: f1 value: 0.8733423827921062 - name: Precision type: precision value: 0.8487923685812868 - name: Recall type: recall value: 0.8993548387096775 - name: Accuracy type: accuracy value: 0.9759397808828684 - name: Loss type: loss value: 0.10249536484479904 widget: - text: "Ao Instituto Médico Legal da jurisdição do acidente ou da residência cumpre fornecer, no prazo de 90 dias, laudo à vítima (art. 5, § 5, Lei n. 6.194/74 de 19 de dezembro de 1974), função técnica que pode ser suprida por prova pericial realizada por ordem do juízo da causa, ou por prova técnica realizada no âmbito administrativo que se mostre coerente com os demais elementos de prova constante dos autos." - text: "Acrescento que não há de se falar em violação do artigo 114, § 3º, da Constituição Federal, posto que referido dispositivo revela-se impertinente, tratando da possibilidade de ajuizamento de dissídio coletivo pelo Ministério Público do Trabalho nos casos de greve em atividade essencial." - text: "Desta forma, em relação ao período em que passou a vigorar com a nova redação do artigo 43 da Lei 8.212/91, aplicável às hipóteses em que a prestação do serviço ocorreu a partir do dia 5/3/2009, observar-se-á o regime de competência (em que o lançamento é feito quando o crédito é merecido e não quando é recebido), ou seja, considera-se como fato gerador das contribuições previdenciárias decorrentes de créditos trabalhistas reconhecidos em juízo, a data da efetiva prestação de serviço." - text: "Irresignada com a sua condenação na obrigação de pagar os valores equivalentes às multas de que tratam os arts. 467 e 477 da CLT, a corporação recorrente sustenta que só a controvérsia instaurada na lide em torno do reconhecimento, ou não, do vínculo empregatício, seria apta a afastar a incidência, na espécie, das penalidades sob referência." --- ## (BERT base) NER model in the legal domain in Portuguese (LeNER-Br) **ner-bert-base-portuguese-cased-lenerbr** is a NER model (token classification) in the legal domain in Portuguese that was finetuned on 20/12/2021 in Google Colab from the model [pierreguillou/bert-base-cased-pt-lenerbr](https://huggingface.co/pierreguillou/bert-base-cased-pt-lenerbr) on the dataset [LeNER_br](https://huggingface.co/datasets/lener_br) by using a NER objective. Due to the small size of BERTimbau base and finetuning dataset, the model overfitted before to reach the end of training. Here are the overall final metrics on the validation dataset (*note: see the paragraph "Validation metrics by Named Entity" to get detailed metrics*): - **f1**: 0.8733423827921062 - **precision**: 0.8487923685812868 - **recall**: 0.8993548387096775 - **accuracy**: 0.9759397808828684 - **loss**: 0.10249536484479904 **Note**: the model [pierreguillou/bert-base-cased-pt-lenerbr](https://huggingface.co/pierreguillou/bert-base-cased-pt-lenerbr) is a language model that was created through the finetuning of the model [BERTimbau base](https://huggingface.co/neuralmind/bert-base-portuguese-cased) on the dataset [LeNER-Br language modeling](https://huggingface.co/datasets/pierreguillou/lener_br_finetuning_language_model) by using a MASK objective. This first specialization of the language model before finetuning on the NER task improved a bit the model quality. To prove it, here are the results of the NER model finetuned from the model [BERTimbau base](https://huggingface.co/neuralmind/bert-base-portuguese-cased) (a non-specialized language model): - **f1**: 0.8716487228203504 - **precision**: 0.8559286898839138 - **recall**: 0.8879569892473118 - **accuracy**: 0.9755893153732458 - **loss**: 0.1133928969502449 ## Widget & APP You can test this model into the widget of this page. ## Using the model for inference in production ```` # install pytorch: check https://pytorch.org/ # !pip install transformers from transformers import AutoModelForTokenClassification, AutoTokenizer import torch # parameters model_name = "ner-bert-base-portuguese-cased-lenebr" model = AutoModelForTokenClassification.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) input_text = "Acrescento que não há de se falar em violação do artigo 114, § 3º, da Constituição Federal, posto que referido dispositivo revela-se impertinente, tratando da possibilidade de ajuizamento de dissídio coletivo pelo Ministério Público do Trabalho nos casos de greve em atividade essencial." # tokenization inputs = tokenizer(input_text, max_length=512, truncation=True, return_tensors="pt") tokens = inputs.tokens() # get predictions outputs = model(**inputs).logits predictions = torch.argmax(outputs, dim=2) # print predictions for token, prediction in zip(tokens, predictions[0].numpy()): print((token, model.config.id2label[prediction])) ```` You can use pipeline, too. However, it seems to have an issue regarding to the max_length of the input sequence. ```` !pip install transformers import transformers from transformers import pipeline model_name = "ner-bert-base-portuguese-cased-lenebr" ner = pipeline( "ner", model=model_name ) ner(input_text) ```` ## Training procedure ### Notebook The notebook of finetuning ([HuggingFace_Notebook_token_classification_NER_LeNER_Br.ipynb](https://github.com/piegu/language-models/blob/master/HuggingFace_Notebook_token_classification_NER_LeNER_Br.ipynb)) is in github. ### Hyperparameters #### batch, learning rate... - per_device_batch_size = 4 - gradient_accumulation_steps = 2 - learning_rate = 2e-5 - num_train_epochs = 3 - weight_decay = 0.01 - optimizer = AdamW - betas = (0.9,0.999) - epsilon = 1e-08 - lr_scheduler_type = linear - seed = 42 #### save model & load best model - save_total_limit = 3 - logging_steps = 290 - eval_steps = logging_steps - evaluation_strategy = 'steps' - logging_strategy = 'steps' - save_strategy = 'steps' - save_steps = logging_steps - load_best_model_at_end = True - fp16 = True #### get best model through a metric - metric_for_best_model = 'eval_f1' - greater_is_better = True ### Training results ```` Num examples = 7828 Num Epochs = 3 Instantaneous batch size per device = 4 Total train batch size (w. parallel, distributed & accumulation) = 8 Gradient Accumulation steps = 2 Total optimization steps = 2934 Step Training Loss Validation Loss Precision Recall F1 Accuracy 290 0.314600 0.163042 0.735828 0.697849 0.716336 0.949198 580 0.086900 0.123495 0.779540 0.824301 0.801296 0.965807 870 0.072800 0.106785 0.798481 0.858925 0.827600 0.968626 1160 0.046300 0.109921 0.824576 0.877419 0.850177 0.973243 1450 0.036600 0.102495 0.848792 0.899355 0.873342 0.975940 1740 0.033400 0.121514 0.821681 0.899785 0.858961 0.967071 2030 0.034700 0.115568 0.846849 0.887097 0.866506 0.970607 2320 0.018000 0.108600 0.840258 0.895914 0.867194 0.973730 ```` ### Validation metrics by Named Entity ```` Num examples = 1177 {'JURISPRUDENCIA': {'f1': 0.7069834413246942, 'number': 657, 'precision': 0.6707650273224044, 'recall': 0.7473363774733638}, 'LEGISLACAO': {'f1': 0.8256227758007118, 'number': 571, 'precision': 0.8390596745027125, 'recall': 0.8126094570928196}, 'LOCAL': {'f1': 0.7688564476885645, 'number': 194, 'precision': 0.728110599078341, 'recall': 0.8144329896907216}, 'ORGANIZACAO': {'f1': 0.8548387096774193, 'number': 1340, 'precision': 0.8062169312169312, 'recall': 0.9097014925373135}, 'PESSOA': {'f1': 0.9826697892271662, 'number': 1072, 'precision': 0.9868297271872061, 'recall': 0.9785447761194029}, 'TEMPO': {'f1': 0.9615846338535414, 'number': 816, 'precision': 0.9423529411764706, 'recall': 0.9816176470588235}, 'overall_accuracy': 0.9759397808828684, 'overall_f1': 0.8733423827921062, 'overall_precision': 0.8487923685812868, 'overall_recall': 0.8993548387096775} ````