Многопозиционная классификация для НЛП в Python

Введение

Классификация с несколькими метками - это тип проблемы, когда каждому объекту назначается набор из одной или нескольких целевых меток. Это очень похоже на предсказание жанров фильма или песни. Фильм или песня могут иметь один или несколько жанров одновременно, и эти целевые лейблы не обязательно должны быть взаимоисключающими.

Мотивация

Вы наверняка сталкивались с StackOverflow. Вы когда-нибудь задумывались о том, как эти релевантные теги предлагаются, когда вы задаете вопрос на этой платформе? Это типичный вариант использования классификации с несколькими метками.

Вот демонстрация

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

Это будет серия из 5 частей. Это самый первый. В этой части мы собираемся изучить наши данные и провести анализ данных. Звучит интересно?. Но где данные?

Мы собираемся использовать StackSample: 10% вопросов и ответов о переполнении стека.

Начнем с импорта numpy и pandas

numpy: - NumPy - это фундаментальный пакет для научных вычислений с Python.

панды: - Он используется для обработки и анализа данных. В частности, он предлагает структуры данных и операции для управления числовыми таблицами и временными рядами.

Output:-
[‘Questions.csv’, ‘Tags.csv’, ‘Answers.csv’]

Загрузите набор данных: -

Здесь мы используем функцию панд read_csv для загрузки наших данных во фрейм данных.

DataFrame - это таблица или структура, подобная двумерному массиву, в которой каждый столбец содержит значения одной переменной, а каждая строка содержит один набор значений из каждого столбца.

Заглянем во фрейм данных вопроса.

  • Вопросы содержат заголовок, текст, дату создания, дату закрытия (если применимо), оценку и идентификатор владельца для всех не удаленных вопросов о переполнении стека, идентификатор которых кратен 10.
ques.head()

так выглядит фрейм данных ответа.

  • Ответы содержат текст, дату создания, оценку и идентификатор владельца для каждого из ответов на эти вопросы. Столбец ParentId ссылается на таблицу вопросов.

и фрейм данных тегов

  • Теги содержат теги по каждому из этих вопросов.

Посмотрим, сколько у нас вопросов, ответов и тегов.

Атрибут shape возвращает размер фрейма данных. В нашем случае это 2-мерное измерение, где первое число представляет, сколько записей у нас есть, а второе число представляет свойства каждой записи.

Ques shape:  (1264216, 7)
Ans shape:  (2014516, 6)
Tags shape:  (3750994, 2)

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

График распределения идентификаторов вопросов по сравнению с их количеством ответов. Для построения этого графика мы будем использовать matplotlib

matplotlib: - Matplotlib - замечательная библиотека визуализации на Python для 2D-графиков массивов.

Счетчик - это дочерний класс dict, который, как следует из названия, подсчитывает хешируемые объекты. По сути, он хранит элементы как словарные ключи, а их количество как словарные значения:

График распределения количества ответов и количества вопросов

График распределения количества тегов и количества вопросов

Давайте посмотрим, какие теги самые популярные в StackOverflow.

Давайте рассмотрим набор данных вопросов и посмотрим, как тенденция размещения вопросов на платформе меняется с течением времени.

Мы собираемся ежемесячно пересчитывать выборку набора данных вопроса, и для этого нам нужно переиндексировать наши данные на основе CreationDate вопроса.

Функция Pandas dataframe.resample() в основном используется для данных временных рядов.
Временные ряды - это ряды точек данных, проиндексированных (или перечисленных или графически отображенных) во временном порядке.

Как мы знаем, вопросу может быть присвоено более одного тега. В наборе данных тегов поле «Id» представляет идентификатор вопроса, а «Tag» - присвоенный ему тег.

Чтобы увидеть все теги, назначенные каждому вопросу, давайте сгруппируем эти теги по полю «Id» и объединим эти теги с помощью символа пробела. И после их группировки нам нужно сбросить индекс набора данных тегов.

Фильтрация набора данных вопроса

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

Теперь оставим только те вопросы, у которых Score больше или равен 5, и удалим ненужные столбцы. Это будет служить двум целям.

1-й: - Нам не придется отвечать на множество вопросов.

2-й: - Тренировать нашу модель будем только по качественным вопросам.

Вы слышали это миллионы раз. не так ли?

Мусор на входе, мусор на выходе (GIGO)
Программа дает неточные результаты из-за предоставленных неточных данных, потому что компьютер всегда будет пытаться обработать предоставленные ему данные. Другими словами, качество вывода системы обычно не может быть лучше, чем качество вводимых данных.

Просто чтобы убедиться, есть ли в нашем наборе данных ny пустая или повторяющаяся запись.

isNull
Id       0
Score    0
Title    0
Body     0
dtype: int64
isDuplicate
0

Для дальнейшей обработки данных мы собираемся объединить фрейм данных вопросов с фреймом данных тегов на основе "Id"

На этом пока все.

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

Сколько хлопков заслуживает эта статья?

Если вам понравилась эта статья, не стесняйтесь хлопать много раз (вы знаете, что хотите!) или поделитесь с другом. Есть лимит в 50 аплодисментов, на которые вы можете дать историю… постарайтесь не превышать :) 💥БУМ! Я хочу написать больше об этом.

Говоря о которых…

Если мне удалось удержать ваше внимание на этом моменте, оставьте комментарий, описывающий, как этот пост повлиял на вас, и на какие еще темы о написании на Medium вы хотели бы получить ответы.