Часть 1 из серии о реферировании текста с помощью методов машинного обучения

Во время выполнения моего краеугольного проекта в программе Machine Learning Engineer Nanodegree в Udacity я довольно глубоко изучил проблему реферирования текста. По этой причине я собираюсь написать об этом серию статей, от определения проблемы до некоторых подходов к ее решению, показывая некоторые базовые реализации и алгоритмы, а также описывая и тестируя некоторые более продвинутые методы. . Это займет у меня несколько сообщений в течение следующих нескольких недель или месяцев.
Я также воспользуюсь преимуществами мощных инструментов, таких как контейнеры Amazon SageMaker, настройка гиперпараметров, преобразователи и журналы Веса и смещения, чтобы показать вам как использовать их для улучшения и оценки производительности моделей.

Вкратце, в некоторых публикациях будут представлены такие концепции, как:

  • E исследования D ata A анализа текста, чтобы глубже погрузиться в особенности текста и распределение слов в нем.
  • Извлекающие решения: использование простой функции из популярной библиотеки gensim и алгоритма кластеризации предложений.
  • Абстрактное обобщение с использованием LSTM и механизма внимания
  • Сеть Pointer Generation, расширение от кодировщика-декодера, смесь экстрактивных и абстрактных алгоритмов.
  • Модель Transformer, расширяющая концепцию внимания до исходного решения.
  • Продвинутые модели трансформаторов, такие как T5 или BART из фантастической библиотеки, трансформаторы от Huggingface.
  • Так далее,…

Постановка задачи

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

Но, что такое резюме? Это «текст, созданный из одного или нескольких текстов, который содержит значительную часть информации в исходном тексте (ах), и это не более половины исходного текста. Резюмирование явно включает в себя оба эти еще плохо изученных процесса и добавляет третий (сжатие, абстракцию, обобщение) » [3]. Или, как описано в [4], резюмирование текста - это «процесс извлечения наиболее важной информации из источника (или источников) для создания сокращенной версии для конкретного пользователя (или пользователя) и задачи (или задач»). ).

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

Исследовательский анализ данных

Мы можем прочитать это определение концепции в Википедии: «Исследовательский анализ данных (EDA) - это подход к анализу наборов данных для обобщения их основных характеристик, часто с использованием визуальных методов». Этот шаг абсолютно необходим и имеет огромное влияние на конечный результат модели, этот анализ скажет нам, какой тип преобразования нам нужно применить к нашим данным.

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

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

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

Определение данных

Для этой задачи резюмирования текста мы будем использовать набор данных из Kaggle, который называется Inshorts News Data. Inshorts - это новостная служба, которая предоставляет короткие сводки новостей со всего Интернета, извлекая новостную статью из индуистской, индийской раз и Хранитель. Этот набор данных содержит заголовки и сводку новостей, около 55 000, а также их источник.

Пример:

  • Текст: «Телеведущий Арнаб Госвами сказал, что ему сказали, что он не сможет участвовать в программе за два дня до выхода из Times Now. «18 ноября был моим последним днем, мне не разрешили войти в мою студию», - добавил Госвами. «Когда вы строите заведение, и вам не разрешают войти в собственную студию, вам грустно, - сказал далее журналист».
  • Краткое описание: «Мне запретили входить в мою студию в Times Now: Arnab»

Код для загрузки и подготовки набора данных:

Описательная статистика

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

Мы можем заметить, что есть две переменные, описывающие текст новости:

  • Short: это самая длинная переменная, содержащая текст новости
  • Headline: это краткое изложение или основные моменты, состоящие из одного или двух

В нашем проекте мы будем работать с переменной Short как с текстовой функцией, а переменная Headline будет нашей целевой сводкой.

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

Изучение соответствующих функций в данных

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

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

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

Затем мы вычисляем эти функции в нашем наборе данных (фрейм данных Pandas, содержащий исходный текст и целевую сводку).

Проанализировать распределение функций по текстовой переменной

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

Резюмируя:

  • 3 предложения, 60 слов и 311 символов в строке - это средние значения, которые очень близки к медианным значениям.
  • Стандартные отклонения довольно небольшие.
  • Мы наблюдаем, что максимальное количество предложений (9) и символов (более 400) далеки от средних значений, что указывает на то, что есть некоторые регистры со значениями вне диапазона или выбросами.

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

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

Выше мы построили гистограммы наших функций. Количество строк со значениями выбросов невелико, мы можем рассмотреть возможность их удаления, но это не выглядит большим. Количество слов выглядит как левое перекошенное распределение, 75% строк находятся в диапазоне 55–60 слов, а количество символов является нормальным распределением. Мы не приводим странных примеров или распределений данных.

Проанализировать распределение функций по итоговой переменной

Повторяем предыдущий шаг для поля сводки:

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

  • Распределение слов и предложений близко к среднему значению, а стандартное отклонение относительно невелико.
  • Большинство резюме состоит из одного предложения, а количество слов очень близко к 7–8.
  • Количество символов в основном от 40 до 50.
  • Есть только 1 или 2 записи с большими значениями. Выбросы - не проблема, мы можем их удалить.

Категории и теги POS слов

Еще одна группа функций, которые мы можем проверить в текстовых данных, - это теги Part-Of-Speech:

Процесс классификации слов по частям речи и их соответствующей маркировки известен как тегирование части речи, POS-тегирование или просто тегирование. Части речи также известны как классы слов или лексические категории.

Обработка естественного языка с помощью Python, С. Берд, Э. Кляйн и Э. Лопер [1]

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

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

Затем мы можем построить гистограмму, чтобы проверить распределение:

Проверить на неизвестные слова

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

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

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

  • В наших исходных текстах среднее значение составляет 0,8, а 75% предложений ниже 1. Мы можем сделать вывод, что это не проблема.
  • В случае итоговой переменной неизвестные слова отсутствуют.
  • Есть 1 или 2 примера с неизвестными словами, мы можем удалить их или просто проигнорировать.

Использование игнорируемых слов и знаков препинания

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

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

Цифры нормальные, не показывают скрытых или неожиданных узоров

Наиболее частые термины и облака слов

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

«Wordcloud (или облако тегов) - это визуальное представление текстовых данных. Он отображает список слов и важность каждого слова, указанное размером или цветом шрифта (чем больше, тем чаще). Этот формат полезен для быстрого восприятия наиболее релевантных терминов в документе или наборе документов ».

Википедия

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

Создайте облако для исходных текстов:

Как и следовало ожидать, они оба содержат почти одни и те же слова: индия, первый, индия, день, время. Есть некоторые исключения, но они оба находятся в одном домене.

Тематическое моделирование

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

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

Есть несколько существующих алгоритмов, которые вы можете использовать для моделирования темы. Наиболее распространенными из них являются скрытый семантический анализ (LSA / LSI), вероятностный скрытый семантический анализ (pLSA) и скрытое распределение Дирихле (LDA).

[5], Тематическое моделирование в Python: скрытое распределение Дирихле (LDA) »Шашанка Кападиа.

Но сначала нам нужно преобразовать наши текстовые данные в формат, который будет служить входными данными для модели LDA. Мы преобразуем текст в векторное представление, в котором каждое слово заменяется целым числом. В этом случае мы применим метод CountVectorized. Метод Count Vectorized заменяет каждое слово на количество вхождений слова в нашем корпусе, группе текстов. Результатом является матрица терминов документа, в которой наиболее часто используемым словам присваиваются более высокие значения.

Библиотека Scikit-learn предоставляет функцию для вычисления LDA и возврата списка с темой и включенными токенами. В нашем примере мы определяем 10 тем для изучения и показываем в каждой из них 8 основных элементов или слов:

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

Визуализация результатов тематического моделирования

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

Показатель релевантности параметра λ различает слова, относящиеся исключительно к теме (ближе к 0), и слова с высокой вероятностью включения в выбранную тему (ближе к 1). Игра с этим параметром может помочь нам присвоить теме «имя».

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

Весь код общедоступен в Jupyter Notebook в моем репозитории на github.

Я надеюсь, что этот пост и объясненные концепции будут для вас интересными и полезными.

использованная литература

[1] - Обработка естественного языка с помощью Python, авторы Стивен Берд, Юэн Кляйн и Эдвард Лопер, 2019.

[3] - Хови, Э. Х. Автоматическое обобщение текста. В издании Р. Миткова, Оксфордский справочник по компьютерной лингвистике, глава 32, страницы 583–598. Издательство Оксфордского университета, 2005 г.

[4] - Мани И., Хаус Д., Кляйн Г. и др. Оценка обобщения текста TIPSTER SUMMAC. В Трудах EACL, 1999.

[5] - Шашанк Кападиа, Тематическое моделирование в Python: скрытое распределение Дирихле (LDA) », средний пост, 2019 г.

[6] - Сьюзан Ли, Тематическое моделирование в Python с помощью NLTK и Gensim, 2018 средний пост