Розробка простого текстового класифікатора Байєса в JAVA PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Розробка наївного байєсового текстового класифікатора в JAVA

У попередніх статтях ми обговорювали теоретичні основи Наївний байєсівський текстовий класифікатор і важливість використання Техніка вибору ознак в Класифікації тексту. У цій статті ми збираємося зібрати все разом і побудувати просту реалізацію наївного алгоритму класифікації тексту Байєса в JAVA. Код класифікатора з відкритим кодом (під ліцензією GPL v3), і ви можете завантажити його з Github.

Оновлення: Система машинного навчання Datumbox тепер є відкритою та безкоштовною скачати. Перегляньте пакет com.datumbox.framework.machinelearning.classification, щоб побачити реалізацію Naive Bayes Classifier в Java.

Наївна реалізація Java Bayes

Код написаний на JAVA і його можна завантажити безпосередньо Github. Він ліцензований під GPLv3, тому не соромтеся використовувати його, змінювати його та вільно поширювати.

Текстовий класифікатор реалізує Багаточлен наївного Байєса модель разом з Вибір функції Chisquare алгоритм. Усі теоретичні деталі того, як працюють обидві методи, висвітлені в попередніх статтях, а детальні коментарі javadoc можна знайти у вихідному коді, що описує реалізацію. Тому в цьому сегменті я зосереджуся на описі високого рівня архітектури класифікатора.

1. Клас NaiveBayes

Це основна частина текстового класифікатора. Він реалізує такі методи, як train() і predict(), які відповідають за навчання класифікатора та використання його для передбачення. Слід зазначити, що цей клас також відповідає за виклик відповідних зовнішніх методів для попередньої обробки та токенізації документа перед навчанням/прогнозуванням.

2. Об'єкт NaiveBayesKnowledgeBase

Результатом навчання є об’єкт NaiveBayesKnowledgeBase, який зберігає всю необхідну інформацію та ймовірності, які використовуються наївним класифікатором Байєса.

3. Об'єкт документа

Як навчальний текст, так і текст прогнозування в реалізації внутрішньо зберігаються як об’єкти документа. Об’єкт Document зберігає всі лексеми (слова) документа, їх статистику та цільову класифікацію документа.

4. Об'єкт FeatureStats

Об’єкт FeatureStats зберігає кілька статистичних даних, які генеруються під час фази вилучення ознак. Такою статистикою є спільні підрахунки ознак і класів (з яких оцінюються спільні ймовірності та ймовірності), підрахунки класів (з яких оцінюються пріоритети, якщо жодних не вказано як вхідні дані) і загальна кількість спостережень, використаних для навчання.

5. Клас FeatureExtraction

Це клас, який відповідає за вилучення ознак. Слід зазначити, що оскільки цей клас внутрішньо обчислює деякі статистичні дані, які насправді потрібні алгоритму класифікації на пізнішому етапі, усі ці статистичні дані кешуються та повертаються в об’єкт FeatureStats, щоб уникнути їх перерахунку.

6. Клас TextTokenizer

Це простий клас токенізації тексту, відповідальний за попередню обробку, очищення та токенізацію вихідних текстів і перетворення їх в об’єкти Document.

Використання класу NaiveBayes JAVA

У класі 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-грам. Таким чином, можна або реалізувати більш складний алгоритм вилучення тексту, оновивши метод TextTokenizer.extractKeywords(), або використати Datumbox's API вилучення ключових слів функція, щоб отримати всі n-грами (комбінації ключових слів) документа.

2. Попередня обробка тексту:

Перед використанням класифікатора зазвичай необхідно попередньо обробити документ, щоб видалити непотрібні символи/частини. Незважаючи на те, що поточна реалізація виконує обмежену попередню обробку за допомогою методу TextTokenizer.preprocess(), коли справа доходить до аналізу HTML-сторінок, все стає складніше. Можна просто обрізати теги HTML і залишити лише звичайний текст документа або вдатися до більш складних методів машинного навчання, які визначають основний текст сторінки та видаляють вміст, який належить до нижнього колонтитула, заголовків, меню тощо. можна використовувати Datumbox's API вилучення тексту функції.

3. Додаткові наївні моделі Байєса:

Поточний класифікатор реалізує мультиноміальний наївний класифікатор Байєса, однак, як ми обговорювали в попередній статті про Аналіз почуттів, різні задачі класифікації вимагають різних моделей. У деяких бінаризована версія алгоритму була б більш прийнятною, тоді як в інших модель Бернуллі дасть набагато кращі результати. Використовуйте цю реалізацію як відправну точку та дотримуйтесь інструкцій Наївний підручник Байєса розширити модель.

4. Методи вибору додаткових функцій:

Ця реалізація використовує алгоритм вибору ознак Chisquare для вибору найбільш підходящих ознак для класифікації. Як ми бачили в попередній статті, Вибір функцій Chisquare Метод є хорошою технікою, яка спирається на статистичні дані для вибору відповідних ознак, проте він має тенденцію давати вищі оцінки рідкісним ознакам, які з’являються лише в одній із категорій. Покращення можна зробити, видаливши шумні/рідкісні функції, перш ніж перейти до вибору функцій, або реалізувавши додаткові методи, такі як взаємна інформація, яку ми обговорювали у вищезгаданій статті.

5. Оптимізація продуктивності:

У конкретній реалізації важливо було покращити читабельність коду, а не виконувати мікрооптимізацію коду. Незважаючи на те, що такі оптимізації роблять код потворнішим і важчим для читання/обслуговування, вони часто необхідні, оскільки багато циклів у цьому алгоритмі виконуються мільйони разів під час навчання та тестування. Ця реалізація може стати чудовою відправною точкою для розробки вашої власної налаштованої версії.

Майже готово… Останні примітки!

Я чув, що він добре кодуєЩоб добре зрозуміти, як працює ця реалізація, настійно радимо прочитати дві попередні статті про Наївний байєсівський класифікатор та Вибір функції. Ви отримаєте уявлення про теоретичні основи методів, і це зробить частини алгоритму/коду більш зрозумілими.

Слід зазначити, що наївний Байєс, незважаючи на те, що він легкий, швидкий і в більшості випадків «досить точний», він також «наївний», оскільки робить припущення про умовну незалежність функцій. Оскільки це припущення майже ніколи не зустрічається в задачах класифікації тексту, наївний Байєс майже ніколи не є найкращим класифікатором. в API Datumbox, деякі розширення стандартного класифікатора наївного Байєса використовуються лише для простих задач, таких як визначення мови. Для більш складних завдань класифікації тексту більш просунуті методи, такі як Класифікатор максимальної ентропії необхідні.

Якщо ви використовуєте реалізацію в цікавому проекті киньте нам лінію і ми представимо ваш проект у нашому блозі. Також, якщо вам подобається стаття, будь ласка, знайдіть хвилинку та поділіться нею у Twitter або Facebook. 🙂

Часова мітка:

Більше від Датабокс