gat0r-gradio / app.py
thealper2's picture
Update app.py
b29d66f
import gradio as gr
import pandas as pd
import torch
import os
from transformers import BertTokenizer, BertModel
class BertClassifier(torch.nn.Module):
def __init__(self, dropout=0.5):
super(BertClassifier, self).__init__()
self.bert = BertModel.from_pretrained("dbmdz/bert-base-turkish-uncased")
self.dropout = torch.nn.Dropout(dropout)
# Kullandığımız önceden eğilmiş model "base" sınıfına ait bir BERT modelidir. Yani;
# 12 layers of Transformer encoder, 12 attention heads, 768 hidden size, 110M parameters.
# 768, BERT-base modelindeki hidden size'yi, 5 ise veri setimizdeki toplam kategori sayısını temsil ediyor.
self.linear = torch.nn.Linear(768, 5)
self.relu = torch.nn.ReLU()
def forward(self, input_id, mask):
# _ değişkeni dizideki tüm belirteçlerin gömme vektörlerini içerir.
# pooled_output değişkeni [CLS] belirtecinin gömme vektörünü içerir.
# Metin sınıflandırma için polled_output değişkenini girdi olarak kullanmak yeterlidir.
# Attention mask, bir belirtecin gercek bir kelimemi yoksa dolgu mu olduğunu tanımlar.
# Eğer gerçek bir kelime ise attention_mask=1, eğer dolgu ise attention_mask=0 olacaktır.
# return_dict, değeri "True ise" bir BERT modeli tahmin, eğitim veya değerlendirme sırasında ortaya çıkan
# loss, logits, hidden_states ve attentions dan oluşan bir tuple oluşturacaktır.
_, pooled_output = self.bert(input_ids=input_id, attention_mask=mask, return_dict=False)
dropout_output = self.dropout(pooled_output)
linear_output = self.linear(dropout_output)
final_layer = self.relu(linear_output)
return final_layer
model = BertClassifier()
tokenizer = BertTokenizer.from_pretrained("dbmdz/bert-base-turkish-uncased")
model.load_state_dict(torch.load('bert_uncased-with-stopwords.pt', map_location=torch.device('cpu')))
def predict_text(model, sentence):
device = torch.device("cpu")
#model = model.cuda()
# Prediction işlemi sırasında model ağırlıklarını değiştirmeyeceğimiz modelin gradyanlara ihtiyacı yoktur
# "no_grad" fonksiyonu ile gradyan hesaplarını devre dışı bırakıyoruz.
with torch.no_grad():
# text = Modeli eğitmek için kullanılacak veri setindeki "clean_text" sütunundaki her bir satır.
# padding = Her bir diziyi belirttiğimiz maksimum uzunluga kadar doldurmak için.
# max_length = Her bir dizinin maksimum uzunluğu
# truncation = Eğer değeri "True" ise dizimiz maksimum uzunluğu aşar ise onu keser.
# return_tensors = Döndürelecek tensörlerin türü. Pytorch kullandığımız için "pt" yazıyoruz. Tensorflow kullansaydık "tf" yazmamız gerekirdi.
input_id = tokenizer(sentence, padding='max_length', max_length = 512, truncation=True, return_tensors="pt")
# Attention mask, bir belirtecin gercek bir kelimemi yoksa dolgu mu olduğunu tanımlar.
# Eğer gerçek bir kelime ise attention_mask=1, eğer dolgu ise attention_mask=0 olacaktır.
mask = input_id['attention_mask'].to(device)
# squeeze() fonksiyonu ile "input_ids" özelliğindeki tensörlerin boyutu 1 olan boyutları
# kaldırarak, tensörün boyutunu azaltıyoruz.
input_id = input_id['input_ids'].squeeze(1).to(device)
# Modelin eğitim verileri üzerindeki tahminlerinin sonuçları saklanır.
output = model(input_id, mask)
categories = {
0: 'INSULT',
1: 'OTHER',
2: 'PROFANITY',
3: 'RACIST',
4: 'SEXIST'
}
# Kategorik sınıfı döndür.
return categories.get(output.argmax(dim=1).item())
def predict(df):
# TODO:
df["offansive"] = 1
df["target"] = None
for i in range(len(df)):
df.loc[i, 'target'] = predict_text(model, df['text'][i])
if (df.loc[i, 'target'] == 'OTHER'):
df.loc[i, 'offansive'] = 0
df.loc[i, 'target'] = ''
else:
df.loc[i, 'offansive'] = 1
return df
def get_file(file):
output_file = "output_GAT0R.csv"
# For windows users, replace path seperator
file_name = file.name.replace("\\", "/")
df = pd.read_csv(file_name, sep="|")
predict(df)
df.to_csv(output_file, index=False, sep="|")
return output_file
# Launch the interface with user password
iface = gr.Interface(get_file, "file", "file")
if __name__ == "__main__":
iface.launch(debug=True)