یکی از جاهایی که الگوریتم Multinomial Naive Bayes به کار می رود، طبقه بندی سندها و نوشته ها است، جایی که ویژگی های مسئله،تعداد هر یک از واژگان  مرتبط با سند یا نوشته ای است که می خواهیم آن را طبقه بندی کنیم. در کتابخانه Scikit-Learn، الگوریتم MultinomialNB برای طبقه بندی متن ها به کار می رود. در این نوشته می خوایم به کمک مجموعه داده fetch_20newsgroups از Scikit-learn می خواهیم طبقه بندی سندها را پیاده سازی کنیم.

یکی از جاهایی که الگوریتم Multinomial Naive Bayes به کار می رود، طبقه بندی سندها و نوشته ها است، جایی که ویژگی های مسئله،تعداد هر یک از واژگان  مرتبط با سند یا نوشته ای است که می خواهیم آن را طبقه بندی کنیم. در کتابخانه Scikit-Learn، الگوریتم MultinomialNB برای طبقه بندی متن ها به کار می رود. در این نوشته می خوایم به کمک مجموعه داده fetch_20newsgroups از Scikit-learn می خواهیم طبقه بندی سندها را پیاده سازی کنیم.

در شکل زیر کتابخانه های گوناگون برای حل این مسئله پیوست شده اند. یکی از آنها، مجموعه داده fetch_20newsgroup است که از ماژول sklearn.datasets پیوست شده است. سپس تابع ()fetch_20newsgroup انجام شده که مجموعه داده ها را از روی اینترنت دانلود می کند. این دانلود تنها یک بار انجام می شود و شما می توانید از این مجموعه داده دانلود شده، درون پروژه های Sklearn دیگر نیز کمک بگیرید.

در شکل زیر به کمک دستور dataset.target_names فهرست همه برچسب ها یا کلاس های در دسترس را نمایش می دهیم. در واقع می خواهیم فایل های متنی دانلود شده را بر پایه یکی از این برچسب یا Target ها دسته بندی (طبقه بندی) کنیم. در اینجا برای سادگی مسئله تنها ۵ تا از این طبقه ها (یا Category های خبری) را برای ساخت مدل به کار می بریم. در کد زیر متغیر category لیستی است که این دسته ها را در خود نگه می دارد.

ساخت داده های یادگیری و آزمایش

پیش از این گفته بودیم که به کمک تابع ()split_train_test می توانیم درصدی از داده ها را برای آموزش (Training Data) و درصدی دیگر را برای آزمایش (Test Data) به کار ببریم. زمانی که مجموعه داده های fetch_20newsgroup را دانلود می کنید، در واقع دو دسته داده train و test داریم که در در دو دایرکتوری جدا بر روی دیسک شما نگهداری می شوند. بر روی سیستم فایل و در زیر دایرکتوری خانگی شما، یک پوشه به نام  scikit_learn_data/20news_home ساخته می شود که درون آن دو زیر پوشه به نام train و test هست. در واقع درون هر یک از این زیر پوشه ها، فایل های متنی است که برای یادگیری و آزمایش مدل به کار می روند. با دستور dataset.filenames می توانیم فهرست این فایل ها را نشان دهید. توجه کنید که dataset نام متغیری است که پیش از این نتیجه اجرای تابع ()fetch_20newsgroup در آن ریخته شده است.

برای ساخت مجموعه داده های یادگیری (یا آموزش) و آزمایش می بایست از متد ()fetch_20newsgroup کمک بگیریم. در کدهای زیر، پارامتر subset را مقدار دهی می کنیم به گونه ای که مقدار train را برای ساخت مجموعه داده یادگیری و مقدار test را برای ساخت مجموعه داده آزمایش به کار می بریم. توجه کنید هر یک از مقدارها، فایلهای درون زیر پوشه های train و test را فراخوانی می کنند.

بنابراین تا بدین جا دو مجموعه داده یادگیری و آزمایش را ساخته ایم. در کد شکل بالا و به کمک متد ()head بخشی از درون مایه هر یک از مجموعه داده های یادگیری و آزمایش را نشان داده ایم. توجه کنید ویژگی data از نام متغیرهای train و test داده های هر یک از مجموعه داده ها را نشان می دهد. همچنین به جای دستورهای train.data و test.data می توانید دستورهای زیر را نیز به کار ببرید. دستورهای زیر نیز بخشی از داده ها را نشان می دهند.

ساخت مدل

در کد شکل زیر نخست به کمک متد ()make_pipeline از ماژول sklearn.pipelines با کمک تابع های سازنده کلاس های TfidfVectorizer و MultinomialNB که به متد ()make_pipeline فرستاده شده اند، با یک خط لوله یادگیری ماشین (Machine Learning Pipeline) یک مدل در پایان با دو داده train.data و train.taget می سازیم. توجه کنید که کلاس MultinomialNB پیاده سازی MulltinomialNB در Scikit-Learn است.

کلاس TfidfVectorizer برای تبدیل ویژگی های یک نوشته که همان متن ها هستند به شماره هایی که تعداد هر یک واژگان را نشان می دهند، به کار گرفته شده است. در شکل بالا می بینید که تنها ۵ تا از همه برچسب ها یا دسته بندی های خبری را به کار برده ایم. اکنون باید با مجموعه داده های test.data و به کمک متد ()predict، مدل ساخته شده را با انجام پیش بینی هایی، ارزیابی کنیم. در شکل زیر، مجموعه داده های آزمایش به متد ()predict فرستاده شده است و برچسب های پیش بینی شده یا همان کلاس های پیش بینی شده درون متغیر labels ریخته می شوند. سپس درون یک حلقه for ده تا از برچسب های پیش بینی شده را نشان داده ایم.

در کد شکل زیر تابعی به نام ()predict_category نوشته ایم که یک رشته ورودی از پارامتر s را دریافت و سپس برچسب آن را به کمک مدل فرستاده شده از پارامتر model پیش بینی می کند. توجه کنید مقدار پیش فرض پارامتر model همان متغیر model است که پیش از این ساخته بودیم. همچنین نام برچسب هر رشته از میان برچسب های درون متغیر train بدست می آید. توجه کنید که متغیر train مقدار پیش فرض برای پارامتر trainدر تابع است. سپس چندین رشته نمونه را با توجه به مجموعه داده fetch_20newsgroup به تابع ()predict_category فرستاده ایم.

توجه کنید دو تابع سازنده از کلاس های TfidfVectorizer و MultinomialNB به متد ()make_pipeline فرستاده شده است که بدین مفهوم است که در آغاز کلاس TfidfVectorizer انجام شده و سپس یک نمونه از کلاس MultinomialNB به نام متغیر model ساخته می شود. در پایان متد ()fit از کلاس MultinomialNB با مقدارهای train.data و برچسبهای درون مجموعه داده یادگیری، یعنی train.target برای ساخت مدل فراخوانی می شود. پس از این، با متد ()predict و مجموعه داده های آزمایش مدل ارزیابی شده و برچسب های پیش بینی شده درون متغیر labels نگهداری می شوند.