Drive your career as React Developer with Symphony Solutions!
×Закрыть

Гид по NLP-инструментам 2020

Меня зовут Игорь Кауфман, я руковожу направлением ML&DS в компании DataArt. В прошлом году мы основательно поработали над проектами, используя самые современные NLP-техники. Если вам, как и мне, интересно, что сейчас происходит в мире процессинга текстов, то эта статья — краткий обзор состояния дел в виде демо наиболее популярных на текущий момент инструментов.

Я не ставлю перед собой задачи охватить все возможности, которые предоставляют перечисленные инструменты, или погрузиться в технические детали их реализации; а собираюсь описать, что из достижений NLP уже сейчас можно «из коробки» использовать в своих решениях.

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

BERT: понять текст

BERT — предобученная модель от Google, созданная с целью лучшего понимания того, что именно ищут люди. В отличие от старых бесконтекстных подходов, таких как word2vec или GloVe, BERT учитывает окружающие слова, которые, очевидно, могут повлиять на смысл самого слова.

Впервые эта модель была опубликована в 2018 году, а с декабря 2019-го Google официально использует BERT в поиске, в частности превью наиболее вероятного ответа на запрос — это его работа.

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

Попробуйте скормить BERT свой абзац текста и задать к нему вопросы.

GPT-2: создание текстов

GPT-2 — так называемая модель-трансформер, была впервые выпущена OpenAI в феврале 2019-го. Ее основная цель — предсказать следующее слово, учитывая набранный ранее текст.

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

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

Кроме английской версии, есть обученная на работах Достоевского, Толстого, Пушкина, Булгакова, Гоголя и Пелевина версия на русском.

Поиграться с GPT-2 и XLNet можно и здесь: Write With Transformer.

SpaCy: NLP идет в продакшен

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

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

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

Давайте посмотрим, что окажется ближе всего к «Кевину Спейси». Для 2015 года мы получим имена других голливудских актеров, а вот для 2019-го уже видим в первую очередь людей, связанных темой #metoo, — контекст изменился.

Распознавание именованных сущностей (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 года. Предполагаю, что в ближайшие год-два нас ждет еще более мощный скачок, теперь уже в плане качества их работы. Ну а для нас главное — не отстать от прогресса и уметь использовать их в своих решениях.

LinkedIn

9 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Ожидал увидеть Azure Cognitive Services, но почему-то не нашел упоминаниях этих сервисов в обзоре.

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

а если есть задача писать саммари книги допустим, какой лучше подойдет инструмент?

Для книги будет плохо работать любой — слишком большой объем текста. Но если гипотетически рассматривать, то нужна абстрактная суммаризация, попробуйте SummAE от гугл: github.com/...​search/tree/master/summae

У них же недавно вышел PEGASUS, который state-of-the-art, но готового кода пока не видел. Плюс все сильно зависит от того, на чем тренировали — если на новостях, например, то результат будет «желтушным».

Отличный обзор, спасибо, в закладки!
Пользуясь возможностью хочу спросить, какие бы ты использовал инструменты для задачи, когда нужно парсить вопросы пользователя на разные тематики в поиске совета, типа — какой цвет мне сегодня надеть, Лондон или Нью Йорк, пойти ли мне с ней на свидание (англ.)
Простыми методами у меня 60-70% распознавание тематики на aidecider.com и все адаптировано что бы не грузить ресурсы так как это МВП пока что, всегда интересно услышать совет профи

Спасибо! Если честно, не совсем понял конечную задачу. Если где-то есть ответ на этот вопрос, то BERT создан как раз с целью нахождения ответа в тексте.
Если задача каким-то образом распарсить сами вопросы, то важно понять какие структуры мы в них ищем. Соответственно, может быть простой NER (как в примере «Лондон или Нью Йорк» — найти географические локации), так и может быть целая цепочка процессинга вроде Spacy для нахождения объекта в предложении (SVO), потом dependency parsing и noun phrases из Berkeley Parser...

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

задача — NLU — понять о каком именно топике спрашивает пользователь, релокация, мода, сошиал лайф, инвестиции и тд
На основании топика — использовать объекты из текста что бы предоставить ответ

Дякую за цікаву статтю.
Чи порівнювали ви BERT з doc2vec для семантичної близкості текстів?

Андрей, спасибо за вопрос. Если коротко, то не сравнивали. Отчасти по той причине, что у них несколько разное назначение.

Вот хороший комментарий, описывающий почему BERT не предназначен для векторизации документов целиком: github.com/...​32#issuecomment-462762704

Вот еще есть статья, которая описывает различные варианты эмбеддинга документов, в частности есть workaround с бертом: towardsdatascience.com/...​hniques-fed3e7a6a25d#bbe8

На рівні речень значить можна. Замість тексту, спробую взяти його заголовок.

Подписаться на комментарии