Недавно я столкнулся с очень интересной проблемой, поэтому решил поделиться со всеми вами. Проблема заключалась в том, чтобы определить, являются ли два вопроса дубликатами или нет. Например, возьмем эти два вопроса: «Сколько вам лет?» и «Сколько вам лет ? ». Хотя в этих вопросах нет общего слова, но они имеют одну и ту же цель.

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

Пример использования в бизнесе

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

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

Несколько дней назад я также столкнулся с еще одной интересной проблемой Quora, связанной с обнаружением токсичного контента из вопросов, которые могут помочь обеспечить безопасность онлайн-платформ. Скоро поработаю над этой проблемой!

Набор данных

Возвращаясь к задаче по дублированию вопросов - я использовал набор данных, предоставленный Quora. Набор данных доступен на Kaggle.

Чтобы дать вам краткое введение в набор данных, в нем есть такие поля, как:

  1. id: общий идентификатор, назначаемый для каждого образца.
  2. qid1: уникальный номер для определения вопроса 1.
  3. qid2: уникальный номер для определения вопроса 2.
  4. question1: Фактическое содержание вопроса 1.
  5. question2: Фактическое содержание вопроса 2.
  6. is_duplicate: если вопросы имеют одинаковое значение, то 1, иначе 0

Используя сочетание обработки естественного языка и глубокого обучения, мы увидим, как далеко мы можем зайти с помощью этого подхода. Поскольку это обучение с учителем, нам нужен набор функций и целевая переменная для обучения нашей модели. Здесь мы можем игнорировать все столбцы, кроме «question1», «question2» и «is_duplicate».

Другой традиционный подход, такой как Tf-idf, вы можете попробовать простое решение с помощью sklearn, и оно будет работать нормально. Где вы обычно видите эти шаги:

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

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

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

  1. Анализ данных.

Проверка первых нескольких выборок данных.

Поиск информации, которая может быть полезна при обобщении данных.

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

2. Создание встраивания.

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

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

Продвигаясь вперед с реализацией, вам просто нужно передать строку, и вы получите вложение формы 512, которое вы можете напрямую передать в качестве входных данных в свой алгоритм. Здесь я использовал нейронную сеть.

3. Создание нейронной сети.

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

  1. Входной уровень: - Использование question1 и question2 для обработки входных данных модели.
  2. Лямбда-слой: - Используя лямбда-слой керасов, я применил встраивание каждого ввода перед его передачей в модель.
  3. Слой конкатенации: - Конкатенация как вложения вопрос1, так и вопроса2
  4. Пакетная нормализация: - Поскольку распределение входных данных каждого слоя изменяется во время обучения, поскольку меняются параметры предыдущих слоев, я использовал для нормализации входных данных на каждом слое.
  5. Плотный слой: - Передача ввода на полностью связанный слой
  6. Слой исключения: - добавление этого слоя к предыдущему скрытому слою, чтобы избежать переобучения.

4. Обучение и прогнозирование

После построения модели мы готовы обучать нашу модель. Небольшая подготовка данных вам не сильно повредит!

  1. Разделение функций (вопрос1 и вопрос2) и цели (is_duplicate) на 80–20%.
  2. Попадание в список.
  3. Создание одной горячей кодировки целевой переменной путем преобразования категориальной переменной в фиктивные переменные. Простой pandas.get_dummies сделает это за один раз.
  4. Инициализация глобальных переменных с помощью концентратора тензорного потока.
  5. Наконец, обучение модели путем сохранения весов после каждой эпохи.

После прохождения 20 эпох размера 512 я был очень рад сообщить, что мне удалось добиться большей точности, чем в статье Стэнфордского университета по тому же набору данных. Здесь бумага.

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

Я достиг точности обучения 88,24% и точности проверки 85,18%, что хорошо видно из этого графика точности. Максимальная точность, достигнутая в вышеупомянутой статье, составила всего 83,8%.

Чтобы предсказать цель вопросов, давайте попробуем задать несколько случайных тестовых вопросов.

Посмотрим, как выглядит прогноз…

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

Спасибо за терпение ... Хлопки (эхом)