Содержание статьи: оценка текста, NLP, word2vec, подобие текста

Вы когда-нибудь сталкивались с опубликованной статьей и испытывали чувство «дежавю» от того, что уже прочитали статью или очень похожую статью? Reach plc выпускает более 60 национальных, региональных и местных новостных изданий по всей Великобритании. Поэтому полезно предоставить инструмент для автоматической оценки сходства этих опубликованных статей. Это идеальная задача для обработки естественного языка. НЛП в действии!

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

К сожалению, машины не понимают текст - или нет?

НЛП - интересная ветвь машинного обучения, в которой машина выполняет операции с текстом, которые пытаются воспроизвести то, как человек читает и понимает текст. Задачи, которые мы можем решить с помощью НЛП, включают…

  • Извлечение сущностей (имена людей или организаций)
  • Отвечать на вопросы так, как обычно ожидается
  • Классифицируйте статьи по категориям (спорт, политика, экономика…)
  • Классифицируйте текст на основе настроения или намерения

Соревнование

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

Сложность этой проблемы можно свести к следующим шагам, на которые я буду ссылаться в этой статье:

  1. Очистить данные статьи
  2. Отфильтруйте статьи до подмножества, включая только релевантные статьи
  3. Обучите модель оценивать сходство статей и абзацев
  4. Храните наши результаты в базе данных
  5. Обеспечьте пользовательский интерфейс для быстрого доступа и оценки результатов

И общая архитектура для решения этой проблемы включает следующие модули:

  • Лямбда-сервис для приема статей по мере их создания.
  • ElasticSearch для хранения и предварительной фильтрации большинства похожих статей.
  • Модель НЛП обучена на выбранном подмножестве статей
  • PostgreSQL для хранения оценок документа и абзацев
  • Веб-приложение для обеспечения интерфейса

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

Вернемся к основам

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

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

  • Удалить специальные символы
  • Удалить знаки препинания
  • Удалить стоп-слова
  • Применить нижний регистр
  • Лемматизация или стемпинг
  • И так далее…

Что сравнивать?

Нам интересно анализировать новые статьи и сравнивать их с возможными «оригиналами», но мы не хотим тратить ресурсы на сравнение совершенно разных статей. Вот почему мы создаем фильтр (шаг 2), чтобы извлекать только статьи, показывающие определенную степень сходства.

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

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

Улучшение по сравнению с TF-IDF - Okapi BM25, где BM означает Лучшее соответствие. Этот алгоритм является результатом применения вероятностного поиска информации. Это может быть отдельная публикация, поэтому, чтобы быть кратким, Okapi BM25 обеспечивает более надежную метрику оценки сходства между документами. И это наша конечная цель - понять, насколько два или более документов похожи в нашем инструменте сравнения.

Стоит отметить, что эти фильтры уже встроены во многие базы данных. Мы использовали ElasticSearch, где мы можем выбрать сходство, которое мы хотим использовать (BM25, который является значением по умолчанию, классический, логический и т. Д.), И мы использовали косинусное сходство для этой задачи.

В следующем коде для определения индекса ElasticSearch мы устанавливаем similarity на уровне поля при первом создании полей. article_body использует BM25 по умолчанию, а is_published использует логическое подобие:

PUT selected_index
{
  "mappings": {
    "properties": {
      "article_body": { 
        "type": "text"
      },
      "is_published": {
        "type": "text",
        "similarity": "boolean" 
      }
    }
  }
}

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

Введите вложения

Чтобы получить более детальное сравнение, мы применяем вложения слов. За последние несколько лет встраивание слов стало одной из самых сильных тенденций в НЛП. Используя вложения слов, мы создаем числовое представление каждого абзаца и сравниваем сходство во всех абзацах. Это работает, потому что векторы, полученные с использованием вложений слов, коррелируют с семантическим сходством слов.

Для создания встраиваемых слов доступно несколько библиотек, а также можно использовать предварительно обученные модели. Некоторые из наиболее известных библиотек Python включают в себя:

  • Word2Vec
  • Перчатка
  • Генсим
  • PyDSM
  • DISSECT

Если вы раньше не слышали о встраиваниях, мы можем вернуться к 1990-м годам, когда уже использовались модели векторного пространства и были разработаны различные модели для оценки непрерывных представлений слов. Двумя примерами этого являются скрытый семантический анализ и скрытое распределение Дирихле. Позже в статьях используется фраза «распределенные представления слов». Они обучаются в модели нейронной сети вместе с параметрами модели.

Наконец, встраивание слов стало чрезвычайно популярным благодаря упомянутым ранее библиотекам, таким как word2vec (2013 г.) и GloVe (2014 г.), которые позволяют создавать и использовать предварительно обученные модели относительно простые.

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

Наконец, мы запускаем обучение с выбранными параметрами (скорость обучения, количество циклов / эпох и т. Д.)

def train_docarticle_bodyvec_model(corpus):
    
    model = Doc2Vec(vector_size=VEC_SIZE, 
                    alpha=ALPHA, 
                    min_alpha=MIN_ALPHA, 
                    min_count=1, 
                    dm=1)
    LOG.debug("Building vocabulary + training doc2vec...")

    model.build_vocab(corpus)

    for epoch in range(MAX_EPOCHS):
        model.train(
            corpus,
            total_examples=model.corpus_count,
            epochs=model.epochs)
        model.alpha -= DECREASE_RATE   # decrease the learning rate
        model.min_alpha = model.alpha  # fix the learning rate
    
    return model

После обучения модели мы вызываем model.docvecs.most_similar(ref), указывая ссылку на абзац, для которого нам нужны оценки сходства, и сохраняем эту информацию в базе данных.

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

Визуализация

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

Этот инструмент обеспечивает сравнение и оценки статей, а также интерфейс для сравнения статей предложение за предложением.

Будущая работа

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

  • "Перчатка"
  • БЕРТ
  • RoBERTa
  • АЛЬБЕРТ

Пойдя еще дальше с встраиванием, можно использовать более совершенных преемников word2vec. Если вы следили за новостями о НЛП в последние пару лет, вы, вероятно, слышали о BERT (двунаправленные представления кодировщика от трансформаторов), разработанном в Google в 2018 году и являющемся прямым потомком GPT ( Обобщенные языковые модели). BERT был значительным изменением по сравнению с предыдущими моделями, поскольку он был первым глубоко двунаправленным, неконтролируемым языковым представлением.

И одна из последних разработок в НЛП - ALBERT (облегченный BERT для самостоятельного изучения языковых представлений), который повышает эффективность параметров за счет совместного использования всех параметров на всех уровнях.

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

Как использовать слово вложения? Благодаря им мы можем переводить предложения для сравнения в числовое представление, которое затем используется для сравнения. Когда у нас есть вектор каждого предложения, мы применяем метрику сходства, чтобы измерить, насколько похожи эти векторы:

  • Косинусное подобие, которое интерпретируется как косинус угла между двумя векторами и инвариантно к масштабу векторов.
  • Сходство Пирсона, которое похоже на косинус, но инвариантно как к сдвигам, так и к масштабу векторов

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

Чтобы иметь возможность сравнивать предложения разной длины, один из классических способов - получить среднее значение вложений токенов (слов) в этом предложении. Таким образом, длина конечного вектора всегда одинакова, и мы можем сравнивать их, используя косинусное подобие. С другой стороны, стоит упомянуть, что если мы измеряем разницу в углах векторов, то величина не имеет значения, поэтому усреднение - это просто дополнительное вычисление, которого мы можем избежать.

Опять же, некоторое тестирование предоставит бесценную информацию о том, какую метрику лучше всего применить в вашем конкретном приложении.

Извлеченные уроки

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

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

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

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

Индекс Жаккара: измеряет количество общих слов среди всех слов.

Коэффициент перекрытия:, также известный как коэффициент Шимкевича – Симпсона, определяется как размер объединения набора A и набора B сверх размера меньшего набора между А и Б.

Другие показатели для сравнения сходства включают коэффициент Соренсена – Дайса, индекс Тверски, расстояние Танимото и расстояние между мешками. Все эти метрики были разработаны для решения конкретных задач. Рассмотрение всех из них не является целью этого поста, но хорошо помнить, что уже доступен широкий спектр инструментов.

Спасибо Электре Папазоглу и Джейми Хуперу за их работу и вклад как в проект дедупликации, так и за рецензирование этой статьи.