Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Последние достижения в области глубокого обучения позволяют создавать приложения, с исключительной точностью распознающие текст и речь. Что в результате? Появляются чат-боты, ведущие диалог не хуже реальных людей, программы, эффективно подбирающие резюме под заданную вакансию, развивается превосходный предиктивный поиск, автоматически генерируются аннотации документов. Благодаря новым приемам и инструментам, таким как Keras и Tensorflow, сегодня возможно как никогда просто реализовать качественную обработку естественного языка (NLP). «Обработка естественного языка в действии» станет вашим руководством по созданию программ, способных распознавать и интерпретировать человеческий язык. В издании рассказано, как с помощью готовых пакетов на языке Python извлекать из текста смыслы и адекватно ими распоряжаться. В книге дается расширенная трактовка традиционных методов NLP, что позволит задействовать нейронные сети, современные алгоритмы глубокого обучения и генеративные приемы при решении реальных задач, таких как выявление дат и имен, составление текстов и ответов на неожиданные вопросы.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 764
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Научный редактор К. Русецкий
Переводчики И. Пальти, С. Черников
Технические редакторы Н. Гринчик, Е. Рафалюк-Бузовская
Литературные редакторы В. Байдук, Н. Гринчик, А. Дубейко, Е. Ковалева
Художники Н. Гринчик, В. Мостипан, Г. Синякина (Маклакова)
Корректоры Е. Павлович, Е. Рафалюк-Бузовская
Верстка Г. Блинов
Лейн Хобсон, Хапке Ханнес, Ховард Коул
Обработка естественного языка в действии. — СПб.: Питер, 2021.
ISBN 978-5-4461-1371-2
© ООО Издательство "Питер", 2021
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Впервые я встретила Ханнеса в 2006 году, когда мы поступили в аспирантуру на одной кафедре по разным специальностям. Он быстро стал известен своими работами, в которых совместно использовались методы машинного обучения и электротехники, а также своей решимостью сделать мир лучше. Последняя и направляла все проекты и компании, с которыми он сотрудничал, на протяжении его карьеры. Именно этот внутренний компас свел его с Хобсоном и Коулом, разделявшими эту страсть к проектам.
Их стремление использовать машинное обучение (ML) на благо людей убедило меня написать это предисловие. Схожее желание сделать мир лучше вело и меня саму на пути исследований в области ML. Моя дорога привела меня к разработке алгоритмов кратномасштабного моделирования (multi-resolution modeling) экологических данных о распределениях видов для их охраны и наблюдения за ними. С тех пор я была твердо настроена продолжать работать в сферах, где могла бы применить машинное обучение для улучшения жизни людей.
Неограниченная власть означает и неограниченную ответственность.
Вольтер(?)
Эти слова остаются справедливыми вне зависимости от того, кому приписать их — Вольтеру или дяде Бену, хотя, возможно, ныне можно их перефразировать: «Неограниченный доступ к данным означает и неограниченную ответственность». Мы доверяем свои данные различным компаниям в надежде, что они будут использованы для улучшения нашей жизни. Мы разрешаем просмотр наших писем для проверки орфографии; обрывки наших жизней в соцсетях изучаются и используются для отображения контекстной рекламы. Наши телефоны и бытовая техника откликаются на наши слова, иногда когда мы обращаемся и не к ним. Даже наши предпочтения при выборе новостей отслеживаются. Что же лежит в основе всех этих могущественных технологий? Ответ: обработка естественного языка (natural language processing, NLP).
В этой книге вы найдете как теорию, так и практические примеры, необходимые для того, чтобы не просто понимать внутренний механизм работы этих систем, но и начать создавать свои алгоритмы или модели. Базовые понятия теории вычислительной техники здесь изящно преобразуются в надежный фундамент для последующих подходов и методик. Авторы проводят читателя через четкое и изложенное ясным языком описание основных методик NLP, начиная с таких испытанных на практике методов, как TF-IDF, перед поверхностным, но глубоким (да, я скаламбурила) погружением в использование глубоких нейронных сетей для NLP.
Язык — фундамент нашей человеческой общности. Мы передаем друг другу не только факты, но и эмоции; с помощью языка мы получаем новые знания и строим взаимоотношения. У вас есть возможность обрести ясное понимание не только внутренних механизмов NLP, но и путей создания значимых систем, которые однажды могут сами познать человечество через наш язык. У технологии NLP — огромный потенциал как для злоупотреблений, так и для добрых дел. Авторы, делясь в этой книге своими знаниями, надеются склонить нас в сторону более светлого будущего.
Др. Арвен Гриффьюн (Arwen Griffioen), старший исследователь данных, компания Zendesk
Примерно в 2013 году обработка естественного языка и чат-боты начали получать все большее распространение в нашей жизни. Сначала поиск Google напоминал лишь работу с предметным указателем — инструментом, для использования которого не требовалось особых навыков. Но скоро он стал интеллектуальнее и начал понимать поисковые запросы, все более близкие к естественному языку. Далее еще больше усложнялась функциональность автодополнения в смартфонах. По центру зачастую было указано именно интересующее пользователя слово1.
В конце 2014 года мы с Сандером Шивайей (Thunder Shiviah) сотрудничали в рамках одного из проектов Hack Oregon, связанного с интеллектуальным анализом данных о финансировании избирательной кампании. Мы пытались отыскать связи между источниками финансирования политиков. Казалось, что политики скрывали своих «инвесторов» за туманным языком финансовых документов их кампаний. Самое интересное было не то, что мы смогли раскрыть эти связи с помощью простых методик обработки естественного языка. Больше всего меня удивляло получение от Сандера лаконичного, но подходящего ответа через считанные секунды после нажатия мной кнопки Отправить. Оказалось, что он использовал Smart Reply — утилиту-помощник для Google Inbox, составляющую ответы быстрее, чем человек может прочитать письмо.
Так что я решил тщательнее разобраться в механизмах, стоящих за этим фокусом. И чем больше узнавал, тем более понятными и выполнимыми представлялись подобные впечатляющие трюки обработки естественного языка. И какой бы проект машинного обучения я ни взял, практически все они включали использование обработки естественного языка.
Вероятно, причина — в моей любви к словам и восхищении их ролью в человеческом мышлении. Я мог часами обсуждать, существует ли вообще «смысл» у слов, с Джоном Ковальски (John Kowalski), моим начальником в Sharp Labs. По мере того как я обретал уверенность в своих силах и узнавал все больше от своих учителей и учеников, мне казалось, что я скоро смогу сам создать что-то новое и удивительное.
Один из трюков, которому я научился, — проход в цикле по набору документов и подсчет того, насколько часто за словами вроде War и Hunger следуют слова вроде Games или III. Если проделать это для большого набора текстов, можно научиться достаточно хорошо угадывать правильное следующее слово в цепочке слов, фразе или предложении. Такой классический подход к обработке языка был для меня интуитивно понятен.
Профессора и руководители называют это марковской цепью, но, с моей точки зрения, это просто таблица вероятностей — лишь список количества вхождений для каждого из слов в зависимости от предыдущего слова. Профессора назвали бы это условным распределением, вероятностями слов относительно предыдущего слова. Созданная Питером Норвигом (Peter Norvig) программа для проверки орфографии демонстрирует, что такой подход хорошо масштабируется и требует лишь нескольких строк кода на Python2. Все, что нужно, — много текста на естественном языке. Я с интересом предвкушаю появление возможностей его обработки на громадных общедоступных коллекциях вроде «Википедии» или проекта «Гутенберг»3.
А позднее я услышал про латентно-семантический анализ (latent semantic analysis, LSA). Мне казалось, что это просто нестандартный способ описания некоторых знакомых мне по колледжу операций линейной алгебры. Если отслеживать совместные вхождения слов, можно воспользоваться линейной алгеброй для группировки их по «темам». LSA способен сжать смысл целого предложения или даже длинного документа в один вектор, а использующие LSA поисковые системы обладают сверхъестественной способностью выдавать именно те документы, которые я искал. Хорошие поисковые системы делают это даже тогда, когда я не могу придумать, какие слова в таких документах могут быть.
Далее проект gensim выпустил реализацию векторов слов Word2vec для Python, благодаря чему стало возможно производить семантические математические операции над отдельными словами. И оказалось, что если разбить документы на меньшие порции, то подобная причудливая математика нейронных сетей будет эквивалентна старому доброму методу LSA. Это была сенсация. У меня появилась надежда внести какой-то вклад в данную сферу. Я размышлял об иерархических семантических векторах уже много лет — о том, как книги состоят из глав, состоящих из абзацев, состоящих из предложений, которые состоят из фраз, а те — из слов, которые составлены из букв. Томаш Миколов (Tomas Mikolov), создатель Word2vec, догадался искать основную семантику текста в связях между двумя слоями иерархии — словами и фразами из десяти слов. В течение десятилетий исследователи NLP рассматривали характеристики слов, например точность или эмоциональность. Причем все эти оценки тональностей и компоненты можно складывать/вычитать, создавая разные комбинации смыслов словосочетаний. Миколов придумал, как создавать эти векторы не «вручную» или даже вообще не описывая нужные компоненты. И NLP стало по-настоящему интересным занятием!
Примерно тогда же Сандер познакомил меня со своим подопечным, Коулом. Позднее другие люди познакомили меня с Ханнесом. И мы втроем начали «разделять и властвовать» в сфере NLP. Меня интересовала возможность создания интеллектуального чат-бота. Коула и Ханнеса вдохновляли широкие возможности «черных ящиков» нейронных сетей. Вскоре они открыли такой ящик, заглянули внутрь и описали мне свои находки. Коул даже применил их для создания чат-ботов, помогая мне в путешествии по стране NLP.
И все обнаруженные нами потрясающие новые методы NLP казались мне понятными и пригодными для моих целей. И практически для каждого метода почти сразу появлялась реализация на языке Python. Причем в эти пакеты Python зачастую включались необходимые нам данные и предобученные модели. Фраза «для этого метода уже существует пакет» стала постоянным рефреном на наших воскресных встречах в кофейне Флойда, где Ханнес, Коул и я обычно искали вместе с друзьями решение какой-либо задачи или играли в го и «нажмите среднюю кнопку». Мы быстро добились некоторых успехов и начали читать лекции на эту тему для различных курсов и команд лаборатории Hack Oregon.
В 2015 и 2016 годах все стало серьезнее. По мере того как выходили из-под контроля бот Tau от Microsoft и другие, стало ясно, что боты естественного языка влияют на социум. В 2016-м я был занят тестированием бота, собиравшего твиты для прогноза результатов выборов. В то же время начали появляться новости относительно влияния ботов в Twitter на выборы президента США. В 2015-м я узнал про систему, использовавшуюся для предсказания экономических трендов и запуска крупных финансовых трансакций на основе одного только «мнения» алгоритма о текстах на естественном языке4. Подобные влияющие на экономику и приводящие к сдвигу в обществе алгоритмы сформировали усиливающую петлю обратной связи. При естественном отборе среди таких алгоритмов, похоже, «выживали» приносившие наибольший доход. Причем этот доход зачастую давался ценой самих основ демократии. Машины влияли на людей, а мы, люди, обучали их применять естественный язык для повышения их влияния. Безусловно, эти машины контролировались мыслящими и вдумчивыми людьми, но с приходом понимания, что на этих людей также влияли боты, становилось не по себе. Могут ли эти боты привести к неуправляемой цепной реакции усиления обратной связи? Возможно, начальные условия ботов могли сильно повлиять на то, окажется ли эта цепная реакция благоприятной для человеческих ценностей и важных для людей вопросов.
А затем ко мне пришел Брайан Сойер (Brian Sawyer) с предложением от издательства Manning. И я уже знал, о чем хочу написать и кого хотел бы видеть в соавторах. Темпы развития NLP-алгоритмов и накопления данных на естественных языках продолжали расти, а Коул, Ханнес и я пытались не отстать от них.
Благодаря бурному потоку неструктурированных данных на естественном языке по вопросам политики и экономики NLP становился неотъемлемым инструментом политтехнологов и финансистов. Бросает в дрожь, когда понимаешь, что часть статей, на которых основываются подобные предсказания, написана другими ботами. Причем эти боты зачастую не подозревают о существовании друг друга. Они, по сути дела, общаются между собой и пытаются друг другом манипулировать, не задумываясь о благополучии людей и общества в целом. Мы для них просто попутчики.
Один из примеров этого замкнутого круга ботов, разговаривающих с ботами, иллюстрируется ростом финансово-технологического стартапа Banjo в 2015 году (https://www.inc.com/magazine/201504/will-bourne/banjo-the-gods-eye-view.html). Благодаря мониторингу Twitter NLP-бот Banjo был способен предсказывать заслуживающие упоминания новости за 30–60 минут до публикации первой статьи журналистами Reuters или CNN. Многие из используемых им для обнаружения этих событий твитов почти наверняка отмечались лайками и ретвитились несколькими другими ботами, чтобы привлечь внимание NLP-бота Banjo. И такие твиты не просто отбирались, раскручивались и оценивались в соответствии с алгоритмами машинного обучения. Многие из них были целиком написаны NLP-движками5.
Генерация все большего объема развлекательного, рекламного и финансово-отчетного контента не требует участия человека. NLP-боты пишут даже целые сценарии для фильмов (http://fivethirtyeight.com/features/some-like-it-bot/). Компьютерные игры и виртуальные миры содержат боты, иногда даже разговаривающие с нами о самих ботах и ИИ. Подобная «пьеса внутри пьесы» становится еще более рекурсивной в посвященных компьютерным играм фильмах, на которые боты затем пишут обзоры в реальном мире, чтобы помочь нам выбрать, что смотреть. Установление авторства становится все сложнее по мере того, как алгоритмы обработки естественного языка учатся анализировать стиль написанного на естественном языке текста и генерировать текст в этом стиле6.
NLP влияет на общество и менее явными способами: обеспечивает эффективный информационный поиск и с помощью фильтрации или продвижения определенных страниц влияет на потребляемую нами информацию. Поиск — исторически первая коммерчески успешная сфера приложения NLP. Поиск вдохновлял все более быструю разработку NLP-алгоритмов, которые затем усовершенствовали технологии поиска. Мы поможем вам внести свой вклад в данную область, продемонстрировав некоторые из лежащих в основе веб-поиска методик индексации и прогнозирования естественного языка. Мы покажем, как проиндексировать эту книгу и освободить свой мозг для более высоких мыслительных задач, отдав на откуп машинам запоминание терминологии, фактов и фрагментов кода на языке Python. Возможно, после этого вы сможете повлиять на общество с помощью созданных вами инструментов поиска на естественном языке.
Разработка NLP-систем привела к пику информационных потоков и вычислений, анализирующих действия человека. Сейчас можно ввести лишь несколько символов в строку поиска и зачастую получить именно ту информацию, которая нужна для завершения текущей задачи, например написания программного обеспечения для учебника по NLP. Первые несколько вариантов автодополнения нередко настолько сверхъестественно хорошо подходят, что кажется, будто нам помогает в поиске специальный человек. Конечно, при написании книги мы использовали разнообразные поисковые системы. В некоторых случаях результаты поиска включали сообщения в соцсетях и статьи, отобранные или написанные ботами, что стало причиной многих пояснений и примеров использования NLP на последующих страницах.
Что же является движущей силой NLP?
• Появившееся понимание ценности непрерывно расширяющейся паутины неструктурированных данных?
• Повышение вычислительных возможностей, наконец-то достигнувших достаточного для реализации идей исследователей уровня?
• Эффективность взаимодействия с машиной на нашем собственном языке?
Все это и многое другое. Введите вопрос «Почему обработка естественного языка сейчас настолько важна?» в любую поисковую систему7, и вы найдете статью в «Википедии» с перечнем убедительных причин8.
Существуют также и более глубинные причины. Одна из них — стремление поскорее создать искусственный интеллект общего уровня (artificial general intelligence, AGI), он же глубокий ИИ. Люди мыслят, возможно, лишь потому, что способны группировать мысли, сохранять (запоминать) их и эффективно ими обмениваться. Благодаря этому наш разум способен преодолевать временные и географические границы, объединяя наши интеллекты в единый коллективный разум.
Одна из изложенных в книге Стивена Пинкера (Steven Pinker) Stuff of Thought («Субстанция мышления») идей состоит в том, что мы фактически мыслим на естественном языке (https://en.wikipedia.org/wiki/The_Stuff_of_Thought). Выражение «внутренний диалог» возникло вовсе не случайно. Компании Facebook, Google и Илон Маск (Elon Musk) убеждены, что слова будут для мыслей протоколом обмена информацией по умолчанию. Все они инвестируют средства в проекты, связанные с попытками преобразования мыслей, мозговых волн и электрических сигналов в слова9. Кроме того, гипотеза Сепира — Уорфа гласит, что слова влияют на наш образ мышления10, а естественный язык, безусловно, является средой передачи культуры и коллективного сознания.
Так что если это подходит для человеческого мозга и мы хотели бы эмулировать или моделировать человеческие мысли в машине, то обработка естественного языка, вероятно, будет играть в этом важнейшую роль. Плюс в структурах данных и вложенных связях между словами кроется множество важных ключей к постижению разума, о которых мы расскажем в данной книге. В конце концов, вы собираетесь использовать эти структуры, а сети связей позволяют неодушевленным системам поглощать, хранить, извлекать и генерировать естественный язык способами, напоминающими человеческие.
Есть и еще более важная причина, по которой важно научиться программировать системы, хорошо использующие естественный язык... просто чтобы спасти мир. Надеемся, что вы следили за дискуссией сильных мира сего относительно проблемы контроля ИИ и непростой задачи разработки «дружественного к людям ИИ» (https://en.wikipedia.org/wiki/AI_control_problem). Ник Бостром (Nick Bostrom)11, Калум Чейс (Calum Chace)12, Илон Маск13 и многие другие верят, что будущее человечества зависит от нашей способности разрабатывать дружественные к нам машины, а естественному языку в обозримом будущем предстоит стать важным звеном связи между людьми и машинами.
Даже когда мы сможем непосредственно «передавать свои мысли» машинам, на эти мысли все равно, вероятно, внутри нашего мозга будут влиять естественные слова и языки. Граница между естественным и машинным языком будет размываться точно так же, как сейчас размывается граница между человеком и машиной. На самом деле эта граница начала размываться в 1984-м14 — году публикации «Манифеста киборгов» (https://en.wikipedia.org/wiki/A_Cyborg_Manifesto), что делает антиутопические предсказания Джорджа Оруэлла более вероятными15, 16.
Надеемся, что фраза «помочь спасти мир» не вызвала у вас скептической улыбки. По мере чтения этой книги мы покажем вам, как создать и соединить вместе несколько долей «мозга» чат-бота. И при этом вы увидите, какой колоссальный эффект как на людей, так и на машины могут оказывать крошечные сдвиги социальных петель обратной связи. Подобно бабочке, взмахнувшей крыльями в Китае (https://ru.wikipedia.org/wiki/Эффект_бабочки), крошечная корректировка коэффициента усиления «эгоистичности» чат-бота может привести к беспорядочному шквалу враждебного поведения и конфликтности чат-бота17. Но также вы увидите, как немногие благожелательно настроенные, альтруистические системы быстро обретают множество верных поклонников, помогающих устранить хаос, причиненный недальновидными ботами, которые преследуют «цели», направленные на обогащение их владельцев. Ориентированные на благо общества, отзывчивые чат-боты могут очень сильно повлиять на этот мир благодаря сетевому эффекту работы в интересах общества18.
Именно так и именно поэтому авторы данной книги нашли общий язык. В Интернете в ходе открытого, честного и направленного на благо человечества общения на естественном для нас языке возникло сообщество людей, поддерживающих те же идеи. И мы используем свой коллективный разум для создания и поддержки других полуразумных действующих лиц (машин)19. Мы надеемся, что наши слова оставят свой отпечаток в вашем сознании и распространятся, подобно мему, по миру чат-ботов, заражая других людей страстью к созданию функционирующих на благо общества NLP-систем. И мы надеемся, что, когда действительно возникнет сверхчеловеческий интеллект, он хоть немного проникнется духом работы на благо общества.
Хобсон Лейн
1Нажмите среднюю кнопку (https://www.reddit.com/r/ftm/comments/2zkwrs/middle_button_game/) на клавиатуре интеллектуального ввода текста на смартфоне, чтобы узнать, что вы хотите сказать дальше, по мнению Google. Эта игра впервые появилась на Reddit под названием SwiftKey game (https://blog.swiftkey.com/swiftkey-game-winning-is/) в 2013 году.
2См. веб-страницу How to Write a Spelling Corrector насайтеПитераНорвига: http://www.norvig.com/spell-correct.html.
3Если вы осознаете ценность свободного доступа к книгам на естественном языке, то, наверное, захотите быть в курсе предпринимаемых в международном масштабе попыток расширить права интеллектуальной собственности далеко за пределы первоначального «срока годности»: см. http://www.gutenberg.org и http://www.gutenbergnews.org/20150208/copyright-term-extensions-are-looming.
4См. веб-страницу Why Banjo Is the Most Important Social Media Company You’ve Never Heard Of: https://www.inc.com/magazine/201504/will-bourne/banjo-the-gods-eye-view.html.
5Финансовый отчет Twitter за 2014 год показал, что более 8 % твитов было составлено ботами, а в 2015 году DARPA провело конкурс (https://arxiv.org/ftp/arxiv/papers/1601/1601.05140.pdf) по их обнаружению и снижению их влияния на общество.
6NLP уже успешно применяется для идентификации стиля таких авторов XVI века, как Шекспир (https://pdfs.semanticscholar.org/3973/ff27eb173412ce532c8684b950f4cd9b0dc8.pdf).
7Например, вот запрос про NLP в поисковую систему DuckDuckGo по адресу https://duckduckgo.com/?q=Why+is+natural+language+processing+so+important+right+now:.
8См. статьи «Википедии»: https://en.wikipedia.org/wiki/Natural_language_processingWikipedia/NLP и https://ru.wikipedia.org/wiki/Обработка_естественного_языка.
9См. статьюиз Wired Magazine: We are Entering the Era of the Brain Machine Interface поадресу https://backchannel.com/we-are-entering-the-era-of-the-brain-machine-interface-75a3a1a37fd3.
10См. веб-страницу https://ru.wikipedia.org/wiki/Гипотеза_лингвистической_относительности.
11Официальный сайт Ника Бострома: https://nickbostrom.com/.
12Chace C. Surviving AI (https://www.singularityweblog.com/calum-chace-on-surviving-ai/).
13См. веб-страницу Why Elon Musk Spent $10 Million To Keep Artificial Intelligence Friendly: http://www.forbes.com/sites/ericmack/2015/01/15/elon-musk-puts-down-10-million-to-fight-skynet/#17f7ee7b4bd0.
14Автор немного искажает факты: «Манифест киборгов» был впервые опубликован в 1985 году. — Примеч. пер.
15Статья в «Википедии» о романе «1984» Джорджа Оруэлла: https://ru.wikipedia.org/wiki/1984_(роман).
16Статья в «Википедии» о 1984 годе: https://ru.wikipedia.org/wiki/1984_год.
17Основной инструмент чат-бота — имитация поведения людей, с которыми он общается. И участники диалога могут воспользоваться своим влиянием, чтобы спровоцировать как про-, так и асоциальное поведение ботов. См. статьюизинтернет-журнала Tech Republic Why Microsoft’s Tay AI Bot Went Wrong: http://www.techrepublic.com/article/why-microsofts-tay-ai-bot-went-wrong.
18Пример автономных машин, «заражающих» людей своим тщательно просчитанным поведением, можно найти в исследованиях, посвященных работе беспилотных автомобилей в часы пик (https://www.enotrans.org/wp-content/uploads/AV-paper.pdf). В некоторых работах показано, что лишь 10 % таких автомобилей на автостраде достаточно для стабилизации человеческого поведения на дороге, уменьшения заторов и обеспечения большей плавности и безопасности дорожного трафика.
19Начало моему путешествию в страну машинного обучения в 2010 году положила книга Тоби Сегарана (Toby Segaran) Programming Collective Intelligence («Программирование коллективного разума»): https://www.goodreads.com/book/show/1741472.Programming_Collective_Intelligence.
Написание этой книги и необходимого программного обеспечения, позволяющего сделать ее живой, было бы невозможно без сообщества поддерживавших нас одаренных разработчиков, наставников и друзей. В основном это представители активного портлендского сообщества, существование которого стало возможно благодаря таким организациям, как PDX Python, Hack Oregon, Hack University, Civic U, PDX Data Science, Hopester, PyDX, PyLadies и Total Good.
Наши благодарности Закари Кенту (Zachary Kent), спроектировавшему, создавшему и поддерживающему openchat (Twitter-бот для открытых встреч (open spaces) конференции PyCon), и Райли Растеду (Riley Rustad), создававшему прототипы его схемы данных по мере написания книги и совершенствования наших навыков. Санти Адавани (Santi Adavani) реализовал распознавание поименованных сущностей с помощью библиотеки Stanford CoreNLP, разработал руководства по SVD и PCA и помог нам в работе с его фреймворком RocketML HPC для обучения модели описания видео в режиме реального времени для незрячих. Эрик Миллер (Eric Miller) выделил часть ресурсов Squishy Media для оттачивания навыков Хобсона в визуализации NLP. Эрик Ларсон (Erik Larson) и Алек Ландграф (Aleck Landgraf) великодушно предоставили Хобсону и Ханнесу возможность свободно экспериментировать с машинным обучением и NLP в их стартапе.
Анна Оссовски (Anna Ossowski) помогла спроектировать Twitter-бот для открытых встреч конференции PyCon, а затем присматривала за ним в начале его обучения, чтобы его твиты были более вменяемыми. Чик Уэллс (Chick Wells), сооснователь компании Total Good, разработал продуманный и увлекательный тест на IQ для чат-ботов и постоянно помогал нам своими знаниями в сфере DevOps. Эксперты по NLP, например Кайл Горман (Kyle Gorman), щедро уделяли нам свое время, делились знаниями об NLP, кодом и драгоценными наборами данных. Кэтрин Николовски (Catherine Nikolovski) поделилась ресурсами Hack Oregon и Civic U. Крис Джан (Chris Gian) предоставил идеи своего NLP-проекта для примеров из этой книги и доблестно взял на себя проведение семинаров по машинному обучению Civic U, когда преподаватель увяз в работе над книгой. Рейчел Келли (Rachel Kelly) разрекламировала нас и помогла на начальном этапе фактического написания книги. Сандер Шивайя неизменно вдохновлял нас своими неустанными наставлениями и безграничным энтузиазмом относительно машинного обучения и жизни вообще.
Молли Мерфи (Molly Murphy) и Наташе Петти (Natasha Pettit) из Hopester мы благодарны за то, что они вдохновили нас на создание полезного для общества бота. Джереми Робин (Jeremy Robin) и команда Talentpair оставили ценные отзывы относительно разработки ПО и помогли воплотить в жизнь некоторые из упомянутых в данной книге концепций. Дэн Феллин (Dan Fellin) дал толчок нашим NLP-приключениям своими консультациями на семинарах PyCon 2016 и курсах Hack University по скрапингу Twitter. Алекс Розенгартен (Alex Rosengarten), Энрико Касини (Enrico Casini), Ригоберто Мачедо (Rigoberto Macedo), Шарлина Хан (Charlina Hung ) и Ашвин Канан (Ashwin Kanan) из Aira оживили идею чат-бота из этой книги эффективными, надежными и легкими в сопровождении диалоговым движком и микросервисом. Спасибо нашим «подопытным кроликам» Элле и Уэсли Минтонам (Ella & Wesley Minton), которые экспериментировали с нашими сумасшедшими идеями чат-ботов, учась писать свои первые программы на языке Python. Суман Кануганти (Suman Kanuganti) и Мария Макмаллин (Maria MacMullin) оказались достаточно дальновидны и основали фонд Do More, чтобы сделать визуальный интерфейс сервиса Aira доступным для студентов. Спасибо Клейтону Льюису (Clayton Lewis), позволившему нам участвовать в его исследованиях на тему виртуальных помощников, хотя единственным вкладом, который мы могли внести в его семинары в Институте Коулмена, был голый энтузиазм и неумело написанный код.
Часть работы, описанной в этой книге, была выполнена благодаря гранту, выделенному корпорации Aira Tech Национальным научным фондом (National Science Foundation, NSF). Все мнения, выводы и рекомендации, приведенные в издании, отражают лишь точку зрения авторов, но вовсе не обязательно — перечисленных выше организаций или отдельных лиц.
Наконец мы хотели бы поблагодарить всех сотрудников издательства Manning за их тяжкий труд, а также доктора Арвен Гриффьюн за любезно написанное ею предисловие, доктора Давиде Кадамуро (Davide Cadamuro) за техническую рецензию, а также всех наших рецензентов, чьи отзывы помогли улучить нашу книгу: Чан-Яо Чжуана (Chung-Yao Chuang), Фраджа Зайена (Fradj Zayen), Джеффа Барто (Geoff Barto), Джареда Дункана (Jared Duncan), Марка Миллера (Mark Miller), Партхасарати Мандайама (Parthasarathy Mandayam), Роджера Мели (Roger Meli), Шобху Айер (Shobha Iyer), Симону Руссо (Simona Russo), Срджана Сантича (Srdjan Santic), Томмазо Теофили (Tommaso Teofili), Тони Маллена (Tony Mullen), Владимира Купцова (Vladimir Kuptsov), Уильяма И. Уиллера (William E. Wheeler) и Йогеша Кулкарни (Yogesh Kulkarni).
Я бесконечно признателен своим родителям, вселившим в меня восхищение словами и математикой. Я в вечном долгу перед Лариссой Лейн (Larissa Lane) — самым бесстрашным искателем приключений из всех мне известных, благодаря которой сбылись две мои заветные мечты: кругосветное путешествие и написание книги.
В вечном долгу я также перед Арзу Караэр (Arzu Karaer) — за благосклонность и помощь в склеивании моего разбитого сердца, восстановление моей веры в человечество и за усилия, приложенные для подкрепления обнадеживающей идеи этой книги.
Я глубоко признателен моей супруге Уитни, которая безгранично поддерживала меня в этом начинании. Спасибо за твои советы и отзывы. Я также хотел бы поблагодарить свою семью, особенно родителей, поощрявших мои исследовательские порывы. Без них вся эта работа была бы просто невозможна. И все приключения в моей жизни были бы невозможны без тех смелых мужчин и женщин, которые изменили мир в ноябрьскую ночь 1989 года20. Спасибо вам за храбрость.
Я хотел бы выразить признательность моей жене Дон. Ее сверхчеловеческое терпение и понимание поистине вдохновляли меня. И моей маме за возможность свободно экспериментировать и поощрение моего стремления к знаниям.
20Ханнес, очевидно, имеет в виду разрушение Берлинской стены 9 ноября 1989 года. — Примеч. пер.
«Обработка естественного языка в действии» — практическое руководство по обработке и генерации текстов на естественном языке. В этой книге мы снабдим вас всеми инструментами и методиками, необходимыми для создания прикладных NLP-систем с целью обеспечения работы виртуального помощника (чат-бота), спам-фильтра, программы — модератора форума, анализатора тональностей, программы построения баз знаний, интеллектуального анализатора текста на естественном языке или практически любого другого NLP-приложения, какое только можно себе представить.
Книга ориентирована на Python-разработчиков среднего и высокого уровня. Значительная часть книги будет полезна и тем читателям, которые уже умеют проектировать и разрабатывать сложные системы, поскольку в ней содержатся многочисленные примеры рекомендуемых решений и раскрываются возможности самых современных алгоритмов NLP. Хотя знание объектно-ориентированного программирования на Python может помочь создавать лучшие системы, для использования приводимой в этой книге информации оно не обязательно.
Как в тексте книги, так и в Интернете приведено достаточно справочной информации и ссылок на ресурсы по отдельным темам для читателей, желающих глубже разобраться в соответствующих вопросах.
Если язык Python и обработка естественного языка для вас внове, лучше прочитать сначала часть I, а потом уже интересующую вас (или необходимую для ваших задач) главу части III. Если вы хотите быстрее перейти к новым возможностям NLP, которые появились благодаря глубокому обучению, то рекомендуем прочитать от начала до конца часть II, которая даст вам понимание работы нейронных сетей.
Рекомендуем, как только вы найдете главу или раздел с фрагментом кода, который можете «выполнить у себя в голове», выполнить его все же на машине. Если похоже, что с помощью какого-либо из примеров можно обработать ваши собственные текстовые документы, поместите этот текст в CSV- или текстовый файл (по одному документу на строку) в каталоге nlpia/src/nlpia/data/, после чего можете воспользоваться функцией nlpia.data.loaders.get_data() для извлечения этих данных и выполнения примеров на ваших собственных данных.
Относящиеся к части I главы описывают логику работы с естественным языком и преобразование его в числа для поиска и вычислений. Подобные базовые навыки работы со словами обладают дополнительным достоинством в виде таких удивительно полезных приложений, как информационный поиск и анализ тональностей. Освоив азы, вы узнаете, что с помощью очень простых арифметических операций, многократно повторяемых в цикле, можно решить весьма важные задачи, например фильтрации спама. Спам-фильтры, подобные тем, которые мы будем создавать в главах 2–4, спасли всемирную систему электронной почты от анархии и застоя. Вы узнаете, как создать фильтр спама с более чем 90%-ной точностью с помощью технологии 1990-х годов — просто вычисляя количества слов и средние значения этих количеств.
Вся эта математика со словами может показаться скучной, но она весьма увлекательна. Очень скоро вы научитесь создавать алгоритмы, умеющие принимать решения относительно естественного языка не хуже, а то и лучше, чем вы сами (и уж точно намного быстрее). Вероятно, при этом вы впервые в жизни сумеете по-настоящему оценить, насколько слова отражают и вообще делают возможным ваше мышление. Надеемся, представления слов и мыслей в многомерном векторном пространстве закружат ваш мозг в рекуррентных циклах самопознания.
Кульминация обучения наступит примерно к середине книги. Центральным моментом этой книги в части II будет исследование вами сложной паутины вычислений и взаимодействия между нейронными сетями. Сетевой эффект взаимодействия в паутине «мышления» маленьких логических блоков обеспечивает возможность решения машинами задач, к которым лишь очень умные люди пытались подступиться в прошлом: таких задач, как вопросы аналогии, автоматическое реферирование текста и перевод с одного естественного языка на другой21.
Мы расскажем вам не только о векторах слов, но и о многом, многом другом. Вы научитесь визуализировать слова, документы и предложения в облаке взаимосвязанных понятий, распространяющемся далеко за пределы простого и понятного трехмерного пространства. Вы начнете представлять себе документы и слова в виде описания персонажа в игре «Подземелья и драконы» с множеством случайно выбранных характеристик и способностей, развивающихся и растущих с течением времени, но только в наших головах.
Умение ценить эту межсубъектную реальность слов и их смыслов будет фундаментом завершающей книгу части III, из которой вы узнаете, как создавать машины, способные общаться и отвечать на вопросы не хуже людей.
Эта книга содержит множество примеров исходного кода как в пронумерованных листингах, так и внутри обычного текста. В обоих случаях исходный код набран такиммоношириннымшрифтом, чтобы его можно было отличить от обычного текста. Иногда код также набран полужирнымшрифтом, чтобы подчеркнуть изменения по сравнению с предыдущими шагами в этой главе, например, при добавлении новой функциональной возможности к уже существующей строке кода.
Первоначальный исходный код часто переформатировался: мы добавили разрывы строк и переработали отступы, чтобы наилучшим образом использовать доступное место на страницах книги. Иногда этого оказывалось недостаточно, и некоторые листинги включают маркеры продолжения строки (). Кроме того, мы нередко удаляли комментарии в исходном коде из листингов там, где код описывался в тексте. Многие листинги сопровождаются примечаниями к коду, подчеркивающими важные нюансы.
Исходный код для всех листингов данной книги доступен для скачивания с сайта издательства Manning по адресу https://www.manning.com/books/natural-language-processing-in-action и с GitHub по адресу https://github.com/totalgood/nlpia.
Покупка книги дает право на бесплатный доступ к частному веб-форуму издательства Manning, где можно оставлять свои комментарии о книге, задавать технические вопросы и получать помощь от авторов книги и других пользователей. Чтобы попасть на этот форум, перейдите по адресу https://livebook.manning.com/#!/book/natural-language-processing-in-action/discussion. Узнать больше о форумах издательства Manning и правилах поведения на них можно на странице https://livebook.manning.com/#!/discussion.
Обязательства издательства Manning по отношению к своим читателям требуют предоставления места для содержательного диалога между отдельными читателями, а также читателями и авторами. Эти обязательства не включают какого-либо конкретного объема участия со стороны авторов, чей вклад в работу форума остается добровольным (и неоплачиваемым). Мы советуем вам задавать авторам интересные и трудные вопросы, чтобы их интерес не угас! Указанный форум и архивы предыдущих обсуждений будут доступны на веб-сайте издательства столько, сколько будет в продаже данная книга.
Хобсон Лейн (Hobson Lane) обладает 20-летним опытом создания автономных систем, принимающих важные решения в интересах людей. В компании Talentpair Хобсон обучал машины читать и понимать резюме менее предубежденно, чем большинство специалистов по подбору персонала. В Aira он помогал в создании их первого чат-бота, предназначенного для толкования окружающего мира незрячим. Хобсон — страстный поклонник открытости ИИ и ориентированности его на благо общества. Он вносит активный вклад в такие проекты с открытым исходным кодом, как Keras, scikit-learn, PyBrain, PUGNLP и ChatterBot. Сейчас он занимается открытыми научными исследованиями и образовательными проектами для Total Good, включая создание виртуального помощника с открытым исходным кодом. Он опубликовал многочисленные статьи, выступал к лекциями на AIAA, PyCon, PAIS и IEEE и получил несколько патентов в области робототехники и автоматизации.
Ханнес Макс Хапке (Hannes Max Hapke) — инженер-электротехник, ставший инженером в области машинного обучения. В средней школе он увлекся нейронными сетями, когда изучал способы вычислений нейронных сетей на микроконтроллерах. Позднее, в колледже, он применял принципы нейронных сетей к эффективному управлению электростанциями на возобновляемых источниках энергии. Ханнес обожает автоматизировать разработку программного обеспечения и конвейеров машинного обучения. Он соавтор моделей глубокого обучения и конвейеров машинного обучения для сфер подбора персонала, энергетики и здравоохранения. Ханнес выступал с презентациями на тему машинного обучения на разнообразных конференциях, включая OSCON, Open Source Bridge и Hack University.
Коул Ховард (Cole Howard) — специалист по машинному обучению, специалист-практик, занимающийся NLP, и писатель. Вечный искатель закономерностей, он нашел себя в мире искусственных нейронных сетей. В числе его разработок — масштабные рекомендательные системы для торговли через Интернет и передовые нейронные сети для систем машинного интеллекта сверхвысокой размерности (глубокие нейронные сети), занимающие первые места на конкурсах Kaggle. Он выступал с докладами на тему сверточных нейронных сетей, рекуррентных нейронных сетей и их роли в обработке естественного языка на конференциях Open Source Bridge и Hack University.
Рисунок на обложке называется «Женщина из Краньска-Гора, Словения». Эта иллюстрация взята из недавнего переиздания книги Бальтазара Аке (Balthasar Hacquet) Images and Descriptions of Southwestern and Eastern Wends, Illyrians and Slavs («Изображения и описания юго-западных и восточных венедов, иллирийцев и славян»), опубликованного Этнографическим музеем в Сплите (Хорватия) в 2008 году. Аке (1739–1815) — австрийский врач и ученый, потративший долгие годы на изучение флоры, геологии и этносов Юлийских Альп — горного хребта, простирающегося от северо-восточной Италии до Словении и названного в честь Юлия Цезаря. Нарисованные вручную иллюстрации сопровождают многие опубликованные Аке научные статьи и книги.
Широкое разнообразие рисунков в публикациях Аке наглядно говорит об уникальности и своеобразии восточных Альп всего 200 лет назад. В то время манера одеваться однозначно различала жителей деревень, расположенных всего в нескольких милях друг от друга, а членов разных социальных групп и профессий можно было легко определить по их одежде. Стили одежды с тех пор изменились, и столь богатое разнообразие различных регионов угасло. Зачастую непросто отличить даже жителя одного континента от жителя другого, а обитатели живописных городков и деревушек в Словенских Альпах не так уж сильно не похожи на жителей других частей Словении или остальной части Европы.
В наше время, когда трудно отличить одну компьютерную книгу от другой, издательство Manning проявляет инициативу и деловую сметку, украшая обложки книг изображениями, которые показывают богатое разнообразие жизни в регионах два века назад.
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
21К счастью, эту последнюю задачу машины еще не умеют выполнять в совершенстве. — Примеч. пер.
Глава 1 начинает наше путешествие в мир обработки естественного языка со знакомства с некоторыми уже работающими приложениями.
Вы узнаете о способах использования машин, обрабатывающих слова, в вашей повседневной жизни. Надеемся, вы сможете оценить всю мощь машин, собирающих информацию из документа на естественном языке. Слова — фундамент любого языка вне зависимости от того, являются они ключевыми словами языка программирования или теми словами вашего родного языка, которые вы выучили, будучи еще ребенком.
Глава 2 даст вам инструменты для обучения машин извлечению слов из документов. Их куда больше, чем можно представить, но не переживайте — вы узнаете все хитрости. И научитесь автоматически объединять слова в группы слов со схожим значением, не создавая вручную списки синонимов.
Глава 3 обучит подсчитывать слова и собирать их в векторы, отражающие смысл документа. С помощью этих векторов можно отображать значения всего документа, будь он 140-символьным твитом или 500-страничным романом.
Глава 4 откроет некоторые проверенные временем математические приемы для сжатия ваших векторов в более удобные векторы тем.
К концу части I у вас будут все необходимые инструменты для создания различных интересных NLP-приложений (обработки естественного языка): от семантического поиска до чат-ботов.
В этой главе
• Что такое обработка естественного языка (NLP).
• Почему технология NLP очень сложна и получила распространение лишь недавно.
• Когда порядок слов и грамматика имеют значение, а когда — нет.
• Как в чат-ботах сочетается множество инструментов NLP.
• Как начать создавать крошечный чат-бот с помощью регулярных выражений.
Вы собираетесь отправиться в увлекательное путешествие по миру обработки естественного языка. Для начала позвольте рассказать, что такое технология NLP и для чего она. Данная информация позволит углубиться в NLP и придумать способы его использования дома и на работе.
Далее вы узнаете в деталях, как обработать фрагмент английского текста с помощью языка программирования Python, и постепенно пополните свой набор инструментов NLP. Прочитав главу, вы напишете свою первую программу, которая может читать и писать фразы на английском языке. Этот фрагмент кода на языке Python будет первым из многих, которые понадобятся для изучения всех хитростей сборки диалоговой машины на английском языке — чат-бота.
Естественные языки отличаются от языков программирования. В первую очередь они не предназначены для перевода в конечный набор математических операций. Такие языки нужны для обмена информацией людьми друг с другом. Используя языки программирования, мы не рассказываем про свой день и не просим сходить в продуктовый магазин. Компьютерная программа на языке программирования четко инструктирует машину, что нужно делать, а в естественном английском и французском языках нет компиляторов или интерпретаторов.
Определение
Обработка естественного языка — это область исследований в компьютерных науках и искусственном интеллекте (ИИ), занимающаяся работой с такими языками, как английский или китайский. Обработка обычно включает в себя перевод естественного языка в данные (числа), с помощью которых компьютер может получить информацию об окружающем мире. И это понимание мира иногда используется для создания отражающего его текста на естественном языке.
Тем не менее данная глава демонстрирует способы обработки естественного языка. Этот процесс можно даже рассматривать как интерпретацию естественного языка, аналогичную работе интерпретатора языка Python. Когда разрабатываемая вами программа станет обрабатывать естественный язык, она сможет действовать в соответствии с его высказываниями и даже отвечать на них. Стоит отметить, что эти действия и ответы не являются четко определенными, что оставляет вам как разработчику конвейера NLP большую свободу действий.
Определение
Систему обработки естественного языка часто называют конвейером, так как она обычно включает в себя несколько этапов обработки, при которых текст на естественном языке подается на один конец системы, а результат выдается на другом.
Скоро вы сможете писать ПО с интересными неожиданными функциями, например умением поддерживать разговор, благодаря чему машины выглядят чуть более человекоподобными. Поначалу это может показаться каким-то фокусом — так происходит со всеми продвинутыми технологиями. Мы предоставим вам возможность заглянуть за кулисы и покажем весь реквизит и инструменты, чтобы вы могли выполнить эти трюки самостоятельно.
Все кажется простым, когда ты знаешь ответ.
Дейв Маджи (Dave Magee)
Что же такого волшебного в машине, которая может читать и писать на естественном языке? Машины обрабатывают языки с момента изобретения компьютеров. Хотя эти «официальные» языки — вроде ранних языков Ada, COBOL или Fortran — были спроектированы так, чтобы они интерпретировались (или компилировались) только одним верным способом. Сегодня «Википедия» насчитывает более 700 языков программирования. Ethnologue22, в свою очередь, насчитал в десять раз больше естественных языков, на которых говорят люди по всему миру, а общий объем проиндексированных компанией Google документов, написанных на естественных языках, составляет более 100 миллионов гигабайт23. Это просто оценка, она не закончена. Размер реального контента на естественном языке, который сейчас находится в Сети, может превышать 100 миллиардов гигабайт24. Однако такое огромное количество текстов на естественном языке не единственная причина создания ПО для обработки этого языка.
Самая интересная часть процесса обработки естественных текстов заключается в сложности. Машины, способные обрабатывать что-то естественное, не являются таковыми. Их можно сравнить со структурой, способной сделать что-то полезное с архитектурными схемами. Возможность обработки с помощью программного обеспечения языков, не предназначенных для понимания машинами, кажется магией — чем-то, что присуще лишь человеку.
В английском языке слово «естественный» (natural) в словосочетании «естественный язык» используется в том же смысле, что и в «окружающем мире» (natural world). Все естественное, появившееся путем эволюции, отличается от искусственных вещей, созданных человеком. Возможность проектировать и создавать ПО для чтения и обработки естественного языка, как в этом тексте, кажется чем-то совершенно трансцендентным, магическим.
Чтобы облегчить вашу работу, мы сфокусируемся на одном естественном языке, английском. Описанные в книге методики можно использовать с целью создания ПО для обработки любого, даже непонятного разработчику языка, включая еще не расшифрованные археологами и лингвистами. Мы покажем вам, как создавать ПО для обработки и генерирования текстов, используя всего один язык программирования, Python.
Python был с самого начала разработан так, чтобы быть удобным для чтения. Он также делает доступными пользователю немало своих «внутренностей», связанных с обработкой языка. Факты, описанные выше, делают его идеальным для обработки естественного языка. Python хорошо подходит, чтобы строить контролируемые конвейеры для алгоритмов NLP в корпоративной среде, где существует много участников, вносящих вклад в одну базу кода. Python даже используется вместо «универсального языка» математики и математических символов там, где это возможно. В конце концов, Python предоставляет недвусмысленный способ выражения математических алгоритмов25. Он разработан максимально удобочитаемым для таких программистов, как вы.
Естественные языки не могут быть прямо переведены в четкий набор математических операций. Однако они содержат информацию и инструкции, которые можно извлечь, хранить, индексировать, искать или на основе которых можно немедленно производить какие-либо действия. Одно из этих действий — генерирование последовательности слов в ответ на высказывание. Это и есть одна из функций диалогового движка, или чат-бота, который вы создадите.
Мы с вами целиком сфокусируемся на текстовых документах и сообщениях на английском языке, а не на устных высказываниях. Мы пропустим преобразование устных высказываний в системе распознавания «текст — речь» или «речь — текст». И мы проигнорируем вопрос генерации устной речи или преобразования текста в речь, которое превращает текст обратно в высказывание, произнесенное человеческим голосом. Все, чему вас научит эта книга, можно использовать для создания голосового интерфейса или виртуального помощника, вроде Siri или Alexa, так как библиотеки «текст — речь»/«речь — текст» находятся в свободном доступе. Операционные системы Android и iOS предоставляют высококачественные API распознавания и генерации речи. Кроме того, существуют пакеты языка Python с аналогичной функциональностью для настольных компьютеров и серверов.
Системы распознавания речи
Описание создания настроенной под свои потребности системы распознавания или генерирования речи потребовало бы отдельной книги. Мы оставим это как упражнение для читателя. Такая задача требует большого количества высококачественно маркированных данных, голосовых записей, снабженных фонетической транскрипцией, а также расшифровок текстов на естественном языке, синхронизированных с аудиодорожками. Для этого могут пригодиться некоторые из алгоритмов, которые вы встретите в этой книге, но большая часть алгоритмов распознавания и генерации — совсем другие.
Обработка естественного языка с целью получения полезной информации может быть сложной. Нужны утомительные статистические расчеты. Однако это то, для чего машины созданы. Как и многие другие технические задачи, решаются они гораздо проще, если ответ уже известен. К сожалению, компьютеры пока неспособны решать большинство практических задач NLP, таких как разговор и понимание прочитанной информации, так же точно и качественно, как это делают люди. Следовательно, у вас есть шанс настроить алгоритмы, изученные вами в этой книге, так, чтобы немного лучше решать некоторые задачи NLP.
Впрочем, методы и техники, описанные здесь, достаточно мощны для создания машин, способных превзойти людей по точности и скорости решения некоторых удивительно хитрых задач. Например, сарказм в отдельном сообщении Twitter распознается куда точнее машиной, чем человеком26. Не переживайте, люди все еще лучше справляются с задачей распознавания юмора и сарказма при диалоге благодаря нашей способности обрабатывать информацию в контексте высказывания. Однако машины непрерывно развивают свои навыки понимания контекста. Данная книга поможет вам включить контекст (метаданные) в свой конвейер NLP, если вы хотите попробовать продвинуть науку и технику вперед.
После того как вы извлечете структурированные числовые данные и векторы из естественного языка, вы сможете применять все инструменты математики и машинного обучения. Мы пользуемся теми же средствами линейной алгебры, которые нужны для проекции 3D-объектов на 2D-экран. Подобным занимались компьютеры и чертежники задолго до появления обработки естественного языка. Эти прорывные идеи стали ключом в мир семантического анализа, позволяя компьютерам интерпретировать и хранить «значение» высказываний, а не просто количество слов/символов. Семантический анализ совместно со статистикой помогают решить проблему неоднозначности естественного языка — того факта, что слова и фразы часто имеют несколько значений и интерпретаций.
Извлечение информации совсем не похоже на создание компилятора для языка программирования (к счастью для вас). Наиболее перспективные инструменты обходят жесткие правила регулярных грамматик (паттернов) или формальных языков. Вы можете положиться на статистические отношения между словами вместо того, чтобы использовать глубокую систему логических правил27. Представьте, что вам нужно описать правила английской грамматики и правописания в виде вложенных деревьев из операторов if...then. У вас бы получилось расписать правила для всех возможных способов сочетания слов, букв и знаков пунктуации в высказываниях? Или хотя бы начать захватывать семантику, смысл высказываний на английском? Даже сумей вы создать пригодное для некоторых типов высказываний ПО, представьте, насколько ограниченным и нестабильным оно бы получилось. Непредвиденная орфография или пунктуация легко нарушат логику вашего алгоритма и собьют его с толку.
Естественные языки также ставят дополнительную, еще более сложную задачу «декодирования». Те, кто говорит и пишет на естественных языках, предполагают, что заниматься обработкой (слушать/читать) будет человек, а не машина. Когда я говорю «доброе утро», я подразумеваю, что вы понимаете, что это такое и когда оно наступает. Интерпретатор должен быть в курсе, что «доброе утро» — общепринятое приветствие, не содержащее дополнительной информации об утре. Данная фраза скорее выражает настроение собеседника и готовность к общению.
Эта модель человеческого обработчика языка обладает большими возможностями. Она позволяет нам выразить много информации с помощью небольшого количества слов, если предположить, что этот «обработчик» имеет доступ к знаниям о мире, основанном на здравом смысле. Такая степень сжатия информации до сих пор недоступна для машин. Не существует чистой «теории разума», которую вы могли бы использовать в своем конвейере NLP. Но в следующих главах мы покажем методы, позволяющие машинам создавать антологии (базы знаний), с помощью которых можно интерпретировать базирующиеся на соответствующих знаниях высказывания.
Обработка естественного языка встречается повсюду. Она настолько распространена, что некоторые примеры из табл. 1.1 могут вас удивить.
Таблица 1.1. Категоризация способов использования NLP
Поиск
Веб-поиск
Поиск по документам
Автозаполнение
Редактирование
Правописание
Грамматика
Стиль
Диалог
Чат-бот
Помощник
Планирование
Письменный текст
Индексирование
Согласование
Оглавление
Адрес электронной почты
Спам-фильтр
Классификация
Приоритизация
Интеллектуальный анализ текста
Составление краткого содержания
Извлечение знаний
Медицинские диагнозы
Юриспруденция
Правовое влияние
Поиск прецедентов
Классификация повесток в суд
Новости
Обнаружение событий
Проверка фактов
Составление заголовков
Присваивание
Обнаружение плагиата
Литературная экспертиза
Советы по стилю
Анализ тональности текста
Мониторинг морального состояния общества
Сортировка отзывов на продукты
Техническая поддержка
Прогноз поведения
Финансы
Прогноз выборов
Маркетинг
Литературное творчество
Сценарии фильмов
Поэзия
Слова песен
Поисковая машина может предоставить более точные результаты поиска, если индексирует веб-страницы или архивы документов таким образом, что принимается во внимание значение текста на естественном языке. Автозаполнение использует NLP, чтобы закончить вашу мысль. Оно широко распространено в поисковых системах и клавиатурах мобильных устройств. Во множестве текстовых процессоров, плагинов для браузера и текстовых редакторов есть встроенные средства проверки орфографии, грамматики и согласования слов. Некоторые из диалоговых машин (чат-ботов) используют поиск на естественном языке, чтобы найти ответ на сообщение своего собеседника.
Конвейеры NLP, которые генерируют (составляют) текст, могут использоваться для создания не только коротких ответов в чат-ботах и виртуальных помощниках, но и более длинных отрывков текста. The Associated Press использует роботов-журналистов на базе NLP для написания целых статей по тематике финансов и репортажей со спортивных состязаний28. Боты могут составлять прогнозы погоды, которые иногда выглядят так же, как и отчеты людей-синоптиков в вашем родном городе. Вероятно, это связано с тем, что многие метеорологи-люди применяют текстовые процессоры с функциями NLP для составления черновиков прогнозов.
Спам-фильтры на базе NLP в ранних программах электронной почты способствовали тому, что в 1990-е годы электронная почта обогнала телефон и факс в качестве канала связи. Фильтры спама сохранили свое преимущество в игре «кошки-мышки» между спам-фильтрами и генераторами спама для электронной почты, однако могут проигрывать в других областях, таких как социальные сети. Примерно 20 % твитов о президентских выборах в США в 2016 году были составлены чат-ботами29. Эти боты поддерживают выгодные их владельцам и разработчикам точки зрения. «Кукловодами» зачастую выступают иностранные правительства или большие корпорации с ресурсами, стремящиеся повлиять на популярность того или иного мнения.
Системы NLP могут не только генерировать короткие посты в социальных сетях. Технологии NLP также можно использовать для составления длинных обзоров фильмов и продуктов с Amazon и других торговых площадок. Большое количество отзывов — продукт работы автономных конвейеров NLP, которые никогда не были в кинотеатре или не покупали обозреваемый продукт.
Сегодня чат-боты очень распространены. Они используются на ресурсах вроде Slack, IRC, а также на сайтах, предоставляющих клиентские услуги. На таких ресурсах чат-ботам приходится работать с неоднозначными командами или вопросами. Чат-боты, в составе которых находятся системы распознавания и генерации голоса, могут поддерживать длительные беседы ни о чем или с такой «целевой функцией», как бронирование столика в местном ресторане30. Системы NLP могут отвечать на звонки в различных компаниях, которые хотят чего-то лучшего, чем обычный обзвон, но при этом не желают платить людям за работу с клиентами.
Примечание
Во время демонстрации системы Duplex на Google IO разработчики и руководители упустили из виду вопрос обучения чат-ботов обману. Мы все игнорируем эту дилемму, когда весело общаемся с ботами в Twitter и других анонимных соцсетях, где те не открывают подробности своей родословной. В связи с возникновением ботов, которые так убедительно обманывают нас, появляется и проблема контроля ИИ (en.wikipedia.org/wiki/AI_control_problem). Мрачное пророчество Юваля Харари (Yuval Harari)31 под названием Homo Deus может сбыться скорее, чем казалось.
Существуют NLP-системы, которые могут заменять «администратора» электронной почты для компаний или помощников руководителей. Подобные помощники планируют встречи и кратко записывают данные в электронную систему Rolodex или CRM (систему управления взаимоотношениями с клиентами), взаимодействуя с другими по электронной почте от имени начальника. Организации доверяют свой бренд и репутацию NLP, позволяя ботам проводить кампании по маркетингу и обмену сообщениями. Некоторые неопытные, но отчаянные авторы книг по NLP позволяют ботам написать несколько предложений в своей книге. Однако об этом позже.
Когда вы печатаете Good Morning, Rosa, компьютер видит только 010001110110111101101111…. Как запрограммировать чат-бот на вежливый ответ на этот поток двоичных данных? Способно ли дерево вложенных условных операторов if…else проверить каждый из этих битов и отреагировать на них по отдельности? Подобный вариант будет эквивалентом создания специальной программы под названием «конечный автомат» (finite state machine, FSM). Конечный автомат, который выводит последовательность новых символов в процессе функционирования, как функция str.translate в языке Python, называется «конечный автомат-преобразователь» (finite state transducer, FST). Возможно, вы уже создавали конечный автомат, даже не отдавая себе в этом отчета. Вы когда-нибудь писали регулярное выражение? Это тот тип конечного автомата, который мы будем использовать в следующем подразделе, чтобы показать вам один из возможных подходов к NLP: на основе паттернов.
Что, если вы решили поискать в банке памяти (базе данных) точно такую же строку битов, символов или слов и использовать один из ответов, которые другие люди и авторы применяли для этого утверждения раньше? Теперь представьте, что в этом утверждении была опечатка или какое-либо незначительное изменение. Наш бот сойдет с рельс. Биты не непрерывная величина, они не прощают ошибок — они либо совпадают, либо нет. Не существует очевидного способа найти сходство между двумя потоками битов, при котором учитывался бы их смысл. Биты для «хорошо» будут так же похожи на биты для «плохо», как и на биты для «нормально».
Перед тем как показать вам лучший вариант, посмотрим, как же работает этот подход. Создадим маленькое регулярное выражение для распознавания таких приветствий, как Good morning, Rosa, и ответа соответствующим образом — наш первый крошечный чат-бот!
Удивительно, но скромный кодовый замок на самом деле является простой машиной обработки языка. Если у вас инженерный склад ума, этот раздел многое для вас прояснит. Если же вам не нужны механические аналогии для понимания принципов работы алгоритмов и регулярных выражений, пропустите его.
После прочтения этого подраздела вы по-новому взглянете на кодовый замок своего велосипеда. Замок на школьном шкафчике, конечно, не способен прочитать и понять лежащие в этом шкафчике учебники, но знает язык замков. Такой замок может понять, когда вы пытаетесь «сказать» ему «пароль» — любую последовательность символов, соответствующую «грамматике» (паттерну) языка замка. Еще важнее то, что замок может сказать, соответствует ли «высказывание» особенно осмысленному утверждению, на которое есть только один правильный «ответ»: освободить защелку, сдвинуть U-образный засов, чтобы вы могли попасть в свой шкафчик.
Этот язык замка (регулярные выражения) особенно прост, но не настолько, чтобы его нельзя было применить для чат-бота. Он подходит для распознавания ключевой фразы или команды, чтобы разблокировать конкретное действие или поведение.
Например, мы хотели бы, чтобы наш чат-бот распознавал такие приветствия, как Hello, Rosa, и отвечал на них соответствующим образом. Этот тип языка, как и у замков, формальный. Потому что имеет строгие правила о составлении и интерпретировании допустимого высказывания. Если вы когда-либо писали математические уравнения/выражения на языках программирования, то, можно сказать, вы писали высказывания на формальном языке.
Формальные языки — подмножество естественных языков. Для многих высказываний на естественном языке можно найти соответствие и сгенерировать его с использованием грамматики формального языка, например регулярных выражений. Именно поэтому мы провели аналогию с механическим языком замков: «Щелк, вжж»32.
Регулярные выражения используют специальный вид (класс) грамматики формального языка, называемый регулярной грамматикой. У нее предсказуемое, доказуемое поведение, и в то же время регулярные выражения достаточно гибкие для приведения в действие некоторых самых сложных диалоговых движков и чат-ботов на рынке. Amazon Alexa и Google Now — использующие регулярные грамматики движки, основанные главным образом на паттернах. Сложные правила регулярной грамматики часто можно выразить одной строкой кода, называемой регулярным выражением. Для языка Python существуют эффективные фреймворки для чат-ботов, такие как Will, полагающиеся исключительно на этот тип языка для создания удобного и интересного поведения. Amazon Echo, Google Home и аналогичные помощники применяют регулярную грамматику с целью кодирования логики для большей части их взаимодействий с пользователем.
Примечание
Регулярные выражения, применяемые в Python и приложениях Posix (Unix), таких как grep, — ненастоящие регулярные грамматики. У них есть языковые и логические функции (просмотр вперед и назад), приводящие к поспешным выводам и рекурсии, недопустимым в регулярной грамматике. В результате регулярные выражения не могут быть доказуемо остановлены. В них иногда возможны фатальные сбои или бесконечное зацикливание33.
Вы можете сказать: «Я слышал о регулярных выражениях. Использую grep. Но он подходит только для поиска!» И окажетесь правы. Они действительно используются в основном для поиска и сопоставления последовательностей. Однако все, что может найти совпадения в тексте, отлично подходит и для ведения диалога. Некоторые чат-боты, такие как Will, используют «поиск», чтобы найти последовательности символов в тех высказываниях пользователя, на которые они умеют реагировать. Эти распознанные последовательности запускают ответ в виде сценария, соответствующего данному конкретному совпадению регулярного выражения. И это же регулярное выражение помогает извлекать полезную информацию из высказывания. Чат-бот может добавить этот кусочек информации в свою базу знаний о пользователе или о мире, который описывает пользователь.
Машину, которая обрабатывает подобный язык, можно рассматривать как формальный математический объект, называемый конечным автоматом или детерминированным конечным автоматом (deterministic finite automaton, DFA). Как вы можете видеть, конечные автоматы снова и снова встречаются в этой книге. В итоге вы получите хорошее представление о том, для чего они нужны, не углубляясь в теорию конечных автоматов и математику. Для тех, кто хочет понять немного больше об этих инструментах, на рис. 1.1 показано место конечных автоматов в многоуровневом мире различных автоматов (ботов). Примечание ниже объясняет более подробные детали формальных языков.
Рис. 1.1. Типы автоматов
Математическое объяснение формальных языков
Кайл Горман (Kyle Gorman) так описывает языки программирования.
Большинство (если не все) языков программирования взято из класса контекстно свободных языков.
Синтаксический разбор контекстно свободных языков производится с помощью контекстно свободных грамматик, обеспечивающих эффективный разбор.
Регулярные языки также пригодны для эффективного синтаксического разбора и широко используются при вычислениях для сопоставления строк.
Приложения сопоставления строк редко требуют выразительности контекстно свободных языков.
Существует несколько классов формальных языков (далее приводятся в порядке уменьшения сложности) (https://ru.wikipedia.org/wiki/Иерархия_Хомского):
рекурсивно перечислимые;
контекстно зависимые;
контекстно свободные;
регулярные.
Естественные языки:
нерегулярные1;
не контекстно свободные2;
не могут быть описаны никакой формальной грамматикой3.
Создадим быстрый и простой чат-бот. Он не будет обладать большими возможностями, и для его создания понадобится серьезно обдумать лингвистические нюансы английского языка. Вам также придется «зашить» в него регулярные выражения так, чтобы они соответствовали способам изложения мыслей, используемых людьми в устной речи. Не беспокойтесь, если думаете, что не сможете составить этот Python-код самостоятельно. Вам не придется думать о том, как люди могут что-то сказать, как мы делали это в данном примере. Вам даже не придется писать регулярные выражения (regex), чтобы создать чат-бот. Мы покажем, как создать собственный чат-бот, в последующих главах, не «зашивая» в него ничего. Современный чат-бот может обучиться путем чтения подборки текстов на английском. Как это сделать, мы расскажем далее в книге.343536
Такой сопоставляющий с паттернами чат-бот — строго контролируемый. Чат-боты, основанные на сопоставлении с паттерном, были обычным явлением до изобретения современных чат-ботов на основе машинного обучения. И один из вариантов приведенного здесь подхода сопоставления с паттернами используется в таких чат-ботах, как Amazon Alexa, и в других виртуальных помощниках.
А пока создадим FSM, регулярное выражение, которое может говорить на языке замков (регулярном языке). Мы могли бы запрограммировать его так, чтобы он понимал выражения на языке замков, такие как 01–02–03. Еще лучше, если бы он понимал приветствия вроде «Сезам, откройся» или «Привет, Роза». Важная особенность вежливого чат-бота — умение отвечать на приветствие.
В протоколе машинного взаимодействия мы бы описали простую процедуру установления связи с сигналом ACK (подтверждение) после каждого сообщения, передаваемого между двумя компьютерами. Но наши машины будут взаимодействовать с людьми, которые говорят что-то вроде «Доброе утро, Роза». Мы не хотим, чтобы чат-бот издавал какое-нибудь чириканье или писк либо отправлял сообщения ACK, как это происходит при синхронизации модема или HTTP-соединении в начале разговора/сеанса просмотра веб-страниц. Вместо этого подойдут регулярные выражения для распознавания нескольких различных приветствий в начале установления связи при разговоре:
В регулярных выражениях можно указывать класс символов в квадратных скобках, а также использовать тире (-), чтобы указать диапазон символов, не набирая их по отдельности. Таким образом, регулярное выражение [a-z] будет соответствовать любой отдельной строчной букве, от a до z. Звездочка (*) после класса символов означает, что регулярному выражению будет соответствовать любое количество последовательных символов, относящихся к этому классу символов.
Детализируем наше регулярное выражение, чтобы ему соответствовало большее количество приветствий:
Совет
Буква r перед кавычкой означает неформатированную строку, а не регулярное выражение. С помощью неформатированных строк Python можно отправлять обратную косую черту непосредственно в компилятор регулярных выражений без необходимости ставить двойную обратную косую черту ("\\") перед всеми специальными символами регулярных выражений, такими как пробелы ("\\ ") и фигурные скобки ("\\{ \\}").
В регулярном выражении в первой строке кода заключено очень много логики. Оно в состоянии обработать на удивление большое разнообразие приветствий. Стоит отметить, что оно пропустило написанное с опечаткой слово Manning. Такого рода проблемы делают NLP очень сложным процессом. В машинном обучении и медицинских диагностических тестах это называется ложноотрицательным результатом классификации. К сожалению, этому регулярному выражению соответствуют также совершенно несвойственные людям фразы — ложноположительные результаты, которые также ничего хорошего не несут. Наличие ошибок обоих видов значит, что наше регулярное выражение слишком строгое и свободное. В результате наш бот будет звучать немного глупо и механически. Нам предстоит провести большую работу по уточнению сопоставляемых фраз, чтобы чат-бот был более похожим на человека.
Даже несмотря на это утомительное занятие, нам вряд ли когда-нибудь удастся охватить весь сленг людей и их орфографические ошибки. К счастью, составление регулярных выражений вручную не единственный способ обучить чат-бота. В дальнейшем мы больше расскажем об этом. Мы используем данную технику только тогда, когда нужен точный контроль над поведением бота, например, при выдаче команд голосовому помощнику на вашем мобильном телефоне.
Продолжим и закончим работу над нашим наделенным лишь одним талантом чат-ботом, добавив генератор выходных данных. Бот должен что-то сказать. Используем функцию форматирования строк Python для создания шаблона ответа чат-бота:
Если вы запустите этот маленький скрипт и скажете боту фразу Hello, Rosa, он ответит, спросив, как ваш день. При использовании немного более грубой формы обращения к чат-боту он ответит менее охотно, но не резко, чтобы поощрить вежливость37. Если вы упомянете кого-то еще, кто может следить за разговором по параллельному телефону или на форуме, бот промолчит и позволит общаться с тем, к кому вы обратились. Очевидно, что никто больше не следит за нашей строкой input(), но, будь эта функция внутри более крупного чат-бота, понадобилось бы учитывать подобные вещи.