Классификация неструктурированного текста

12

Я собираюсь классифицировать неструктурированные текстовые документы, а именно сайты неизвестной структуры. Количество классов, которые я классифицирую, ограничено (на данный момент я считаю, что их не более трех). У кого-нибудь есть предложения о том, как мне начать?

Возможен ли подход "мешок слов" здесь? Позже я мог бы добавить еще один этап классификации на основе структуры документа (возможно, деревьев решений).

Я немного знаком с Mahout и Hadoop, поэтому я предпочитаю решения на основе Java. При необходимости я могу переключиться на Scala и / или Spark engine (библиотека ML).

Гжегож Э.
источник

Ответы:

14

Давайте разберемся с нуля. Классификация (также известная как категоризация) является примером контролируемого обучения . В контролируемом обучении у вас есть:

  • модель - что-то, что приближает внутреннюю структуру ваших данных, позволяет вам рассуждать об этом и делать полезные прогнозы (например, прогнозировать класс объекта); обычно модель имеет параметры, которые вы хотите «выучить»
  • обучающие и тестовые наборы данных - наборы объектов, которые вы используете для обучения вашей модели (поиска хороших значений параметров) и дальнейшей оценки
  • алгоритмы обучения и классификации - сначала описывается, как выучить модель из набора обучающих данных, во-вторых показывает, как получить класс нового объекта с учетом обученной модели

Теперь давайте рассмотрим простой случай классификации спама. Ваш учебный набор данных представляет собой совокупность электронных писем + соответствующие ярлыки - «спам» или «не спам». Набор данных для тестирования имеет ту же структуру, но состоит из нескольких независимых электронных писем (обычно один просто разбивает свой набор данных и, скажем, 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 части:

  1. Извлечение признаков - преобразование необработанных текстов в векторы функций.
  2. Классификация объектов - построение и применение модели.

Первый пункт хорошо проработан во многих библиотеках НЛП . Во-вторых, это машинное обучение, поэтому, в зависимости от вашего набора данных, вы можете использовать либо Weka , либо MLlib .

ffriend
источник
Оригинальный плакат использовал слово «классифицировать», но «кластер» - более точное описание его проблемы, потому что у него нет априорных определений категорий. Следовательно, это не обязательно контролируемая проблема обучения.
MrMeritology
@MrMeritology: хм, из контекста я бы сказал, что автор просто не уверен в конкретных классах, которые он собирается использовать, но все же хочет классификацию, а не кластеризацию. Во всяком случае, он единственный, кто знает правду :)
друг
Возможно я не был ясен в этом пункте. Категории будут выбраны в рекомендации, так что это скорее проблема классификации, чем кластеризации. Идея создания вектора сложных объектов представляется вполне разумной, особенно из-за того, что существуют некоторые конкретные теги, которые, скорее всего, могут быстро классифицировать некоторые из выборок. Я не уверен, что SVM подойдет для этой проблемы, так как я предсказываю высокую нелинейность, но деревья решений и байесовский подход, кажется, применимы. Я также начинаю думать о применении гибридного алгоритма (деревья решений на основе SVM).
Гжегож Э.
@GrzegorzE. - Если ваши категории определены заранее, укажите эти три категории в своем вопросе. На мой взгляд, вы слишком сфокусированы на алгоритмах ML и не достаточно на природе вашей проблемы и природы ваших данных. Например, вы предсказываете «нелинейности» в функциях для веб-сайтов неизвестной структуры. Почему? Кроме того, вы смешиваете теги с текстом веб-страницы с «кто знает, что еще», и они имеют разное семантическое значение.
MrMeritology
@GrzegorzE. - Я настоятельно рекомендую, чтобы ваш метод классификации основывался на характере ваших априорных категорий и характере данных. Существует бесконечное количество способов разделить произвольные веб-сайты на 3 категории. Каждый способ категоризации будет предлагать существенные особенности данных или характерные шаблоны. Там нет замены для ручного анализа отдельных элементов данных (веб-страниц) и их контекста.
MrMeritology
5

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

Вы рассматриваете каждый документ как пакет слов и предварительно обрабатываете удаление стоп-слов и т. Д. С помощью самых простых методов вы заранее указываете количество тем. В вашем случае вы можете либо указать «3», который является вашим фиксированным лимитом для категорий, либо выбрать большее количество тем (от 10 до 100), а затем на отдельном шаге сформировать три кластера для документов с общим акцентом на темы. K-средства или другие методы кластеризации могут быть использованы. (Я бы рекомендовал последний подход)

Вам не нужно кодировать программное обеспечение для моделирования тем с нуля. Вот веб-страница со многими ресурсами, включая библиотеки / пакеты программного обеспечения .

Ни один не в Java, но есть способы для запуска C ++ и Python под Java.

MrMeritology
источник
4

Вот пара действительно хороших пакетов программного обеспечения с открытым исходным кодом для классификации текста, которые должны помочь вам начать:

  • MALLET - это лицензированный CPL инструментарий машинного обучения на основе Java, созданный UMass для работы с текстовыми данными. Он включает в себя реализации нескольких алгоритмов классификации (например, наивного байесовского алгоритма, максимальной энтропии, деревьев решений).
  • Stanford Классификатор из Стэнфордского NLP Group является GPL лицензии Java реализацией максимальной энтропии классификатора предназначен для работы с текстовыми данными.
Чарли Гринбакер
источник