Давайте разберемся с нуля. Классификация (также известная как категоризация) является примером контролируемого обучения . В контролируемом обучении у вас есть:
- модель - что-то, что приближает внутреннюю структуру ваших данных, позволяет вам рассуждать об этом и делать полезные прогнозы (например, прогнозировать класс объекта); обычно модель имеет параметры, которые вы хотите «выучить»
- обучающие и тестовые наборы данных - наборы объектов, которые вы используете для обучения вашей модели (поиска хороших значений параметров) и дальнейшей оценки
- алгоритмы обучения и классификации - сначала описывается, как выучить модель из набора обучающих данных, во-вторых показывает, как получить класс нового объекта с учетом обученной модели
Теперь давайте рассмотрим простой случай классификации спама. Ваш учебный набор данных представляет собой совокупность электронных писем + соответствующие ярлыки - «спам» или «не спам». Набор данных для тестирования имеет ту же структуру, но состоит из нескольких независимых электронных писем (обычно один просто разбивает свой набор данных и, скажем, 9/10 из него будет использоваться для обучения и 1/10 - для тестирования). Один из способов моделирования электронных писем состоит в том, чтобы представлять каждое из них как набор (пакет) слов. Если мы предполагаем, что слова не зависят друг от друга, мы можем использовать наивный байесовский классификатор , то есть вычислить априорные вероятности для каждого слова и каждого класса (алгоритм обучения), а затем применить теорему Байеса, чтобы найти апостериорную вероятность того, что новый документ будет принадлежать определенный класс.
Итак, в основном имеем:
raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label
Теперь обратите внимание, что мы представляли наши объекты (документы) как пакет слов. Но единственный ли это способ? На самом деле, мы можем извлечь гораздо больше из исходного текста. Например, вместо слов, как есть, мы можем использовать их основы или леммы , выбрасывать шумовые стоп-слова , добавлять POS-теги слов, извлекать именованные объекты или даже исследовать HTML-структуру документа. Фактически, более общее представление документа (и вообще любого объекта) является вектором признаков . Например, для текста:
actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
0, 0, 1, 1, ..., 5, 7, 2, ..., 2, ... | not spam
0, 1, 0, 0, ..., 3, 12, 10, ..., 0, ... | spam
Здесь первая строка представляет собой список возможных функций, а последующие строки показывают, сколько раз эта функция встречается в документе. Например, в первом документе нет вхождения слова «актер», 1 вхождения слова «прожечь», 5 существительных, 2 прилагательных и 2 фрагмента текста, выделенных жирным шрифтом. Последний столбец соответствует результирующей метке класса.
Используя векторный признак, вы можете включить любые свойства ваших текстов. Хотя поиск хорошего набора функций может занять некоторое время.
А как насчет модели и алгоритмов? Мы связаны с Наивным Байесом. Не за что. логистическая регрессия , SVM , деревья решений - просто упомянуть несколько популярных классификаторов. (Обратите внимание, что мы говорим «классификатор», в большинстве случаев мы имеем в виду модель + соответствующие алгоритмы для обучения и классификации).
Что касается реализации, вы можете разделить задачу на 2 части:
- Извлечение признаков - преобразование необработанных текстов в векторы функций.
- Классификация объектов - построение и применение модели.
Первый пункт хорошо проработан во многих библиотеках НЛП . Во-вторых, это машинное обучение, поэтому, в зависимости от вашего набора данных, вы можете использовать либо Weka , либо MLlib .