<a name="introduction"></a> BERTweet.BR: A Pre-Trained Language Model for Tweets in Portuguese

Having the same architecture of BERTweet we trained our model from scratch following RoBERTa pre-training procedure on a corpus of approximately 9GB containing 100M Portuguese Tweets.

Usage

Normalized Inputs

import torch
from transformers import AutoModel, AutoTokenizer 

model = AutoModel.from_pretrained('melll-uff/bertweetbr')
tokenizer = AutoTokenizer.from_pretrained('melll-uff/bertweetbr', normalization=False)

# INPUT TWEETS ALREADY NORMALIZED!
inputs = [
    "Procuro um amor , que seja bom pra mim ... vou procurar , eu vou até o fim :nota_musical:",
    "Que jogo ontem @USER :mãos_juntas:",
    "Demojizer para Python é :polegar_para_cima: e está disponível em HTTPURL"]

encoded_inputs = tokenizer(inputs, return_tensors="pt", padding=True)

with torch.no_grad():
    last_hidden_states = model(**encoded_inputs)

# CLS Token of last hidden states. Shape: (number of input sentences, hidden sizeof the model)
last_hidden_states[0][:,0,:]

tensor([[-0.1430, -0.1325,  0.1595,  ..., -0.0802, -0.0153, -0.1358],
        [-0.0108,  0.1415,  0.0695,  ...,  0.1420,  0.1153, -0.0176],
        [-0.1854,  0.1866,  0.3163,  ..., -0.2117,  0.2123, -0.1907]])

Normalize raw input Tweets

from emoji import demojize
import torch
from transformers import AutoModel, AutoTokenizer 

model = AutoModel.from_pretrained('melll-uff/bertweetbr')
tokenizer = AutoTokenizer.from_pretrained('melll-uff/bertweetbr', normalization=True)

inputs = [
   "Procuro um amor , que seja bom pra mim ... vou procurar , eu vou até o fim 🎵",
   "Que jogo ontem @cristiano 🙏",
   "Demojizer para Python é 👍 e está disponível em https://pypi.org/project/emoji/"]

tokenizer.demojizer = lambda x: demojize(x, language='pt')

[tokenizer.normalizeTweet(s) for s in inputs]

# Tokenizer first normalizes tweet sentences
['Procuro um amor , que seja bom pra mim ... vou procurar , eu vou até o fim :nota_musical:',
'Que jogo ontem @USER :mãos_juntas:',
'Demojizer para Python é :polegar_para_cima: e está disponível em HTTPURL']

encoded_inputs = tokenizer(inputs, return_tensors="pt", padding=True)

with torch.no_grad():
   last_hidden_states = model(**encoded_inputs)

# CLS Token of last hidden states. Shape: (number of input sentences, hidden sizeof the model)
last_hidden_states[0][:,0,:]

tensor([[-0.1430, -0.1325,  0.1595,  ..., -0.0802, -0.0153, -0.1358],
       [-0.0108,  0.1415,  0.0695,  ...,  0.1420,  0.1153, -0.0176],
       [-0.1854,  0.1866,  0.3163,  ..., -0.2117,  0.2123, -0.1907]])

Mask Filling with Pipeline

from transformers import pipeline

model_name = 'melll-uff/bertweetbr'
tokenizer = AutoTokenizer.from_pretrained('melll-uff/bertweetbr', normalization=False)

filler_mask = pipeline("fill-mask", model=model_name, tokenizer=tokenizer)
filler_mask("Rio é a <mask> cidade do Brasil.", top_k=5)

# Output
[{'sequence': 'Rio é a melhor cidade do Brasil.',
 'score': 0.9871652126312256,
 'token': 120,
 'token_str': 'm e l h o r'},
{'sequence': 'Rio é a pior cidade do Brasil.',
 'score': 0.005050931591540575,
 'token': 316,
 'token_str': 'p i o r'},
{'sequence': 'Rio é a maior cidade do Brasil.',
 'score': 0.004420778248459101,
 'token': 389,
 'token_str': 'm a i o r'},
{'sequence': 'Rio é a minha cidade do Brasil.',
 'score': 0.0021856199018657207,
 'token': 38,
 'token_str': 'm i n h a'},
{'sequence': 'Rio é a segunda cidade do Brasil.',
 'score': 0.0002110043278662488,
 'token': 667,
 'token_str': 's e g u n d a'}]