/ Модель

Характеристики

Контекст
512 токенов
Параметры
212 млн
Лицензия
MIT
Архитектура
bert · dense
Опубликована
30 янв 2024

bert-offensive-lang-detection-tr

Классификация текстаТекст → label3 профессии

Модель Turkcell на базе BERT определяет, содержит ли турецкий текст оскорбительные выражения.

1 435скачиваний за 30 дней9лайковвеса обновлены30 янв 2024

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

TURKCELL/bert-offensive-lang-detection-tr — модель классификации турецких текстов, разработанная Turkcell и дообученная на dbmdz/bert-base-turkish-128k-uncased с использованием набора OffensEval 2020. Она относит текст к оскорбительному или неоскорбительному; предназначена для проверки публикаций и сообщений, в том числе коротких текстов из социальных сетей. Модель построена на BERT и содержит 211,6 млн параметров; максимальный контекст — 512 токенов.

В обработке обучающих данных использовались приведение символов с диакритикой к базовым, перевод в нижний регистр и удаление упоминаний пользователей вида @user. На тестовой выборке заявлена точность 89%; для оскорбительного класса F1 составляет 0,70, поэтому возможны пропуски оскорбительных сообщений. Модель распространяется по лицензии MIT.

Сценарии применения

  • фильтрация оскорбительных турецких публикаций в соцсетях
  • модерация турецких пользовательских комментариев
  • выявление оскорбительных сообщений в текстовых потоках

Ограничения

На тестовой выборке полнота оскорбительного класса составляет 0,67, поэтому модель может пропускать оскорбительные сообщения. Обучение и оценка описаны на данных OffensEval 2020 для турецких текстов.

Для каких профессий подходит3

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

Offensive Language Detection For Turkish Language

Model Description

This model has been fine-tuned using dbmdz/bert-base-turkish-128k-uncased model with the OffensEval 2020 dataset. The offenseval-tr dataset contains 31,756 annotated tweets.

Dataset Distribution

Non Offensive(0)Offensive (1)
Train256256131
Test2812716

Preprocessing Steps

ProcessDescription
Accented character transformationConverting accented characters to their unaccented equivalents
Lowercase transformationConverting all text to lowercase
Removing @user mentionsRemoving @user formatted user mentions from text
Removing hashtag expressionsRemoving #hashtag formatted expressions from text
Removing URLsRemoving URLs from text
Removing punctuation and punctuated emojisRemoving punctuation marks and emojis presented with punctuation from text
Removing emojisRemoving emojis from text
DeasciificationConverting ASCII text into text containing Turkish characters

The performance of each pre-process was analyzed. Removing digits and keeping hashtags had no effect.

Usage

Install necessary libraries:

pip install git+https://github.com/emres/turkish-deasciifier.git

pip install keras_preprocessing

Pre-processing functions are below:


from turkish.deasciifier import Deasciifier
def deasciifier(text):
    deasciifier = Deasciifier(text)
    return deasciifier.convert_to_turkish()

def remove_circumflex(text):
    circumflex_map = {
        'â': 'a',
        'î': 'i',
        'û': 'u',
        'ô': 'o',
        'Â': 'A',
        'Î': 'I',
        'Û': 'U',
        'Ô': 'O'
    }

    return ''.join(circumflex_map.get(c, c) for c in text)    
def turkish_lower(text):
    turkish_map = {
        'I': 'ı',
        'İ': 'i',
        'Ç': 'ç',
        'Ş': 'ş',
        'Ğ': 'ğ',
        'Ü': 'ü',
        'Ö': 'ö'
    }
    return ''.join(turkish_map.get(c, c).lower() for c in text)

Clean text using below function:

import re

def clean_text(text):
    # Metindeki şapkalı harfleri kaldırma
    text = remove_circumflex(text)
    # Metni küçük harfe dönüştürme
    text = turkish_lower(text)
    # deasciifier
    text = deasciifier(text)
    # Kullanıcı adlarını kaldırma
    text = re.sub(r"@\S*", " ", text)
    # Hashtag'leri kaldırma
    text = re.sub(r'#\S+', ' ', text)
    # URL'leri kaldırma
    text = re.sub(r"http\S+|www\S+|https\S+", ' ', text, flags=re.MULTILINE)
    # Noktalama işaretlerini ve metin tabanlı emojileri kaldırma
    text = re.sub(r'[^\w\s]|(:\)|:\(|:D|:P|:o|:O|;\))', ' ', text)
    # Emojileri kaldırma
    emoji_pattern = re.compile("["
                           u"\U0001F600-\U0001F64F"  # emoticons
                           u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                           u"\U0001F680-\U0001F6FF"  # transport & map symbols
                           u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           u"\U00002702-\U000027B0"
                           u"\U000024C2-\U0001F251"
                           "]+", flags=re.UNICODE)
    text = emoji_pattern.sub(r' ', text)

    # Birden fazla boşluğu tek boşlukla değiştirme
    text = re.sub(r'\s+', ' ', text).strip()
    return text

Model Initialization

# Load model directly
from transformers import AutoTokenizer, AutoModelForSequenceClassification

tokenizer = AutoTokenizer.from_pretrained("TURKCELL/bert-offensive-lang-detection-tr")
model = AutoModelForSequenceClassification.from_pretrained("TURKCELL/bert-offensive-lang-detection-tr")

Check if sentence is offensive like below:

import numpy as np
def is_offensive(sentence):
    d = {
        0: 'non-offensive',
        1: 'offensive'
    }
    normalize_text = clean_text(sentence)
    test_sample = tokenizer([normalize_text], padding=True, truncation=True, max_length=256, return_tensors='pt')

    test_sample = {k: v.to(device) for k, v in test_sample.items()}

    output = model(**test_sample)
    y_pred = np.argmax(output.logits.detach().cpu().numpy(), axis=1)

    print(normalize_text, "-->", d[y_pred[0]])
    return y_pred[0]

is_offensive("@USER Mekanı cennet olsun, saygılar sayın avukatımız,iyi günler dilerim")
is_offensive("Bir Gün Gelecek Biriniz Bile Kalmayana Kadar Mücadeleye Devam Kökünüzü Kurutacağız !! #bebekkatilipkk")

Evaluation

Evaluation results on test set shown on table below. We achive %89 accuracy on test set.

Model Performance Metrics

ClassPrecisionRecallF1-scoreAccuracy
Class 00.920.940.930.89
Class 10.730.670.70
Macro0.830.800.81

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · text-classification

Можно запустить

Подбираем GPU…

Класс архитектуры
BertForSequenceClassification
Ревизия весов
9bf45ac

0 моделей