تشخیص نفرت پراکنی با یادگیری ماشین — راهنمای کاربردی
در این مطلب، روش ساخت یک سیستم «تشخیص نفرت پراکنی» (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 (یک وبسایت کرهای که نفرتپراکنی علیه یک جنسیت خاص در آن به صورت متمرکز انجام میشود) گردآوری شدهاند.
1from selenium import webdriver
2from selenium.webdriver.common.keys import Keys
3from bs4 import BeautifulSoup
4import re
5import pandas as pd
6import os
7import time
8
9o=0
10driver = webdriver.Chrome(executable_path=r"C:\Users\nemo\Downloads\chromedriver_win32\chromedriver.exe")
11link = pd.read_csv("womad_popular.csv")
12link = link["인기글"]
13for i in link:
14 driver.get("https://womad.life"+i)
15 time.sleep(7)
16 print(i)
17 soup=BeautifulSoup(driver.page_source, 'lxml')
18
19 for l in soup.find_all("p",{"class":"content comment-content"}):
20 comment = l.get_text()
21 print(comment)
22 print(i)
23 print(o)
24 comment_data["댓글"][o] = comment
25 comment_data.to_csv("womad_comment_train_data.csv")
26 o=o+1
با بهرهگیری از کتابخانه beautifulsoup، همه متنها با تگهای آنها گردآوری شدهاند و یک مجموعه داده از نفرتپراکنیها ساخته میشود. به منظور آمادهسازی دادهها برای «هوش مصنوعی» (Artificial Intelligence)، مجموعه داده با جملات عادی فاقد نفرتپراکنی ترکیب میشود.
در مجموعه داده مذکور، نظرات سایت (حاوی محتوای نفرتپراکنی) برچسب ۱ و جملات معمولی برچسب ۰ زده میشوند. بنابراین، مدل میتواند از آنها برای «دستهبندی» (Classification) محتوا استفاده کند.
برداریسازی TF-IDF
اکنون که دادهها آمادهسازی شدهاند، زمان تبدیل متنها به اعداد، به منظور قابل درک ساختن آنها برای کامپیوتر، رسیده است. پرسشی که در این وهله مطرح میشود این است که ماشین چگونه یک سند متنی را میخواند؟ پاسخ این است: به همان شکلی که انسانها این کار را انجام میدهند؛ با تمرکز روی کلمانی که اهمیت دارند.
کامپیوترها نیز به شیوهای مشابه با انسانها، کلیدواژهها را از یک متن استخراج میکنند تا آن را بفهمند. برداریسازی TF-IDF، روش مناسبی برای انجام این کار است. این فرایند با تخصیص رتبه TF-IDF (که یک عنصر عددی است و میزان اهمیت یک عبارت را به تصویر میکشد) به هر کلمه در سند انجام میشود. امتیاز TF-IDF از طریق فرمول زیر محاسبه میشود.
میتوان «اَبْر برچسب» (Word Cloud) کلماتی که با فرمول بالا به دست آمدهاند را ترسیم کرد تا دیدگاه بهتری نسبت به کلمات مهم استخراج شده توسط الگوریتم، حاصل شود.
مدل رگرسیون لجستیک جهت تشخیص نفرت پراکنی
در نهایت، زمان آموزش دادن مدل از راه رسیده است. از مدل رگرسیون لجستیک به منظور ساخت برنامهای که سخنان نفرتانگیز را از جملات عادی متمایز میسازد استفاده خواهد شد. رگرسیون لجستیک مدلی برای محاسبه احتمال بین ۰ و ۱ است.
همانطور که پیشتر بیان شد، سخنان نفرتانگیز با ۱ و جملات عادی با ۰ برچسبگذاری شدهاند و ضرایب تابع لجستیک با استفاده از بردارهای TF-IDF محاسبه میشود.
در نتیجه، با موفقیت مدلی حاصل میشود که میتواند جملات نفرتانگیز را با «صحت» (Precision) برابر با ٪۸۵ تشخیص دهد.
1#TfidfVectorizer Logistic Regression
2import pandas as pd
3import numpy as np
4from sklearn.utils import shuffle
5from sklearn.model_selection import train_test_split
6from sklearn.feature_extraction.text import TfidfVectorizer
7from sklearn.linear_model import LogisticRegression
8from sklearn.metrics import roc_auc_score
9
10list = []
11normal_data = pd.read_csv("korean_sentence.csv",encoding="ANSI")
12for i in range(len(normal_data["문장"])):
13 normal_data["문장"][i]=normal_data["문장"][i].replace("\t","")
14for i in range(len(normal_data["문장"])):
15 list.append(i)
16for l in range(len(list)):
17 list[l] = 0
18
19normal_data["혐오 여부"]=list
20womad_data=pd.read_csv("womad_comment_train_data.csv")
21womad_data["문장"] = womad_data["댓글"]
22list=[]
23for i in range(len(womad_data["문장"])):
24 list.append(i)
25for l in range(len(list)):
26 list[l] = 1
27womad_data["혐오 여부"]=list
28womad_data = womad_data.drop(['댓글','Unnamed: 0','level_0','Unnamed: 0.1','index','Unnamed: 0.1.1'],axis=1)
29train_data = shuffle(pd.concat([womad_data.sample(n=1000), normal_data])).reset_index(drop=True)
30hate_data = shuffle(pd.concat([womad_data, normal_data])).reset_index(drop=True)
31
32X_train,X_test,y_train,y_test = train_test_split(train_data["문장"],train_data["혐오 여부"],random_state=0)
33vect = TfidfVectorizer().fit(X_train)
34X_train_vectorized = vect.transform(X_train)
35
36model = LogisticRegression()
37model.fit(X_train_vectorized, y_train)
38
39feature_names = np.array(vect.get_feature_names())
40sorted_tfidf_index=model.coef_[0].argsort()
41
42predictions=model.predict(vect.transform(X_test))
43
44roc_auc_score(y_test, predictions)
نکته قابل توجه آن است که چون در اینجا مجموعه داده برچسبدار حاوی سخنان نفرتانگیز مورد استفاده به زبان کرهای بوده، اسامی ستونها نیز به همین زبان هستند و در کد موارد مرتبط با جزئیات مجموعه داده متناسب با مجموعه داده مورد استفاده کاربر قابل تغییر هستند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش تحلیل شبکههای اجتماعی با زبان R و متنکاوی
- مجموعه آموزشهای برنامهنویسی پایتون Python
- تحلیل احساسات در توییتر با پایتون — راهنمای جامع و کاربردی
- تحلیل احساسات در توییتر با زبان R — راهنمای کاربردی
- عقیدهکاوی و تحلیل احساسات ــ از مفهوم تا کاربرد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
^^