LinkedIn GitHub

На прошлой неделе я опубликовал сообщение об инструменте извлечения резюме текста, который я создал с помощью Python с использованием NLTK и оценок косинусного сходства. Эту статью можно найти ЗДЕСЬ. На этой неделе блог будет посвящен другой части этого проекта, где я использую алгоритмы неконтролируемого обучения для кластеризации новостных статей, а затем алгоритмы контролируемого обучения для классификации недавних статей.

Данные

Данные, которые я использую, представляют собой примерно 97 тыс. Новостных статей за 2013–2017 годы и имеют длину от 2 до 15 тыс. Символов. Я сохраняю набор данных во фрейме данных pandas для анализа, предварительный просмотр показан ниже.

Алгоритм

Алгоритм, который я выбрал для этой задачи, - это алгоритм кластеризации K-средних, который группирует точки данных в заданное количество кластеров на основе положения точки относительно центроидов. Причина, по которой этот алгоритм является хорошим выбором, заключается в том, что он хорошо работает с немаркированными данными (например, с текстом), однако он может быть довольно дорогостоящим с точки зрения вычислений. Краткое описание кластеризации K-средних можно увидеть здесь.

Предварительная обработка текста

Чтобы подготовить новостные статьи для K-средних, необходимо выполнить ряд шагов предварительной обработки, чтобы очистить данные.

Я предпринял следующие шаги:

  1. Удалите неанглийские статьи
  2. Токенизируйте, лемматизируйте и определяйте слова в каждой статье
  3. Объедините слова каждой записи в строку и преобразуйте всю серию панд в список строк
  4. Выполните векторизацию подсчета и удалите стоп-слова
  5. Преобразовать список строк с преобразованием TF-IDF

Чтобы ускорить этапы обучения, я сократил каждую статью до первых 100 слов для выполнения кластеризации. Это исходит из моего личного предположения, что основная идея статьи, скорее всего, возникнет в самом начале текста. После подбора ряда моделей K-средних я решил использовать модель с 12 кластерами, однако это было выбрано несколько произвольно, и все еще необходимо его оптимизировать. Размер каждого отдельного кластера показан ниже.

Глядя на кластеры

Теперь давайте посмотрим на главные слова в каждом кластере:

  • Кластер 0: штат, новый год, год, президент, люди, нация, один, единица, страна, правительство.
  • Группа 1: Трамп, президент, Дональд, будет, белый, дом, кампания, американец, Вашингтон, администрация, нация.
  • Группа 2: Трамп, республиканец, партия, Дональд, демократ, президент, сенат, кандидат, Республиканская партия, избиратель, кандидат.
  • Кластер 3: один, год, новый, первый, мир, игра, прямая трансляция, неделя, люди, сделать, получить, скажем, работа, показать
  • Группа 4: Клинтон, Хиллари, Трамп, демократ, кампания, Сандерс, президентские выборы, электронная почта, Берни, поддержка.
  • Кластер 5: Трамп, Россия, расследование, разведка, коми, выборы, режиссер, Путин, Флинн.
  • Кластер 6: школа, студент, университет, образование, год, учитель, класс, неделя, выпускник.
  • Группа 7: суд, верховный, правосудие, судья, правило, федеральный, сенат, закон, апелляция, Обама, юридический.
  • Кластер 8: республиканцы, уход, здоровье, дом, законопроект, Трамп, закон, сенат, Obamacare, президент, страхование, реформа.
  • Кластер 9: пожалуйста, рассказ, отлично, нужно, написать, продолжить, шаг, блок, показать, расширить, разделить, идея
  • Кластер 10: компания, год, процент, США, рынок, миллиард, банк, цена, ставка, акции, инвестор, доля, отчет, нефть.
  • Кластер 11: полиция, государство, нападение, убийство, Северная Корея, ислам, Сирия, президент, военные, сила.

Анализ кластеров

Просматривая группы статей, можно выделить несколько моментов:

  • Кластеры 0, 1 и 2 кажутся в основном политическими, и похоже, что кластеры 1 и 2 в основном склоняются к статьям, касающимся предвыборной кампании по переизданию. Кластер 0 кажется довольно широким в политическом отношении.
  • Кластер 3 также выглядит чрезвычайно широким, и это также самый большой кластер НА ДАЛЬНЕЙШЕМУ. Это может быть связано с тем, что в наборе данных есть большое количество статей по широкому кругу тем. После тестирования моей модели классификации похоже, что большинство спортивных статей попадут в кластер 3.
  • Кластер 4 достаточно силен и в основном основан на статьях о демократической партии и Хиллари Клинтон.
  • Кластер 5 специально связан со статьями о вмешательстве России в выборы 2016 года.
  • Кластер 6 демонстрирует сильную связь со статьями, написанными об образовании.
  • Кластер 7 тесно связан с федеральной судебной системой
  • Кластер 8 в первую очередь касается политических вопросов, таких как здравоохранение, налоговая реформа и т. Д.
  • Кластер 9 - это еще один кластер, в котором есть широкий спектр тем, которые, кажется, не сводятся к небольшому количеству идей.
  • Кластер 10 явно состоит из статей о финансовых рынках.
  • Кластер 11 для меня самый впечатляющий, этот кластер, кажется, построен вокруг полиции, военных и иностранных конфликтов.

Дальнейшая кластеризация

Заметив размер и пропорцию кластера №3, я решил повторно кластеризовать строки внутри него. Как оказалось, каждый кластер, созданный из кластера №3, был посвящен исключительно Дональду Трампу и выборам. Из-за этого я решил не включать в свою модель повторную кластеризацию, вместо этого я оставил кластер №3 как есть. Как оказалось, первые слова для кластера №3 вводили в заблуждение, хотя я нашел ответ, покопавшись глубже. Этот кластер по-прежнему остается широким, но кажется, что он также политически центрирован.

Классификация новых статей

Наконец, я использовал созданные кластеры, чтобы добавить новый столбец в фрейм данных, который показывал кластер, назначенный каждой новостной статье. Теперь я могу использовать алгоритмы контролируемого обучения для классификации новых статей. Я обучил несколько различных алгоритмов для этой задачи, и результаты можно увидеть ниже.

В целом лидером стал XGBoost, который классифицировал статьи в их правильные кластеры с точностью теста 75,6%.

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

Есть какие-нибудь советы по развитию этого проекта? Я буду рад получить известие от вас! Не стесняйтесь связаться со мной в LinkedIn и проверить исходный код на моем GitHub.

Ваше здоровье.