توسعه یک طبقه‌بندی متن ساده بیز در هوش داده پلاتو بلاک چین جاوا. جستجوی عمودی Ai.

توسعه یک طبقه بندی متن ساده بیز در جاوا

در مقالات قبلی به پیشینه نظری آن پرداختیم طبقه بندی کننده متن ساده لوح بیز و اهمیت استفاده از تکنیک های انتخاب ویژگی در طبقه بندی متن در این مقاله قصد داریم همه چیز را کنار هم بگذاریم و یک پیاده سازی ساده از الگوریتم طبقه بندی متن Naive Bayes در جاوا بسازیم. کد طبقه‌بندی‌کننده منبع باز (تحت مجوز GPL v3) است و می‌توانید آن را دانلود کنید گیتهاب.

به روز رسانی: چارچوب یادگیری ماشین Datumbox اکنون منبع باز و رایگان است دانلود. برای مشاهده اجرای Naive Bayes Classifier در جاوا، بسته com.datumbox.framework.machinelearning.classification را بررسی کنید.

پیاده سازی ساده بیز جاوا

کد به زبان جاوا نوشته شده است و می توانید مستقیماً از آن دانلود کنید گیتهاب. مجوز آن تحت GPLv3 است، بنابراین از آن استفاده کنید، آن را تغییر دهید و آزادانه آن را دوباره توزیع کنید.

Text Classifier پیاده سازی می کند چند جمله ای ساده بیز مدل همراه با انتخاب ویژگی Chisquare الگوریتم تمام جزئیات تئوری نحوه کار هر دو تکنیک در مقالات قبلی و نظرات جزئی جاوادوک در کد منبع که پیاده سازی را توصیف می کند، پوشش داده شده است. بنابراین در این بخش، من بر توصیف سطح بالایی از معماری طبقه‌بندی‌کننده تمرکز خواهم کرد.

1. کلاس NaiveBayes

این بخش اصلی Text Classifier است. متدهایی مانند train() و predict() را پیاده سازی می کند که وظیفه آموزش طبقه بندی کننده و استفاده از آن برای پیش بینی را بر عهده دارند. لازم به ذکر است که این کلاس وظیفه فراخوانی متدهای خارجی مناسب برای پیش پردازش و توکن سازی سند را قبل از آموزش/پیش بینی نیز دارد.

2. Object NaiveBayesKnowledgeBase

خروجی آموزش یک شی NaiveBayesKnowledgeBase است که تمام اطلاعات و احتمالات لازم را که توسط طبقه بندی کننده Naive Bayes استفاده می شود را ذخیره می کند.

3. شیء سند

هم متون آموزشی و هم متون پیش‌بینی در پیاده‌سازی به صورت داخلی به‌عنوان اشیاء سند ذخیره می‌شوند. Document Object تمام نشانه ها (کلمات) سند، آمار آنها و طبقه بندی هدف سند را ذخیره می کند.

4. شیء FeatureStats

شی FeatureStats چندین آمار را که در مرحله استخراج ویژگی تولید می شوند ذخیره می کند. چنین آماری عبارتند از: تعداد مشترک ویژگی‌ها و کلاس (که از آن‌ها احتمالات و احتمالات مشترک تخمین زده می‌شود)، تعداد کلاس‌ها (که اگر هیچ کدام به عنوان ورودی داده نشود، از آن‌ها اولویت‌ها ارزیابی می‌شوند) و تعداد کل مشاهدات مورد استفاده برای آموزش.

5. کلاس استخراج ویژگی

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

6. کلاس TextTokenizer

این یک ساده کلاس توکن سازی متن، مسئول پیش پردازش، پاک کردن و توکن کردن متون اصلی و تبدیل آنها به اشیاء Document است.

با استفاده از کلاس JAVA NaiveBayes

در کلاس NaiveBayesExample می توانید نمونه هایی از استفاده از کلاس NaiveBayes را بیابید. هدف کد نمونه ارائه نمونه ای است که یک طبقه بندی کننده ساده ساده بیز را به منظور تشخیص زبان یک متن آموزش می دهد. برای آموزش طبقه‌بندی‌کننده، ابتدا مسیرهای مجموعه داده‌های آموزشی را در HashMap ارائه می‌کنیم و سپس محتوای آنها را بارگذاری می‌کنیم.

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

طبقه بندی NaiveBayes با انتقال داده ها به آن آموزش داده می شود. پس از تکمیل آموزش، شی NaiveBayesKnowledgeBase برای استفاده بعدی ذخیره می شود.

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

در نهایت برای استفاده از طبقه‌بندی‌کننده و پیش‌بینی کلاس‌های نمونه‌های جدید، تنها کاری که باید انجام دهید این است که یک طبقه‌بندی‌کننده جدید را با ارسال شی NaiveBayesKnowledgeBase که قبلاً با آموزش به دست آورده‌اید، مقداردهی اولیه کنید. سپس با فراخوانی ساده متد ()predict کلاس پیش بینی شده سند را دریافت می کنید.

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

توسعه های لازم

پیاده سازی JAVA خاص نباید یک راه حل آماده برای استفاده کامل برای مسائل طبقه بندی متن پیچیده در نظر گرفته شود. در اینجا برخی از توسعه های مهمی که می توان انجام داد آورده شده است:

1. استخراج کلمه کلیدی:

حتی اگر استفاده از کلمات کلیدی واحد می تواند برای مسائل ساده ای مانند تشخیص زبان کافی باشد، سایر مسائل پیچیده تر نیاز به استخراج n-gram دارند. بنابراین می‌توان الگوریتم استخراج متن پیچیده‌تری را با به‌روزرسانی متد ()TextTokenizer.extractKeywords پیاده‌سازی کرد یا از Datumbox استفاده کرد. API استخراج کلمات کلیدی تابعی برای دریافت تمام n-گرم (ترکیب کلمات کلیدی) سند.

2. پیش پردازش متن:

قبل از استفاده از طبقه‌بندی‌کننده معمولاً لازم است سند را از قبل پردازش کنید تا کاراکترها/قطعات غیر ضروری حذف شوند. حتی اگر پیاده‌سازی فعلی با استفاده از روش TextTokenizer.preprocess() پیش پردازش محدودی را انجام دهد، وقتی نوبت به تجزیه و تحلیل صفحات HTML می‌رسد، همه چیز پیچیده‌تر می‌شود. می‌توان به سادگی تگ‌های HTML را حذف کرد و فقط متن ساده سند را نگه داشت یا به تکنیک‌های پیچیده‌تر یادگیری ماشینی متوسل شد که متن اصلی صفحه را شناسایی می‌کند و محتوای متعلق به پاورقی، سرصفحه، منوها و غیره را حذف می‌کند. می توانید از Datumbox استفاده کنید API استخراج متن تابع.

3. مدل های اضافی ساده لوح بیز:

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

4. روش های انتخاب ویژگی اضافی:

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

5. بهینه سازی عملکرد:

در پیاده‌سازی خاص، بهبود خوانایی کد به جای انجام بهینه‌سازی‌های خرد روی کد مهم بود. علیرغم این واقعیت که چنین بهینه‌سازی‌هایی کد را زشت‌تر و خواندن/نگهداری آن را سخت‌تر می‌کنند، اغلب ضروری هستند زیرا بسیاری از حلقه‌ها در این الگوریتم میلیون‌ها بار در طول آموزش و آزمایش اجرا می‌شوند. این پیاده سازی می تواند یک نقطه شروع عالی برای توسعه نسخه تنظیم شده شما باشد.

تقریباً وجود دارد ... یادداشت های پایانی!

شنیدم-هس-در-کدینگ-لبرای درک خوب نحوه عملکرد این پیاده سازی به شما توصیه می شود که دو مقاله قبلی در مورد آن را بخوانید طبقه بندی کننده ساده لوح بیز و انتخاب ویژگی. شما بینش هایی در زمینه پیشینه نظری روش ها دریافت خواهید کرد و بخش هایی از الگوریتم/کد را واضح تر می کند.

باید توجه داشته باشیم که Naive Bayes علیرغم اینکه ساده، سریع و در اکثر مواقع "کاملا دقیق" است، "ساده لوح" نیز هست زیرا فرض استقلال مشروط ویژگی ها را ایجاد می کند. از آنجایی که این فرض تقریباً هرگز در مسائل طبقه بندی متن برآورده نمی شود، Naive Bayes تقریباً هرگز بهترین طبقه بندی کننده نیست. که در Datumbox API، برخی از بسط های طبقه بندی کننده استاندارد Naive Bayes فقط برای مسائل ساده ای مانند تشخیص زبان استفاده می شوند. برای مشکلات طبقه بندی متن پیچیده تر، تکنیک های پیشرفته تری مانند طبقه بندی کننده حداکثر آنتروپی لازم است

اگر از پیاده سازی در یک پروژه جالب استفاده می کنید یک خط را بگذار و ما پروژه شما را در وبلاگ خود به نمایش خواهیم گذاشت. همچنین اگر مقاله را دوست دارید، لطفاً کمی وقت بگذارید و آن را در توییتر یا فیس بوک به اشتراک بگذارید. 🙂

تمبر زمان:

بیشتر از Datumbox