تشخیص نفرت پراکنی با یادگیری ماشین — راهنمای کاربردی

در این مطلب، روش ساخت یک سیستم «تشخیص نفرت پراکنی» (Hate Speech Detection) آموزش داده شده است. امروزه در اینترنت، اتفاقات خیلی عجیبی به وقوع میپیوندد. نفرتپراکنی پیرامون جنسیت یا قومی خاص در «شبکههای اجتماعی» (Social Networks) بسیار شایع است و این ناهنجاریها در فضای مجازی، معمولا منجر به تشدید ترس و نفرت در جوامع واقعی میشود. هدف ازاین مطلب، ارائه ابزاری است که به تمایز کاربران عادی شبکههای اجتماعی از ترولهایی که به نفرتپراکنی هدفمند میپردازند کمک کند؛ این کار با استفاده از یک مدل یادگیری ماشین که توانایی تفکیک سخنان نفرتانگیز از جملات عادی را دارد، انجام میشود.
به منظور ساخت الگوریتم تشخیص نفرتپراکنی، از روشهای «پردازش زبان طبیعی» (Natural Language Processing | NLP) مبتنی بر «زبان برنامهنویسی پایتون» (Python Programming Language) استفاده شده است. «یادگیری ماشین» (Machine Learning) در واقع آموزش دادن به ماشینها با بهرهگیری از دادهها، به منظور استفاده از آنها برای انجام وظایف گوناگون است. در همین راستا، برای ساخت سیستم تشخیص نفرتپراکنی نیز ابتدا نیاز به گردآوری داده است. در این مطلب، از مجموعه داده یک وبسایت که به ترویج نفرت علیه یک جنسیت خاص میپرداخت استفاده شده است (وبسایت کرهای Womad). کاربران میتوانند از هر مجموعه داده دیگری که تمایل دارند استفاده کنند؛ البته مجموعه داده باید حاوی برچسبهای مناسبی باشد (این مطلب برای نشان دادن قالب کلی یک پروژه تشخیص نفرتپراکنی در شبکههای اجتماعی تدوین شده است و توصیه میشود کاربران از مجموعه داده مناسب خودشان استفاده کنند. در همین راستا، مطالعه مطالب «مجموعه دادههای رایگان و قابل دانلود برای علم داده و یادگیری ماشین» و «مجموعه دادههای عمومی برای دادهکاوی و هوش مصنوعی — راهنمای کاربردی» توصیه میشود.).
سپس، از روش پردازش زبان طبیعی با عنوان برداریسازی فراوانی وزنی تیاف-آیدیاف (TF–IDF Weight Vectorization) استفاده و کلیدواژههایی که در برگیرنده سخنان نفرتانگیز هستند استخراج میشوند. در نهایت، با استفاده از روش یادگیری ماشین «رگرسیون لجستیک» (Logistic Regression) که روشی محبوب برای محاسبات احتمال است استفاده میشود و مدل طوری آموزش میبیند که با استفاده از دادههای استخراج شده از مجموعه داده مورد استفاده، بتواند نفرتپراکنیها را تشخیص دهد.
گردآوری دادهها
برای گردآوری دادهها، از «خزش در وب» (Web Crawling) استفاده میشود که روشی برای گردآوری دادهها از صفحات وب با استفاده از یک فرایند خودکار است. خزش در وب با استفاده از زبان برنامهنویسی پایتون و با بهرهگیری از کتابخانه «beautifulsoup» انجامپذیر است.
با استفاده از این روش، نظرات موجود در وبسایت Womad (یک وبسایت کرهای که نفرتپراکنی علیه یک جنسیت خاص در آن به صورت متمرکز انجام میشود) گردآوری شدهاند.
from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import re import pandas as pd import os import time o=0 driver = webdriver.Chrome(executable_path=r"C:\Users\nemo\Downloads\chromedriver_win32\chromedriver.exe") link = pd.read_csv("womad_popular.csv") link = link["인기글"] for i in link: driver.get("https://womad.life"+i) time.sleep(7) print(i) soup=BeautifulSoup(driver.page_source, 'lxml') for l in soup.find_all("p",{"class":"content comment-content"}): comment = l.get_text() print(comment) print(i) print(o) comment_data["댓글"][o] = comment comment_data.to_csv("womad_comment_train_data.csv") o=o+1
با بهرهگیری از کتابخانه beautifulsoup، همه متنها با تگهای آنها گردآوری شدهاند و یک مجموعه داده از نفرتپراکنیها ساخته میشود. به منظور آمادهسازی دادهها برای «هوش مصنوعی» (Artificial Intelligence)، مجموعه داده با جملات عادی فاقد نفرتپراکنی ترکیب میشود.
در مجموعه داده مذکور، نظرات سایت (حاوی محتوای نفرتپراکنی) برچسب ۱ و جملات معمولی برچسب ۰ زده میشوند. بنابراین، مدل میتواند از آنها برای «دستهبندی» (Classification) محتوا استفاده کند.
برداریسازی TF-IDF
اکنون که دادهها آمادهسازی شدهاند، زمان تبدیل متنها به اعداد، به منظور قابل درک ساختن آنها برای کامپیوتر، رسیده است. پرسشی که در این وهله مطرح میشود این است که ماشین چگونه یک سند متنی را میخواند؟ پاسخ این است: به همان شکلی که انسانها این کار را انجام میدهند؛ با تمرکز روی کلمانی که اهمیت دارند.
کامپیوترها نیز به شیوهای مشابه با انسانها، کلیدواژهها را از یک متن استخراج میکنند تا آن را بفهمند. برداریسازی TF-IDF، روش مناسبی برای انجام این کار است. این فرایند با تخصیص رتبه TF-IDF (که یک عنصر عددی است و میزان اهمیت یک عبارت را به تصویر میکشد) به هر کلمه در سند انجام میشود. امتیاز TF-IDF از طریق فرمول زیر محاسبه میشود.
میتوان «اَبْر برچسب» (Word Cloud) کلماتی که با فرمول بالا به دست آمدهاند را ترسیم کرد تا دیدگاه بهتری نسبت به کلمات مهم استخراج شده توسط الگوریتم، حاصل شود.
مدل رگرسیون لجستیک جهت تشخیص نفرت پراکنی
در نهایت، زمان آموزش دادن مدل از راه رسیده است. از مدل رگرسیون لجستیک به منظور ساخت برنامهای که سخنان نفرتانگیز را از جملات عادی متمایز میسازد استفاده خواهد شد. رگرسیون لجستیک مدلی برای محاسبه احتمال بین ۰ و ۱ است.
همانطور که پیشتر بیان شد، سخنان نفرتانگیز با ۱ و جملات عادی با ۰ برچسبگذاری شدهاند و ضرایب تابع لجستیک با استفاده از بردارهای TF-IDF محاسبه میشود.
در نتیجه، با موفقیت مدلی حاصل میشود که میتواند جملات نفرتانگیز را با «صحت» (Precision) برابر با ٪۸۵ تشخیص دهد.
#TfidfVectorizer Logistic Regression import pandas as pd import numpy as np from sklearn.utils import shuffle from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score list = [] normal_data = pd.read_csv("korean_sentence.csv",encoding="ANSI") for i in range(len(normal_data["문장"])): normal_data["문장"][i]=normal_data["문장"][i].replace("\t","") for i in range(len(normal_data["문장"])): list.append(i) for l in range(len(list)): list[l] = 0 normal_data["혐오 여부"]=list womad_data=pd.read_csv("womad_comment_train_data.csv") womad_data["문장"] = womad_data["댓글"] list=[] for i in range(len(womad_data["문장"])): list.append(i) for l in range(len(list)): list[l] = 1 womad_data["혐오 여부"]=list womad_data = womad_data.drop(['댓글','Unnamed: 0','level_0','Unnamed: 0.1','index','Unnamed: 0.1.1'],axis=1) train_data = shuffle(pd.concat([womad_data.sample(n=1000), normal_data])).reset_index(drop=True) hate_data = shuffle(pd.concat([womad_data, normal_data])).reset_index(drop=True) X_train,X_test,y_train,y_test = train_test_split(train_data["문장"],train_data["혐오 여부"],random_state=0) vect = TfidfVectorizer().fit(X_train) X_train_vectorized = vect.transform(X_train) model = LogisticRegression() model.fit(X_train_vectorized, y_train) feature_names = np.array(vect.get_feature_names()) sorted_tfidf_index=model.coef_[0].argsort() predictions=model.predict(vect.transform(X_test)) roc_auc_score(y_test, predictions)
نکته قابل توجه آن است که چون در اینجا مجموعه داده برچسبدار حاوی سخنان نفرتانگیز مورد استفاده به زبان کرهای بوده، اسامی ستونها نیز به همین زبان هستند و در کد موارد مرتبط با جزئیات مجموعه داده متناسب با مجموعه داده مورد استفاده کاربر قابل تغییر هستند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش تحلیل شبکههای اجتماعی با زبان R و متنکاوی
- مجموعه آموزشهای برنامهنویسی پایتون Python
- تحلیل احساسات در توییتر با پایتون — راهنمای جامع و کاربردی
- تحلیل احساسات در توییتر با زبان R — راهنمای کاربردی
- عقیدهکاوی و تحلیل احساسات ــ از مفهوم تا کاربرد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
^^