آموزش تحلیل میزان خشونت نظرات وب سایت با استفاده از هوش مصنوعی ML.Net در سی شارپ
سلام دوستان
در این آموزش قصد داریم با استفاده از ML.Net و سی شارپ میزان خشونت نظرات یک وب سایت را بررسی کنیم
برای مثال یک کاربر نظری را ارسال می کند و در کسری از ثانیه با استفاده از هوش مصنوعی بررسی می شود که آیا این نظر به تندی و با خشونت بیان شده است؟ اگر اینطور بود از ثبت نظر جلوگیری می شود
مرحله اول: یک پروژه Asp.net core RazorPages ایجاد کنید
وارد ویژوال استادیو شوید و بعد از کلیک بر دکمه Create New Project یک پروژه Razor Pages ایجاد کنید
مرحله دوم: دانلود دیتا
دیتا مورد نیاز برای ساخت مدل هوش مصنوعی را از Wikipedia detox dataset دانلود کنید و با نام wikipedia-detox-250-line-data.tsv در کامپیوتر خود ذخیره کنید
این دیتا شامل کامنت های خشونت آمیز است که با 1 علامت گذاری شده و دارای یک سری کامنت مجاز می باشد که با 0 مشخص شده است
مرحله سوم: ساخت Model Builder Config
وقتی برای اولین بار مدل ماشین لرنینگ را به سولوشن اضافه می کنید باید یک فایل mbconfig ایجاد کنید
mbconfig تمامی کار هایی را که در Model Builder انجام می دهید نگه داری می کند
در Solution Explorer بر روی نام پروژه Asp.net core خود کلیک راست کنید به روی Add روید و گزینه Machine Learning Model.... را انتخاب کنید
مرحله چهارم: یک سناریو انتخاب کنید
در پنجره باز شده باید سناریو Text classification را انتخاب کنید
پیشنهاد: آموزش ml.net
مرحله ششم: یک environment برای ترین انتخاب کنید
برای train کردن دیتا باید یک environment انتخاب کنید توصیه بنده GPU (کارت گرافیک) است اما اگر دستگاه شما مجهز به کارت گرافیک نیست می توانید از CPU استفاده کنید
مرحله هفتم: دیتا را بارگزاری کنید
اول در data source گزینه File را انتخاب کنید
سپس فایل wikipedia-detox-250-line-data.tsv را که قبلا دانلود کرده بودیم انتخاب کنید
Sentiment را از لیست باز شو Column to predict (Label) انتخاب کنید
SentimentText را از لیست باز شو Text Column انتخاب کنید
و بر روی دکمه Next Step کلیک کنید
مرحله هشتم: مدل را ترین کنید
بر روی دکمه Start Training کلیک کنید
بعد از اتمام train سه فایل برای شما ایجاد می شود
SentimentAnalysis.consumption.cs
شامل ModelInput
و ModelOutput و همچنین تابع
Predict برای استفاده از مدل است
SentimentAnalysis.training.cs
این فایل حاوی پایپ لاین ترینینگ ما است که توسط Model Builder برای ترین مدل ساخته شده است
SentimentAnalysis.zip
یک فایل zip که مدل آموزش داده شده ML.Net مارا نشان می دهد
مرحله هشتم: ساخت پروژه
تا اینجا در حال آماده سازی بخش هوش مصنوعی خود بودیم از الان به نحوه استفاده از آن در پروژه کلاینت خود می پردازیم
می توانید از هر پروژه دیگری مثل
- Console application
- Web API
استفاده کنید ولی ما قصد استفاده از Asp.net core Razor Pages را داریم
مرحله نهم: ساخت PredictionEnginePool
پکیج Microsoft.Extensions.ML را از طریق Nuget Package Manager نصب کنید
فایل program.cs پروژه Asp.net core Razor Pages خود را باز کنید
کد های زیر را در بخش using ها اضافه کنید
using Microsoft.Extensions.ML;
using static SentimentRazor.SentimentAnalysis;
حال باید PredictionEnginePool را اضافه کنید
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile("SentimentAnalysis.zip");
مرحله دهم: افزودن هندلر آنالیز احساسات نظرات
در پروژه Asp.net core RazorPages خود در فایل Index.cshtml.cs کد های زیر را اضافه کنید
using Microsoft.Extensions.ML;
using static SentimentRazor.SentimentAnalysis;
برای استفاده از PredictionEnginePool که در program.cs اضافه کردیم باید آن را به کانستراکتور فایل خود نیز اضافه کنیم
کد زیر به فایل Index.cshtml.cs اضافه کنید
private readonly PredictionEnginePool<ModelInput, ModelOutput> _predictionEnginePool;
حال باید کانستراکتور فایل را به شکل زیر تغییر دهید
public IndexModel(ILogger<IndexModel> logger, PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool)
{
_logger = logger;
_predictionEnginePool = predictionEnginePool;
}
متد OnGet فایل Index.cshtml.cs را به صورت زیر ایجاد کنید باید در آن داده های ورودی را دریافت کنیم
public IActionResult OnGetAnalyzeSentiment([FromQuery] string text)
{
}
حال کد های زیر را به ترتیب به درون متد OnGetAnalyzeSentiment اضافه کنید
برای جلوگیری از فرستادن دیتا خالی
if (String.IsNullOrEmpty(text)) return Content("Neutral");
بعد از اینکه در بالا چک شد ورودی قابل قبول است باید یک ModelInput ایجاد کنیم تا آن ML.Net ان را بررسی کند
var input = new ModelInput { SentimentText = text };
از PredictionEnginePool برای بررسی میزان خشونت نظر استفاده می کنیم
var prediction = _predictionEnginePool.Predict(input);
خروجی از جنس bool خود را تبدیل به کلمات toxic و not toxic تبدیل می کنیم
var sentiment = Convert.ToBoolean(prediction.PredictedLabel) ? "Toxic" : "Not Toxic";
در نهایت sentiment را بر میگردانیم
return Content(sentiment);
هوش مصنوعی در سی شارپ ML.Net چیست؟
مرحله یازدهم: نمایش نتیجه
همه چیز آماده است فقط کافیست نتیجه را نمایش دهیم
فایل Index.cshtml را باز کرده و کد زیر را در آن قرار دهید
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h2>Live Sentiment</h2>
<p><textarea id="Message" cols="45" placeholder="Type any text like a short review"></textarea></p>
<div class="sentiment">
<h4>Your sentiment is...</h4>
<p>😡 😐 😍</p>
<div class="marker">
<div id="markerPosition" style="left: 45%;">
<div>▲</div>
<label id="markerValue">Neutral</label>
</div>
</div>
</div>
</div>
در نهایت استایل های Css وب سایت را در فایل site.css در مسیر site.css قرار دهید
.sentiment {
background-color: #eee;
position: relative;
display: inline-block;
padding: 1rem;
padding-bottom: 0;
border-radius: 1rem;
}
.sentiment h4 {
font-size: 16px;
text-align: center;
margin: 0;
padding: 0;
}
.sentiment p {
font-size: 50px;
}
.sentiment .marker {
position: relative;
left: 22px;
width: calc(100% - 68px);
}
.sentiment .marker > div {
transition: 0.3s ease-in-out;
position: absolute;
margin-left: -30px;
text-align: center;
}
.sentiment .marker > div > div {
font-size: 50px;
line-height: 20px;
color: green;
}
.sentiment .marker > div label {
font-size: 30px;
color: gray;
}
برای دریافت خروجی از OnGetAnalyzeSentiment
از کد های جاوااسکریپت زیر استفاده خواهیم کرد
در فایل site.js در مسیرwwwroot\js کد های زیر را قرار دهید
function getSentiment(userInput) {
return fetch(`Index?handler=AnalyzeSentiment&text=${userInput}`)
.then((response) => {
return response.text();
})
}
در زیر کد قبلی یک فانکشن دیگر برای تغییر علامت شکل میزان خشونت اضافه می کنیم
function updateMarker(markerPosition, sentiment) {
$("#markerPosition").attr("style", `left:${markerPosition}%`);
$("#markerValue").text(sentiment);
}
برای دریافت ورودی کاربر از input ارسال آن به واسطه getSentiment و تغییر شکل علامت میزان خشونت با استفاده از updateMarker از کد زیر استفاده می کنیم
function updateSentiment() {
var userInput = $("#Message").val();
getSentiment(userInput)
.then((sentiment) => {
switch (sentiment) {
case "Not Toxic":
updateMarker(100.0, sentiment);
break;
case "Toxic":
updateMarker(0.0, sentiment);
break;
default:
updateMarker(45.0, "Neutral");
}
});
}
در نهایت هم کد زیر را قرار می دهید
$("#Message").on('change input paste', updateSentiment)
پروژه را اجرا کنید و لذت ببرید
پایان.