Гид по NLP-инструментам 2020
Меня зовут Игорь Кауфман, я руковожу направлением ML&DS в компании DataArt. В прошлом году мы основательно поработали над проектами, используя самые современные NLP-техники. Если вам, как и мне, интересно, что сейчас происходит в мире процессинга текстов, то эта статья — краткий обзор состояния дел в виде демо наиболее популярных на текущий момент инструментов.
Я не ставлю перед собой задачи охватить все возможности, которые предоставляют перечисленные инструменты, или погрузиться в технические детали их реализации; а собираюсь описать, что из достижений NLP уже сейчас можно «из коробки» использовать в своих решениях.
Сам я довольно часто использую эти демо для быстрой проверки идей.
BERT: понять текст
BERT — предобученная модель от Google, созданная с целью лучшего понимания того, что именно ищут люди. В отличие от старых бесконтекстных подходов, таких как word2vec или GloVe, BERT учитывает окружающие слова, которые, очевидно, могут повлиять на смысл самого слова.
Впервые эта модель была опубликована в 2018 году, а с декабря
Мы использовали BERT, например, чтобы из пространного описания деятельности компании выделить короткий ответ на вопросы, что эта компания делает, какой сервис предоставляет.
Попробуйте скормить BERT свой абзац текста и задать к нему вопросы.
GPT-2: создание текстов
GPT-2 — так называемая модель-трансформер, была впервые выпущена OpenAI в феврале
До конца 2019 года планировалось публиковались только неполные версии GPT-2 из опасения, что их используют для распространения фальшивых новостей, спама и дезинформации. Однако уже в ноябре 2019 года OpenAI заявила, что «никаких убедительных доказательств неправомерного использования замечено не было», и выпустила полную версию модели.
Попробуйте написать начало текста — модель сама его дополнит, иногда получается забавно.
Кроме английской версии, есть обученная на работах Достоевского, Толстого, Пушкина, Булгакова, Гоголя и Пелевина версия на русском.
Поиграться с GPT-2 и XLNet можно и здесь: Write With Transformer.
SpaCy: NLP идет в продакшен
SpaCy — одна из наиболее популярных опенсорсных NLP-библиотек. Написанная на Cython, она очень хорошо оптимизирована и предназначена для использования в реальных проектах. Рассмотрим на примерах некоторые из ее возможностей.
Токенизация текста — говоря простыми словами, библиотека позволяет разбить текст на смысловые сегменты: слова, артикли, пунктуацию. Позже эти сегменты — вместе или по отдельности — можно представить в виде векторов для последующего сравнения. В качестве простого примера слова «кот» и «пушистый» в многомерном векторном пространстве окажутся ближе, чем тот же «кот» и «космический корабль».
Мне очень нравится пример, обученный на комментариях Reddit, который показывает наиболее близкие к введенным словам понятия.
Давайте посмотрим, что окажется ближе всего к «Кевину Спейси». Для 2015 года мы получим имена других голливудских актеров, а вот для
Распознавание именованных сущностей (Named Entity Recognition, NER) с предобученными классами (люди, организации, даты, локации и т. д.). Кроме того, вы можете натренировать SpaCy, используя свои собственные классы (например, адреса, имена контрагентов в контрактах, ID товаров и т. д.) — все, что подходит под какой-то объяснимый шаблон.
Попробовать SpaCy, используя стандартные классы, можно здесь.
Распознавание зависимостей в предложениях — помогает строить правила в случае, если нужно извлечь связанные структуры. Ниже будет пример Berkeley Neural Parser, их бывает удобно использовать в связке.
К примеру, мы доставали объекты из предложений (Subject-Verb-Object), а затем с помощью Dependency Parsing находили описывающие их слова до определенной глубины, чтобы получить осмысленное словосочетание.
Демо — здесь.
AllenNLP: популярная альтернатива
Мощный инструмент для прототипирования с хорошими возможностями препроцессинга текста. AllenNLP в меньшей степени оптимизирован для использования в продакшене, чем SpaCy, но широко применяется в исследованиях. К тому же у него под капотом находится PyTorch — очень популярный deep learning фреймворк, позволяющий кастомизировать модели гораздо более гибко, чем SpaCy.
Давайте посмотрим на Textual Entailment (TE): проанализируем несколько предложений и увидим, есть ли взаимосвязь между фактами из второго и утверждениями из первого.
TE работает не всегда хорошо, но выявление такого рода зависимостей — одна из фундаментальных задач разговорного ИИ.
Суммаризация текста: TL;DR
Суммаризация текста применяется в массе случаев, как то: мониторинг медиа, краткое содержание новостей, чат-боты, анализ финансовых документов, контрактов, патентов и так далее.
Существует два подхода к этой задаче: суммаризация на основе извлечения ключевых предложений (extraction-based summarization) и суммаризация с перефразированием основных тезисов (abstraction-based summarization). Извлекать ключевые части из текста машине, разумеется, проще, чем перефразировать его, поэтому абстрактная суммаризация применяется чаще всего там, где есть огромные объемы типичных данных и, соответственно, база для тренировки моделей, например в новостях.
Суммаризация extraction-based оставляет в сокращенной версии только самые важные слова/предложения, которые отражают, по мнению алгоритма, содержание текста в целом.
В этом демо используется именно такой подход, достаточно указать количество предложений в конечном тексте.
Предыдущая моя статья была длинной (вы можете найти ее здесь, а дополненный перевод был на DOU), поэтому я решил сократить ее до двух предложений. Вот что у меня получилось:
For the past three years, I have led Machine Learning and Data Science at DataArt, researching the main points of different businesses, proposing technological solutions and carrying out implementation.
Cloud providers are rapidly developing ML services, treading the same path that Big Data services did before them.
Ну окей, давайте посмотрим на клауды! :)
Еще демо суммаризации: Summarizr, Online Text Summary Generator — Free Automatic Text Summarization Tool, Text Analysis API Demo | AYLIEN.
Google AutoML: Natural Language
Google, вероятно, обрабатывает самые большие в мире объемы текстовых данных. Наверное, поэтому Google AutoML, как правило, дает из коробки результат лучше, чем опенсорсные библиотеки (например, если вам нужен NER). Кроме того, если вас интересуют кастомные поля, то сначала модели нужно показать примеры таких полей — проаннотированные данные. Для аннотаций у Google есть удобный интерфейс (в отличие, например, от AWS на текущий момент).
Чтобы не повторяться, рассмотрим пример анализа тональности текста, где каждое предложение и весь текст в целом оцениваются с точки зрения позитивной или негативной коннотации.
Как видно, «машина разбилась» — плохо, «все живы» — хорошо.
IBM Watson
IBM — следующий сильный игрок на рынке NLP. Помимо возможностей аналогичных Google AutoML, Watson позволяет пользователю оценить эмоциональные характеристики текста. Давайте опробуем эту функцию на примере:
«You know,» said Arthur, «it’s at times like this when I’m trapped in a Vogon airlock with a man from Betelgeuse, and about to die of asphyxiation in deep space that I really wish I’d listened to what my mother told me when I was young.»
«Why, what did she tell you?»
«I don’t know, I didn’t listen.»
Watson говорит, что фрагмент на 72% Sad, и, кроме того, включает во вкладку Concepts пункт «Автостопом по галактике», откуда и взят фрагмент.
Что касается Microsoft Azure Text Analytics, то его демо можно найти здесь. Демо же Amazon Comprehend требует регистрации и довольно ограниченно с точки зрения функциональности.
Еще несколько инструментов, достойных внимания...
HuggingFace: очень полезен в продакшене
HuggingFace упрощает использование различных NLP-моделей в проектах, дообучая их и упаковывая в легко подключаемые библиотеки. В частности, когда нужно понять, к какой сущности относится часть предложения, модуль co-reference resolution — одно из самых популярных на рынке решений (state-of-the-art на текущий момент).
Berkley Neural Parser: парсер предложений
Парсер, разработанный в Berkley, разбивает синтаксическую структуру предложений на вложенные подфразы.
Он позволяет легко извлекать информацию из типичных синтаксических конструкций (например, «мне интересна информация, содержащаяся в Noun Phrases»). Скомбинировав Berkley Parser с Dependency Parsing (например, из SpaCy), можно доставать более сложные и интересные конструкции.
Кроме того, интересны следующие библиотеки: NLTK, Stanford CoreNLP и TextRazor. Их часто используют в учебных целях, часть из них лежит в основе упомянутых выше инструментов.
Подводя итоги
Мир NLP-инструментов динамично развивается, и практически все инструменты, описанные в этой статье, появились или вышли в продакшен в течение 2019 года. Предполагаю, что в ближайшие год-два нас ждет еще более мощный скачок, теперь уже в плане качества их работы. Ну а для нас главное — не отстать от прогресса и уметь использовать их в своих решениях.