Разработка наивного байесовского классификатора текста в JAVA PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

В предыдущих статьях мы обсуждали теоретические основы Наивный байесовский классификатор и важность использования Методы выбора функций в текстовой классификации. В этой статье мы собираемся собрать все воедино и построить простую реализацию алгоритма классификации текста Наивного Байеса в JAVA. Код классификатора является открытым исходным кодом (под лицензией GPL v3), и вы можете скачать его с Github.

Обновление: среда машинного обучения Datumbox теперь с открытым исходным кодом и бесплатна для скачать, Проверьте пакет com.datumbox.framework.machinelearning.classification, чтобы увидеть реализацию наивного байесовского классификатора в Java.

Наивная байесовская реализация Java

Код написан на JAVA и может быть загружен непосредственно с Github, Он лицензирован по GPLv3, поэтому не стесняйтесь использовать его, изменять и свободно распространять.

Классификатор текста реализует Полиномиальный Наивный Байес модель вместе с Выбор функций Chisquare алгоритм. Все теоретические детали того, как работают оба метода, описаны в предыдущих статьях, а подробные комментарии по javadoc можно найти в исходном коде, описывающем реализацию. Таким образом, в этом сегменте я остановлюсь на высокоуровневом описании архитектуры классификатора.

1. Класс NaiveBayes

Это основная часть классификатора текста. Он реализует такие методы, как train () и Foregnet (), которые отвечают за подготовку классификатора и использование его для прогнозов. Следует отметить, что этот класс также отвечает за вызов соответствующих внешних методов для предварительной обработки и токенизации документа перед обучением / прогнозированием.

2. Объект NaiveBayesKnowledgeBase

Результатом обучения является объект NaiveBayesKnowledgeBase, который хранит всю необходимую информацию и вероятности, которые используются наивным байесовским классификатором.

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

Тексты обучения и прогнозирования в реализации внутренне хранятся как объекты документа. Объект документа хранит все токены (слова) документа, их статистику и целевую классификацию документа.

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, который вы приобрели ранее при обучении. Затем, просто вызвав метод предиката (), вы получите предсказанный класс документа.

   //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. Оптимизация производительности:

В конкретной реализации было важно улучшить читаемость кода, а не выполнять микрооптимизацию кода. Несмотря на то, что такие оптимизации делают код более уродливым и трудным для чтения / обслуживания, они часто необходимы, поскольку многие циклы в этом алгоритме выполняются миллионы раз во время обучения и тестирования. Эта реализация может стать отличной отправной точкой для разработки собственной настроенной версии.

Почти там ... Заключительные записки!

Я-слышал-HES-хорошо-на-кодирования-лЧтобы лучше понять, как работает эта реализация, настоятельно рекомендуем прочитать две предыдущие статьи о Наивный байесовский классификатор и Выбор функций, Вы получите представление о теоретических основах методов, и это сделает части алгоритма / кода более понятными.

Следует отметить, что наивный байесовский метод, несмотря на то, что он простой, быстрый и в большинстве случаев «довольно точный», также является «наивным», поскольку предполагает условную независимость функций. Поскольку это предположение почти никогда не встречается в задачах классификации текста, наивный байесовский метод почти никогда не является наилучшим классификатором. В API Datumboxнекоторые расширения стандартного наивного байесовского классификатора используются только для простых задач, таких как определение языка. Для более сложных задач классификации текста более продвинутые методы, такие как Макс. Энтропийный классификатор необходимы.

Если вы используете реализацию в интересном проекте напишите нам и мы представим ваш проект в нашем блоге. Также, если вам понравилась статья, пожалуйста, найдите время и поделитесь ею в Twitter или Facebook. 🙂

Отметка времени:

Больше от Датумбокс