مدل تشخیص گفتار نفرت‌انگیز

اصطلاح گفتار نفرت‌انگیز عبارت است از هر نوع ارتباط کلامی، نوشتاری و رفتاری که بر اساس نژاد، قومیت، ملیت، مذهب، سن، جنسیت، رنگ پوست، اصل و نصب یا … برای تحقیر، تحریک یا تبعیض یک شخص یا گروهی از افراد استفاده میشه. تو این مقاله، نحوه ایجاد یه مدل تشخیص گفتار نفرت‌انگیز با یادگیری ماشین و پایتون رو به شما عزیزان آموزش میدیم.

در کل، تشخیص گفتار نفرت‌انگیز یه تسک طبقه‌بندی احساساته، پس برای اینکه یه مدل بتونه این نوع گفتارها رو از یه متن تشخیص بده باید برای آموزش اون از داده‌هایی استفاده کنیم که معمولاً برای طبقه‌بندی احساسات به کار میرن؛ بنابراین برای پیاده‌سازی این پروژه از داده‌های توئیتر استفاده میکنیم.

مدل تشخیص گفتار نفرت‌انگیز

دیتاست این تسک شامل یه مجموعه برای آموزش و یه مجموعه برای تست مدل هست. بخش آموزشی شامل یه لیست از ۳۱,۹۶۲ توئیته که هر کدوم از توئیت­ها یه شناسه مخصوص و تگ ۰ یا ۱ دارند. احساس خاصی که ما نیاز به تشخیص اون داریم اینه که اون توئیت گفتار نفرت‌انگیزی رو شامل میشه (۱( یا نه (۰).

دیتاست موردنظر رو میتونید از طریق این لینک دانلود کنید.

دیگه وقتش رسیده که وارد مرحله پیاده‌سازی مدل تشخیص گفتار نفرت‌انگیز بشیم. کارمون رو با خواندن دیتاست با استفاده از کتابخونه pandas در پایتون شروع می‌کنیم:

import pandas as pd
train = pd.read_csv('train.csv')
print("Training Set:"% train.columns, train.shape, len(train))
test = pd.read_csv('test.csv')
print("Test Set:"% test.columns, test.shape, len(test))

Training Set: (31962, 3) 31962
Test Set: (17197, 2) 17197

پاک‌سازی داده

پاک‌سازی داده به فرآیند آماده‌سازی داده‌ها برای تجزیه و تحلیل گفته میشه که در این میان داده‌هایی وجود دارند که فرمت نادرست و نامناسبی دارند که با پاک‌سازی داده میتونیم از طریق حذف یا تغییر فرمت، کل دیتاست رو برای اقدامات بعدی آماده کنیم. داده‌های که فرمت نادرستی دارند برای تجزیه و تحلیل مناسب نیستن چون در ادامه میتونن روند کار رو مختل کنن یا اینکه باعث بشن نتایج نادرستی ارائه بشه. حالا با استفاده از کتابخونه re فرآیند پاک‌سازی داده‌ها رو انجام میدیم:

import re
def  clean_text(df, text_field):
    df[text_field] = df[text_field].str.lower()
    df[text_field] = df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem))  
    return df
test_clean = clean_text(test, "tweet")
train_clean = clean_text(train, "tweet")

در کد بالا، اول همه حروف رو به حروف کوچک تبدیل کردیم و بعد از اون با استفاده از re.sub() الگوها و کاراکترهای غیرمهم رو از متن‌های دیتاست حذف میکنیم.

دست‌کاری داده‌های نامتعادل برای مدل تشخیص گفتار نفرت‌انگیز

اگر کاری که میخوایم انجام بدیم و داده هایی که برای این کار در نظر گرفتیم رو عمیقاً آنالیز کنید، متوجه میشید که تعداد توئیت هایی حاوی گفتارهای نفرت‌انگیز نسبت به بقیه کمتره و همین امر باعث میشه که دیتاست وضعیت نامتعادلی داشته باشه.

اگر ما از این داده‌ها برای آموزش مدل استفاده کنیم، این مدل نمیتونه هیچ گفتار نفرت‌انگیزی رو تعمیم بده چون تعداد داده‌های حاوی گفتارهای نفرت‌انگیز کمتر از توئیت های حاوی جملات و احساسات مثبته. به‌این‌ترتیب، باید داده‌ها رو آماده کنیم تا به‌درستی در مدل فیت بشن.

برای مقابله با این مشکل میتونیم از روش‌های مختلفی استفاده کنیم. یکی از راهکارا اینه که از oversampling ( بیش نمونه‌گیری) یا downsampling ( کم نمونه‌گیری) استفاده کنیم. در oversampling از تابعی استفاده میکنیم که به طور مکرر، از کلاس اقلیت نمونه میگیره تا اندازه این کلاس با اندازه کلاس غالب یکی بشه. بیایید ببینیم که چجوری میتونیم این کار رو انجام بدیم:

from sklearn.utils import resample
train_majority = train_clean[train_clean.label==0]
train_minority = train_clean[train_clean.label==1]
train_minority_upsampled = resample(train_minority, 
                                 replace=True,    
                                 n_samples=len(train_majority),   
                                 random_state=123)
train_upsampled = pd.concat([train_minority_upsampled, train_majority])
train_upsampled['label'].value_counts()

۱ ۲۹۷۲۰
۰ ۲۹۷۲۰
Name: label, dtype: int64

ساخت یک پیپ­لاین

برای سادگی و قابلیت تولید مجدد مدل تشخیص گفتار نفرت‌انگیز، قبل از اینکه مدل رو آموزش بدین، از پیپ­لاین Scikit-Learn با SGDClassifier استفاده می‌کنیم:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier
pipeline_sgd = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf',  TfidfTransformer()),
    ('nb', SGDClassifier()),])

حالا بهتره این رو هم بگیم که منظور از پیپ­لاین ایجاد یه زنجیره از چند تخمینگر هست که نتیجه این کار، خودکارسازی فرآیند یادگیری ماشینه. این اقدام میتونه مفید باشه چون اغلب یه سری مراحل ثابت در پردازش داده‌ها وجود دارند.

آموزش مدل تشخیص گفتار نفرت‌انگیز

حالا، قبل از آموزش مدل اجازه بدید که داده‌ها رو به مجموعه داده آموزش و تست تقسیم کنیم:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train_upsampled['tweet'],
                                                    train_upsampled['label'],random_state = 0)

حالا بیاید مدل رو آموزش بدیم و نتایج رو با استفاده از متد نمره دهی F1 روی مجموعه آموزشی پیش‌بینی کنیم:

model = pipeline_sgd.fit(X_train, y_train)
y_predict = model.predict(X_test)
from sklearn.metrics import f1_score
f1_score(y_test, y_predict)

۰.۹۶۹۶

نتیجه مربوط به متد نمره دهی F1، ۰.۹۶ شد که در کل نتیجه بسیار خوبیه. حالا میتونیم از این مدل استفاده کنیم و در تولید و استخراج اطلاعات ازش استفاده کنیم.امیدواریم که از مطالعه این مقاله لذت برده باشید و یادگیری نحوه ایجاد مدل آموزش تشخیص گفتار براتون مفید واقع بشهو


برای هرگونه سوال در زمینه آموزش ها فقط کافیه روی لینک واتساپ یا تلگرام (در زیر همین پست) کلیک کنید. یا با شماره تماس بالای صفحه سایت تماس بگیرید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...