Обработка естественного языка: краткий ликбез для разработчиков

12 июля 2016, 15:49

Java-разработчик Павел Вейник предлагает краткий ликбез по одной из категорий искусственного интеллекта (ИИ) — обработке естественного языка — с примерами того, как её можно превратить в бизнес.

Читать далее

Иллюстрация: futurism.com.

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

Понятно, что такой ажиотаж связан с сегодняшним бумом искусственного интеллекта (ИИ) — он происходит и в Калифорнии, и у нас, и по всему миру. Раскручивается очередной маховик: многие ИТ-компании ещёне вполне понимают, что будут делать, но уже вполне уверенно заявляют, что занимаются искусственным интеллектом.

Так что такое ИИ и причём тут обработка текста?

Тут уместно повторить мою любимую ремарку насчёт ИИ, которую я уже озвучивал: никто не понимает, что это на самом деле. Под этой вывеской подаётся любой чуть-чуть более умный алгоритм: всё, что сложнее обычной сортировки, — однозначно ИИ. Если же компания собирается создать или создаёт какие-то алгоритмы, которые ещё не изобретены, то это уж на 100% ИИ.

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

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

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

Предлагаю небольшой обзор существующих инструментов и способов ими пользоваться.

«Бессердечная» классификация: методы обработки текста

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

1. Статистические методы обработки текста

Эти методы основаны на подсчёте количества слов в текстах. Как правило, они достаточно просты и не требуют глубоких теоретических знаний в лингвистике, иногда — требуют глубоких математических знаний. Истоки этих методов лежат в математике, в вычислительной геометрии: текст представляется вектором, длина вектора — количество слов. Поскольку вся эта математика спрятана внутри алгоритмов, а алгоритмы — внутри библиотек, то тем, кто использует эти библиотеки, нет нужды разбираться в математике.

Примеры статистических методов

Классификация текста (самое простое применение). К какой теме относится этот текст? Как он окрашен с точки зрения эмоций — позитивно, негативно, нейтрально?

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

Определение языка текста. Определяя язык текста, можно оперировать не словами, а наборами символов, — сравнивать частоту каждого набора символов. Точность метода может достигать 99,9%. Это огромная, прямо-таки катастрофически гигантская точность для обработки текста.

У этой группы алгоритмов есть интересное свойство: их можно обучать на примерах. Берёшь примеры текстов из каждой категории — алгоритм учится, даёшь новые тексты — он их распознает. С одной стороны, это приятно: не надо ручками ничего делать и подкручивать. Но есть и тёмная сторона: очень легко переборщить с обучением, переобучить алгоритм, и он начнёт выдавать значения, клонящиеся к одной из тем.

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

Задачи, которые могут решаться с помощью статистических методов

Плагиат. Эти алгоритмы использует «Яндекс», чтобы определить, уникален текст или нет. Они широко используются в SЕО. Любознательный читатель может погуглить «метод шинглов».

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

Резюме. В целом статистические методы:

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

2. Точные методы обработки текста

Если речь идёт об извлечении информации из текста, «понимании текста», это точные методы. Их точность при этом весьма условна: в какой-то степени они точные, в какой-то — нет. Точные алгоритмы могут «сказать», упоминается ли в тексте какое-то имя, действие или нет.

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

Есть приёмы, которые возводят статистический метод почти на уровень точного метода.

Примеры точных методов

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

Извлечение объектов из текста. Мы можем искать некий именованный объект — название компании, человека, места и пр. Если мы ищем одну из 5 допустимых аббревиатур или названий, то всё просто. Если речь идёт о поиске именованных объектов, которых нет в словаре (или в словаре есть десятки тысяч похожих названий), задача становится намного более сложной.

Есть несколько очень хороших алгоритмов такого рода на разных языках.

Синтаксический анализ текста и на его основе некоторое «понимание» предложения. Это самый громоздкий (в разработке и в рантайме) и самый сложный способ точного анализа.

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

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

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

2 типа синтаксических анализаторов:

  1. Сделаны на основе самообучения. Такие алгоритмы пытаются анализировать все предложение целиком. Для них характерно довольно плохое качество анализа.  
     
  2. Составляются вручную. Они могут не проанализировать какие-то куски предложения, зато то, что они проанализировали, с большой долей вероятности является правильным. Обычно анализаторы русского языка выстроены именно таким образом.

Каким образом можно использовать синтаксический анализ? Сначала мы выделяем предложение, затем ищем в нём какие-то именованные объекты, потом через это предложение «прогоняем» алгоритмы синтаксического анализа — и получаем путь от одного объекта к другому объекту в виде части синтаксического дерева (дерева разбора). Путь может быть как очень сложным, так и простым.

Если он очень простой, то из него можно извлечь какой-то смысл. Например: первый объект — человек  с таким-то именем (Иванов), второй объект — компания с таким-то названием (Wargaming), связка-путь — «был уволен». В тексте идёт речь о том, что Иванова уволили из Wargaming. Если при этом в базе данных есть информация про эти два объекта, то можно получить какие-то дополнительные данные.

Фото: Marcus dePaula via Unsplash.com

Какие методы разработчики используют чаще?

Чаще всего используются статистические алгоритмы, потому что разработчикам с их «техническим складом ума» и математически-алгоритмическим прошлым проще освоить именно их, а не влезать в особенности языка и структуры и правил. Поэтому наиболее распространенными являются именно статистические методы.

Почему 100-процентное качество — это недостижимый идеал?

В моём понимании текст — это гигантская куча исключений. Что это значит? Каждое правило — это какое-то исключение из более общего правила. Для каждого правила есть сотни исключений, а для каждого исключения тоже есть сотни исключений. Вывод из этого: у вас никогда не будет качества обработки текста, равного 100%. Никогда. Нужно с этим жить.

Причём если 20-30-40% качества можно получить за условных три дня работы над своим алгоритмом, то каждый следующий процент качества даётся дороже. Последние проценты — 96-99.99% — даются очень дорого. Кучка исключений, с которыми вы работаете, становится всё больше, у вас может просто не хватить объёма выборки, времени, других ресурсов. Всё равно найдется что-то, что подпортит вам 100-процентное качество, и вы никогда не предскажете это заранее.

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

Основные принципы работы алгоритма с текстом

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

Принцип N1: простота

Это принцип простоты: облегчаем, удешевляем, ускоряем.

Главное правило: если простой алгоритм работает, то он лучше того алгоритма, который даёт несколько лишних процентов качества, но сложнее на 20 порядков.

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

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

Следствие из этого принципа: 90% вещей, в которых использованы сложные алгоритмы, могут быть сделаны проще, быстрее, дешевле — как в разработке, так и в эксплуатации.

Принцип N2: прозрачность

Любое решение, принятое алгоритмом, должно быть понятно, объяснимо, аргументировано.

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

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

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

Как достичь простоты и прозрачности: «примочки» и как можно более мелкие компоненты  

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

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

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

2. «Костыли». Если какой-то класс ошибок нельзя устранить с помощью простого алгоритма, всегда можно написать примочку, которая будет исправлять выводы алгоритма. Программисты меня сейчас осудят за использование костыля, но это намного лучше, чем усложнять сам алгоритм в несколько раз.

Основные препятствия: учёные vs бизнесмены

Обработка текста — вещь научно-техническая. Как правило, все специалисты в области обработки текста, которых я встречал, — разновидность учёного, их интересует наука, а не бизнес-задачи. А у нас, на постсоветском пространстве, люди из науки и бизнеса — вообще из разных плоскостей, которые не пересекаются по способу мышления, целям, ценностям.

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

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

Как делать деньги на обработке текста: бренды, тренды, боты

Из того, что делал лично я

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

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

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

И еще несколько вещей, о которых я не могу упоминать.

Из общемировой практики

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

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

Здесь мы плавно подходим к теме больших данных (big data). Понятно, что текстов может быть очень-очень много, тогда это действительно становится big data. Вполне можно сказать, что тот самый учёный с биржи использовал именно такой подход. Где граница между обработкой текста и big data, я не знаю.

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

Синтез текста

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

Поглощения ИИ-стартапов как способ быть в тренде

Покупка корпорацией Microsoft мессенджера Wand Labs, где работает 7 человек, не говорит о том, что ребята придумали нечто грандиозное в области обработки естественного языка.

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

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

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

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

Однако есть и суперпозитивные примеры. Уже лет 15 компания ABBYY разрабатывает супер-пупер систему обработки текста, мне регулярно попадаются крутейшие статьи про неё. Она на порядок превосходит всё, что я знаю. Когда они выстрелят и чем — мне неизвестно. Хочется верить, что это будет нечто интересное.

Отдельно хочется упомянуть команду Invention Machine, которая занимается именно синтаксическим анализом и была куплена американской корпорацией IHS. Они связали свои алгоритмы с ТРИЗ и получают очень интересные результаты.

Ссылки

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

  • http://cogcomp.cs.illinois.edu/page/software/ — прекрасный и простой набор инструментов от Иллинойсского университета. Потыкайте, посмотрите демо.
     
  • http://nlp.stanford.edu/software/ ​— мой предыдущий лидер, тоже набор инструментов от ещё более именитого университета — Стенфордского. Классные вещи они там делают!
     
  • https://gate.ac.uk/ — и классика: GATE (General Architecture for Text Engineering). Старый громоздкий обросший кучей фичей фреймворк, требует времени чтобы разобраться.
     
  • https://github.com/veinikp/senta ​— и для любопытных, которые хотят скачать и запустить что-нибудь без больших проблем. Это эмоциональный анализ твитов — проектик, который мы набросали со студентами на хакатоне в январе 2013 года. Разумеется, на Java. Ценен тем, что тут есть хорошая обученная моделька для классификации с помощью Stanford Classifer. И не только моделька, но и параметры для её генерации, и пример запуска. Данные я подготовил очень просто: выбрал из Twitter пару десятков миллионов твитов со смайликами :) и (: и назначил первых положительными, вторых — отрицательными. Потом убрал смайлики и прогнал обучение. Работает хорошо, фразу «Надо было маму слушать» распознает как отрицательную, обсценную лексику тоже понимает. Поддержкой проекта я не занимался, просто залил на github специально для этой статьи. Если кто-то захочет поддерживать его — забирайте и наслаждайтесь.

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

 

Публикация подготовлена при участии Натальи Провалинской

подписка на главные новости 
недели != спам
# ит-новости
# анонсы событий
# вакансии
Обсуждение