Естественно языковой поиск – пошаговое руководство по обработке естественного языка / Конференции Олега Бунина (Онтико) corporate blog / Habr

Содержание

Естественно-языковый поиск

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

Например, запрос
‘частные объявления продажа велосипедов’,
выдаст много ссылок на сайты с
разнообразными частными объявлениями.
А запрос с «+» ‘частные объявления
продажа +велосипедов’ покажет объявления
о продаже именно велосипедов. Если вам
нужно описание Парижа, а не предложения
многочисленных турагентств, имеет смысл
задать такой запрос ‘путеводитель по
парижу -агентство -тур’

Обратите внимание
на знак «-«. Это именно минус, а не
тире и не дефис. Знак «-» надо писать
через пробел от предыдущего и слитно с
последующим словом, вот так: ‘рак
-гороскоп’. Если написать ‘рак-гороскоп’
или ‘рак — гороскоп’, то знак «-» будет
проигнорирован.

  • Основные операторы

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

Например, при
запросе ‘лечебная физкультура’ или
‘лечебная & физкультура’), результатом
поиска будет список документов, в которых
в одном предложении содержатся и слово
‘лечебная’, и слово ‘физкультура’.
(Эквивалентно запросу ‘+лечебная
+физкультура’)

Между словами
можно поставить знак ‘|’, чтобы найти
документы, содержащие любое из этих
слов. (Удобно при поиске синонимов).

Запрос вида ‘фото
| фотография | фотоснимок | снимок |
фотоизображение’ задает поиск документов,
содержащих хотя бы одно из перечисленных
слов.

Еще один знак,
тильда ‘~’, позволит найти документы с
предложением, содержащим первое слово,
но не содержащим второе.

По запросу ‘банки
~ закон’ будут найдены все документы,
содержащие слово ‘банки’, рядом с которым
(в пределах предложения) нет слова
‘закон’.

Чтобы подняться
на ступеньку выше, от уровня предложения
до уровня документа, просто удвойте
соответствующий знак. Одинарный оператор
(&, ~) ищет в пределах абзаца, двойной
(&&, ~~) — в пределах документа.

Например, по запросу
‘рецепты && (плавленый сыр)’ будут
найдены документы, в которых есть и
слово ‘рецепты’ и словосочетание
‘(плавленый сыр)’ (причем ‘(плавленый
сыр)’ должен быть в одном предложении.
А запрос ‘руководство Visual C ~~ цена’ выдаст
все документы со словами ‘руководство
Visual C’, но без слова ‘цена’

  • Поиск с расстоянием

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

Например, по запросу
«красная шапочка» будут найдены
документы с это фразой. (При этом контекст
«а шапочка у нее была красная»
найден не будет.)

Как Яndex адресует
слова? Если все слова в тексте перенумеровать
по порядку их следования, то расстояние
между словами a и b — это разница между
номерами слов a и b. Таким образом,
расстояние между соседними словами
равно 1 (а не 0), а расстояние между
соседними словами, стоящими «не в том
порядке», равно -1. То же самое относится
и к предложениям.

Если между двумя
словами поставлен знак ‘/’, за которым
сразу напечатано число, значит, требуется,
чтобы расстояние между ними не превышало
этого числа слов.

Например, задав
запрос ‘поставщики /2 кофе’, вы требуете
найти документы, в которых содержатся
и слово ‘поставщики’ и слово ‘кофе’, причем
расстояние между ними должно быть не
более двух слов и они должны находиться
в одном предложении. (Найдутся «поставщики
колумбийского кофе», «поставщики
кофе из Колумбии» и т.д.)

Если порядок слов
и расстояние точно известны, можно
воспользоваться пунктуацией ‘/+n’. Так,
например, задается поиск слов, стоящих
подряд.

Запрос ‘синяя /+1
борода’ означает, что слово ‘борода’
должно следовать непосредственно за
словом ‘синяя’. (К тому же результату
приведет запрос «синяя борода»)

В общем виде
ограничение по расстоянию задается при
помощи пунктуации вида ‘/(n m)’, где ‘n’
минимальное, а ‘m’ максимально допустимое
расстояние. Отсюда следует, что запись
‘/n’ эквивалентна ‘/(-n +n)’, а запись ‘/+n’
эквивалентна ‘/(+n +n)’.

Запрос ‘музыкальное
/(-2 4) образование’ означает, что
‘музыкальное’ должна находиться от
‘образование’ в интервале расстояний
от 2 слов слева до 4 слов справа.

Практически все
знаки можно комбинировать с ограничением
расстояния.

Например, результатом
поиска по запросу ‘вакансии ~ /+1 студентов’
будут документы, содержащие слово
‘вакансии’, причем в этих документах
слово ‘студентов’ не следует непосредственно
за словом ‘вакансии’.

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

Запрос ‘банк &&
/1 налоги’ означает, что слово ‘налоги’
должно находиться в том же самом, либо
в соседнем со словом ‘банк’ предложении.

Вместо одного
слова в запросе можно подставить целое
выражение. Для этого его надо взять в
скобки.

Например, запрос
‘(история, технология, изготовление) /+1
(сыра, творога)’ задает поиск документов,
которые содержат любую из фраз ‘история
сыра’, ‘технология творога’, ‘изготовление
сыра’, ‘история творога’.

Можно искать
информацию в «зонах» — заголовках
(имя «зоны»: Title), ссылках (имя «зоны»:
Anchor) и адресе (имя «зоны»: Address).
Синтаксис: $имя_зоны (поисковое выражение).

Запрос ‘$title CompTek’
ищет в заголовках документов слово
‘CompTek’.Запрос ‘$anchor (CompTek | Dialogic)’ находит
документы, в cсылках внутри которых есть
одно из слов ‘CompTek’ или ‘Dialogic’.

Можно ограничить
поиск информации списком серверов или
наоборот исключить сервера из поиска
(url). Можно также искать документы,
содержащие ссылки на определенные URL
(link), и файлы картинок (image). Если вы хотите
работать не с конкретным URL (image), а со
всеми, начинающимися с данной
последовательности символов, используйте
«*». Синтаксис: #имя_элемента=»имя_файла
(URL)».

По запросу ‘CompTek
~~ #url=»www.comptek.ru*»‘ будут искаться
упоминания компании ‘CompTek’ везде, кроме
ее собственного сервера (www.comptek.ru). А
запрос ‘#link=»www.comptek.ru*»‘ покажет все
документы, которые сослались на сервер
компании.Запрос ‘ #image=»tort*»‘ даст
ссылки на документы с изображениями
тортов (хотя, возможно, найдется и портрет
черепахи Тортиллы).

Можно также искать
по ключевым словам (keywords), аннотациям
(abstract) и подписям под изображениями
(hint). Синтаксис: #имя_элемента=(поисковое
выражение).

Запросу
‘#keywords=(поисковая система) | #abstract=(поисковая
система)’ будут искаться все страницы,
в meta тегах которых есть эти слова.По
запросу ‘#hint=(кино)’ будут найдены
документы, содержащие изображение с
такой подписью.

Яndex: Детальное описание языка запросов


Детальное описание языка запросов

Как трактуются слова

Независимо от того, в какой форме вы употребили слово в запросе,
поиск учитывает все его формы по правилам русского языка.

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

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

  Например, по запросу ‘путина’
найдется и президент, и сезон интенсивного рыболовства. А по
запросу ‘Путина’ — президент и те случаи упоминания
рыболовного сезона, когда он написан с большой буквы
(например, если с него начинается предложение).

По умолчанию поиск учитывает все формы заданного слова согласно
правилам русского языка. Однако существует возможность поиска по
точной словоформе, для этого перед словоформой надо поставить
восклицательный знак ‘!‘.

  Так по запросу ‘!Лужкову‘ будут
найдены все документы, содержащие словоформу ‘Лужкову‘,
а по запросу ‘Лужков ~~ !Лужкову‘ — документы, в
которых упоминается Лужков, кроме тех, которые были найдены по
первому запросу.

Естественно-языковый
поиск

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

  Например, запрос ‘частные объявления
продажа велосипедов
‘, выдаст много ссылок на сайты с
разнообразными частными объявлениями. А запрос с «+»
частные объявления продажа +велосипедов‘ покажет
объявления о продаже именно велосипедов.
Если вам нужно
описание Парижа, а не предложения многочисленных турагентств,
имеет смысл задать такой запрос ‘путеводитель по парижу
-агентство -тур

Обратите внимание на знак «-«. Это именно минус, а не тире и не
дефис. Знак «-» надо писать через пробел от предыдущего и слитно с
последующим словом, вот так: ‘рак -гороскоп‘. Если написать
рак-гороскоп‘ или ‘рак — гороскоп‘, то знак «-» будет
проигнорирован.

Основные операторы

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

  Например, при запросе ‘лечебная
физкультура
‘ или ‘лечебная & физкультура‘),
результатом поиска будет список документов, в которых в одном
предложении содержатся и слово ‘лечебная‘, и слово
физкультура‘. (Эквивалентно запросу ‘+лечебная
+физкультура
‘)

Между словами можно поставить знак ‘|‘, чтобы найти
документы, содержащие любое из этих слов. (Удобно при поиске
синонимов).

  Запрос вида ‘фото | фотография |
фотоснимок | снимок | фотоизображение
‘ задает поиск
документов, содержащих хотя бы одно из перечисленных слов.

Еще один знак, тильда ‘~‘, позволит найти документы с
предложением, содержащим первое слово, но не содержащим второе.

  По запросу ‘банки ~ закон‘ будут
найдены все документы, содержащие слово ‘банки‘, рядом
с которым (в пределах предложения) нет слова ‘закон‘.

Чтобы подняться на ступеньку выше, от уровня предложения до
уровня документа, просто удвойте соответствующий знак. Одинарный
оператор (&, ~) ищет в пределах предложения,
двойной (&&, ~~) — в пределах документа.

  Например, по запросу ‘рецепты &&
(плавленый сыр)
‘ будут найдены документы, в которых есть и
слово ‘рецепты‘ и словосочетание ‘(плавленый
сыр)
‘ (причем ‘(плавленый сыр)‘ должен быть в одном
предложении. А запрос ‘руководство Visual C ~~ цена
выдаст все документы со словами ‘руководство Visual C‘,
но без слова ‘цена

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

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

  Например, по запросу «красная
шапочка»
будут найдены документы с этой фразой. (При этом
контекст «а шапочка у нее была красная» найден не будет.)

Как Яndex адресует слова? Если все слова в тексте перенумеровать
по порядку их следования, то расстояние между словами a и b — это
разница между номерами слов a и b. Таким образом, расстояние между
соседними словами равно 1 (а не 0), а расстояние между соседними
словами, стоящими «не в том порядке», равно -1. То же самое
относится и к предложениям.

Если между двумя словами поставлен знак ‘/‘, за которым
сразу напечатано число, значит, требуется, чтобы расстояние между
ними не превышало этого числа слов.

  Например, задав запрос ‘поставщики /2
кофе
‘, вы требуете найти документы, в которых содержатся и
слово ‘поставщики‘ и слово ‘кофе‘, причем
расстояние между ними должно быть не более двух слов и они
должны находиться в одном предложении. (Найдутся «поставщики
колумбийского кофе», «поставщики кофе из Колумбии» и т.д.)

Если порядок слов и расстояние точно известны, можно
воспользоваться пунктуацией ‘/+n‘. Так, например, задается
поиск слов, стоящих подряд.

  Запрос ‘синяя /+1 борода‘ означает,
что слово ‘борода‘ должно следовать непосредственно за
словом ‘синяя‘. (К тому же результату приведет запрос
«синяя борода»)

В общем виде ограничение по расстоянию задается при помощи
пунктуации вида ‘/(n m)‘, где ‘n‘ минимальное, а
m‘ максимально допустимое расстояние. Отсюда следует, что
запись ‘/n‘ эквивалентна ‘/(-n +n)‘, а запись
/+n‘ эквивалентна ‘/(+n +n)‘.

  Запрос ‘музыкальное /(-2 4)
образование
‘ означает, что ‘музыкальное‘ должна
находиться от ‘образование‘ в интервале расстояний от 2
слов слева до 4 слов справа.

Практически все знаки можно комбинировать с ограничением
расстояния.

  Например, результатом поиска по запросу
вакансии ~ /+1 студентов‘ будут документы, содержащие
слово ‘вакансии‘, причем в этих документах слово
студентов‘ не следует непосредственно за словом
вакансии‘.

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

  Запрос ‘банк && /1 налоги
означает, что слово ‘налоги‘ должно находиться в том же
самом, либо в соседнем со словом ‘банк‘ предложении.

Скобки

Вместо одного слова в запросе можно подставить целое выражение.
Для этого его надо взять в скобки.

  Например, запрос ‘(история | технология
| изготовление) /+1 (сыра | творога)
‘ задает поиск
документов, которые содержат любую из фраз ‘история
сыра
‘, ‘технология творога‘, ‘изготовление
сыра
‘, ‘история творога‘.

Поиск в зонах

Можно искать информацию в «зонах» — заголовках (имя «зоны»:
Title), ссылках (имя «зоны»: Anchor) и адресе (имя
«зоны»: Address).
Синтаксис: $имя_зоны (поисковое
выражение)
.

  Запрос ‘$title CompTek‘ ищет в
заголовках документов слово ‘CompTek‘.
Запрос
$anchor (CompTek | Dialogic)’ находит документы, в
cсылках внутри которых есть одно из слов ‘CompTek‘ или
Dialogic‘.

Поиск в определенных
элементах

Можно ограничить поиск информации списком серверов или наоборот
исключить сервера из поиска (url). Можно также искать документы,
содержащие ссылки на определенные URL (link), и файлы картинок
(image). Если вы хотите работать не с конкретным URL (image), а со
всеми, начинающимися с данной последовательности символов,
используйте «*».
Синтаксис: #имя_элемента=»имя_файла
(URL)»
.

  По запросу ‘CompTek ~~
#url=»www.comptek.ru*»
‘ будут искаться упоминания компании
CompTek‘ везде, кроме ее собственного сервера
(www.comptek.ru). А запрос ‘#link=»www.comptek.ru*»
покажет все документы, которые сослались на сервер компании.

Запрос ‘ #image=»tort*»‘ даст ссылки на документы с
изображениями тортов (хотя, возможно, найдется и портрет
черепахи Тортиллы).

Можно также искать по ключевым словам (keywords), аннотациям
(abstract) и подписям под изображениями (hint).
Синтаксис:
#имя_элемента=(поисковое выражение).

  Запросу ‘#keywords=(поисковая система) |
#abstract=(поисковая система)
‘ будут искаться все
страницы, в meta тегах которых есть эти слова.
По запросу
#hint=(кино)‘ будут найдены документы, содержащие
изображение с такой подписью.

Ранжирование результата
поиска

При поиске для каждого найденного документа Яндекс вычисляет
величину релевантности (соответствия) содержания этого документа
поисковому запросу. Список найденных документов перед выдачей
пользователю сортируется по этой величине в порядке убывания.
Релевантность документа зависит от ряда факторов, в том числе от
частотных характеристик искомых слов, веса слова или выражения,
близости искомых слов в тексте документа друг к другу и т.д.

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

Задание веса слова или выражения применяется для того, чтобы
увеличить релевантность документов, cодержащих «взвешенное»
выражение.
Синтаксис: слово:число или
(поисковое_выражение):число

  По запросу ‘поисковые механизмы:5
будут найдены те же документы, что и по запросу ‘поисковые
механизмы
‘. Разница состоит в том, что наверху списка
найденного окажутся документы, где чаще встречается именно
слово ‘механизмы‘.
Запрос ‘поисковые (механизмы |
машины | аппараты):5
‘ равнозначен запросу ‘поисковые
(механизмы:5 | машины:5 | аппараты:5)
‘.

Задание уточняющего слова или выражения применяется для того,
чтобы увеличить релеватность документов, cодержащих уточняющее
выражение.
Синтаксис: <- слово или <-
(уточняющее_выражение)

  По запросу ‘компьютер <- телефон
будут найдены все документы, содержащие слово
компьютер‘, при этом первыми будут выданы документы,
содержащие слово ‘телефон‘.
Если ни в одном
документе со словом ‘компьютер‘ нет слова
телефон‘, результат запроса будет эквивалентен запросу
компьютер‘.

пошаговое руководство по обработке естественного языка / Конференции Олега Бунина (Онтико) corporate blog / Habr

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

Обработкой естественного языка (NLP) называется активно развивающаяся научная дисциплина, занимающаяся поиском смысла и обучением на основании текстовых данных.

Как вам может помочь эта статья

За прошедший год команда Insight приняла участие в работе над несколькими сотнями проектов, объединив знания и опыт ведущих компаний в США. Результаты этой работы они обобщили в статье, перевод которой сейчас перед вами, и вывели подходы к решению наиболее распространенных прикладных задач машинного обучения.

Мы начнем с самого простого метода, который может сработать — и постепенно перейдем к более тонким подходам, таким как feature engineering, векторам слов и глубокому обучению.

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

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

Пост написан в формате пошагового руководства; также его можно рассматривать в качестве обзора высокоэффективных стандартных подходов.

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

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

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

  • Идентификация различных когорт пользователей или клиентов (например, предсказание оттока клиентов, совокупной прибыли клиента, продуктовых предпочтений)
  • Точное детектирование и извлечение различных категорий отзывов (позитивные и негативные мнения, упоминания отдельных атрибутов вроде размера одежды и т.д.)
  • Классификация текста в соответствии с его смыслом (запрос элементарной помощи, срочная проблема).

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

Шаг 1: Соберите ваши данные

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

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

  • Отзывы о товарах (Amazon, Yelp и различные магазины приложений).
  • Контент, созданный пользователями (твиты, посты в Facebook, вопросы на StackOverflow).
  • Диагностическая информация (запросы пользователей, тикеты в поддержку, логи чатов).

Датасет «Катастрофы в социальных медиа»

Для иллюстрации описываемых подходов мы будем использовать датасет «Катастрофы в социальных медиа», любезно предоставленный компанией CrowdFlower.

Авторы рассмотрели свыше 10 000 твитов, которые были отобраны при помощи различных поисковых запросов вроде «в огне», «карантин» и «столпотворение». Затем они пометили, имеет ли твит отношение к событию-катастрофе (в отличие от шуток с использованием этих слов, обзоров на фильмы или чего-либо, не имеющего отношение к катастрофам).

Поставим себе задачу определить, какие из твитов имеют отношение к событию-катастрофе в противоположность тем твитам, которые относятся к нерелевантным темам (например, фильмам). Зачем нам это делать? Потенциальным применением могло бы быть эксклюзивное уведомление должностных лиц о чрезвычайных ситуациях, требующих неотложного внимания — при этом были бы проигнорированы обзоры последнего фильма Адама Сэндлера. Особая сложность данной задачи заключается в том, что оба этих класса содержат одни и те же критерии поиска, поэтому нам придется использовать более тонкие отличия, чтобы разделить их.

Далее мы будем ссылаться на твиты о катастрофах как «катастрофа», а на твиты обо всём остальном как «нерелевантные».

Метки (Labels)

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

Rather than spending a month figuring out an unsupervised machine learning problem, just label some data for a week and train a classifier.

— Richard (@RichardSocher) March 10, 2017

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

Шаг 2. Очистите ваши данные

Правило номер один: «Ваша модель сможет стать лишь настолько хороша,

насколько хороши ваши данные»

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

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

  1. Удалить все нерелевантные символы (например, любые символы, не относящиеся к цифро-буквенным).
  2. Токенизировать текст, разделив его на индивидуальные слова.
  3. Удалить нерелевантные слова — например, упоминания в Twitter или URL-ы.
  4. Перевести все символы в нижний регистр для того, чтобы слова «привет», «Привет» и «ПРИВЕТ» считались одним и тем же словом.
  5. Рассмотрите возможность совмещения слов, написанных с ошибками, или имеющих альтернативное написание (например, «круто»/«круть»/ «круууто»)
  6. Рассмотрите возможность проведения лемматизации, т. е. сведения различных форм одного слова к словарной форме (например, «машина» вместо «машиной», «на машине», «машинах» и пр.)

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

Шаг 3. Выберите хорошее представление данных

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

Улыбающееся лицо, представленное в виде массива чисел

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

One-hot encoding («Мешок слов»)

Естественным путем отображения текста в компьютерах является кодирование каждого символа индивидуально в виде числа (пример подобного подхода — кодировка ASCII). Если мы «скормим» подобную простую репрезентацию классификатору, он будет должен изучить структуру слов с нуля, основываясь лишь на наших данных, что на большинстве датасетов невозможно. Следовательно, мы должны использовать более высокоуровневый подход.

Например, мы можем построить словарь всех уникальных слов в нашем датасете, и ассоциировать уникальный индекс каждому слову в словаре. Каждое предложение тогда можно будет отобразить списком, длина которого равна числу уникальных слов в нашем словаре, а в каждом индексе в этом списке будет хранится, сколько раз данное слово встречается в предложении. Эта модель называется «Мешком слов» (Bag of Words), поскольку она представляет собой отображение полностью игнорирущее порядок слов предложении. Ниже иллюстрация такого подхода.

Представление предложений в виде «Мешка слов». Исходные предложения указаны слева, их представление — справа. Каждый индекс в векторах представляет собой одно конкретное слово.

Визуализируем векторные представления

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

Для того, чтобы выяснить, захватывают ли наши векторные представления (embeddings), релевантную нашей задаче информацию (например, имеют ли твиты отношение к катастрофам или нет), стоит попробовать визуализировать их и посмотреть, насколько хорошо разделены эти классы. Поскольку словари обычно являются очень большими и визуализация данных на 20 000 измерений невозможна, подходы вроде метода главных компонент (PCA) помогают спроецировать данные на два измерения.

Визуализация векторных представлений для «мешка слов»

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

Шаг 4. Классификация

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

Разобьем наши данные на обучающую выборку, которую мы будем использовать для обучения нашей модели, и тестовую — для того, чтобы посмотреть, насколько хорошо наша модель обобщается на данные, которые не видела до этого. После обучения мы получаем точность в 75.4%. Не так уж и плохо! Угадывание самого частого класса («нерелеватно») дало бы нам лишь 57%.

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

Шаг 5. Инспектирование

Матрица ошибок

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

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

Объяснение и интерпретация нашей модели

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

«Мешок слов»: значимость слов

Наш классификатор верно нашел несколько паттернов (hiroshima — «Хиросима», massacre — «резня»), но ясно видно, что он переобучился на некоторых бессмысленных терминах («heyoo», «x1392»). Итак, сейчас наш «мешок слов» имеет дело с огромным словарем из различных слов и все эти слова для него равнозначны. Однако, некоторые из этих слов встречаются очень часто, и лишь добавляют шума нашим предсказаниям. Поэтому далее мы постараемся найти способ представить предложения таким образом, чтобы они могли учитывать частоту слов, и посмотрим, сможем ли мы получить больше полезной информации из наших данных.

Шаг 6. Учтите структуру словаря

TF-IDF

Чтобы помочь нашей модели сфокусироваться на значимых словах, мы можем использовать скоринг TF-IDF (Term Frequency, Inverse Document Frequency) поверх нашей модели «мешка слов». TF-IDF взвешивает на основании того, насколько они редки в нашем датасете, понижая в приоритете слова, которые встречаются слишком часто и просто добавляют шум. Ниже приводится проекция метода главных компонент, позволяющая оценить наше новое представление.

Визуализация векторного представления с применением TF-IDF.

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

Очень незначительное улучшение. Может, наша модель хотя бы стала выбирать более важные слова? Если полученный результат по этой части стал лучше, и мы не даем модели «мошенничать», то можно считать этот подход усовершенствованием.

TF-IDF: Значимость слов

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

Шаг 7. Применение семантики

Word2Vec

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

Чтобы решить данную проблему, нам потребуется захватить семантическое (смысловое) значение слов — это означает, что для нас важно понимать, что слова «хороший» и «позитивный» ближе друг к другу, чем слова «абрикос» и «континент». Мы воспользуемся инструментом Word2Vec, который поможет нам сопоставить значения слов.

Использование результатов предварительного обучения

Word2Vec — это техника для поиска непрерывных отображений для слов. Word2Vec обучается на прочтении огромного количества текста с последующим запоминанием того, какое слово возникает в схожих контекстах. После обучения на достаточном количестве данных, Word2Vec генерирует вектор из 300 измерений для каждого слова в словаре, в котором слова со схожим значением располагаются ближе друг к другу.

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

Отображение уровня предложений

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

Векторные представления предложений в Word2Vec

Вот визуализация наших новых векторных представлений после использования перечисленных техник:

Визуализация векторных представлений Word2Vec.

Теперь две группы цветов выглядят разделенными еще сильнее, и это должно помочь нашему классификатору найти различие между двумя классами. После обучения той же модели в третий раз (логистическая регрессия), мы получаем точность в 77,7% — и это наш лучший результат на данный момент! Настало время изучить нашу модель.

Компромисс между сложностью и объяснимостью

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

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

LIME

LIME доступен на Github в виде открытого пакета. Данный интерпретатор, работающий по принципу черного ящика, позволяет пользователям объяснять решения любого классификатора на одном конкретном примере при помощи изменения ввода (в нашем случае — удаления слова из предложения) и наблюдения за тем, как изменяется предсказание.

Давайте взглянем на пару объяснений для предложений из нашего датасета.

Правильные слова катастроф выбраны для классификации как «релевантные».

Здесь вклад слов в классификацию выглядит менее очевидным.

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

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

Шаг 8. Использование синтаксиса при применении end-to-end подходов

Мы рассмотрели быстрые и эффективные подходы для генерации компактных векторных представлений предложений. Однако, опуская порядок слов, мы отбрасываем всю синтаксическую информацию из наших предложений. Если эти методы не дают достаточных результатов, вы можете использовать более сложную модель, которая принимает целые выражения в качестве ввода и предсказывает метки, без необходимости построения промежуточного представления. Распространенный для этого способ состоит в рассмотрении предложения как последовательности индивидуальных векторов слов с использованием или Word2Vec, или более свежих подходов вроде GloVe или CoVe. Именно этим мы и займемся далее.

Высокоэффективная архитектура обучения модели без дополнительной предварительной и последующей обработки (end-to-end, источник)

Сверточные нейронные сети для классификации предложений (CNNs for Sentence Classification) обучаются очень быстро и могут сослужить отличную службу в качестве входного уровня в архитектуре глубокого обучения. Несмотря на то, что сверточные нейронные сети (CNN) в основном известны своей высокой производительностью на данных-изображениях, они показывают превосходные результаты при работе с текстовыми данными, и обычно гораздо быстрее обучаются, чем большинство сложных подходов NLP (например, LSTM-сети и архитектуры Encoder/Decoder ). Эта модель сохраняет порядок слов и обучается ценной информации о том, какие последовательности слов служат предсказанием наших целевых классов. В отличии от предыдущих моделей, она в курсе существования разницы между фразами «Лёша ест растения» и «Растения едят Лёшу».

Обучение данной модели не потребует сильно больше усилий по сравнению с предыдущими подходами (смотрите код), и, в итоге, мы получим модель, которая работает гораздо лучше предыдущей, позволяя получить точность в 79,5%. Как и с моделями, которые мы рассмотрели ранее, следующим шагом должно быть исследование и объяснение предсказаний с помощью методов, которые мы описали выше, чтобы убедиться в том, что модель является лучшим вариантом, который мы можем предложить пользователям. К этому моменту вы уже должны чувствовать себя достаточно уверенными, чтобы справиться с последующими шагами самостоятельно.

В заключение

Итак, краткое содержание подхода, который мы успешно применили на практике:

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

Данные подходы мы рассмотрели на конкретном примере с использованием моделей, заточенных на распознавание, понимание и использование коротких текстов — например, твитов; однако, эти же идеи широко применимы к множеству различных задач.

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

А программа майского фестиваля РИТ++ и июньского Highload++ Siberia уже в пути, за текущим состоянием можно следить на сайтах конференций или подписаться на рассылку, и мы будем периодически присылать анонсы одобренных докладов, чтобы вам ничего не пропустить.

4 Ресурсы Интернет по своей предметной области

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

При
поиске информации
поисковые запросы бывают явные и неявные.

В явных вопросах конкретно указывается
объект поиска. В неявных вопросах,
например,

«какая сегодня погода», «происходит
ли сейчас что-то важное
», «можно ли
проехать по городу
», или у А. С. Пушкина
в «Сказке о мертвой царевне и о семи
богатырях»:
Свет мои, зеркальце!
скажи

Да всю правду доложи:
Я
ль на свете всех милее,

Всех румяней
и белее?

объект поиска конкретно не
указывается.

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

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

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

Надо определиться
и с возможными форматами файлов в которых
может содержаться требуемая информация.
Это может быть html-страница, текстовый
документ в форматах txt, rtf, odt, doc или docx,
документ pdf, презентация в форматах odp,
ppt или pptx, электронная таблица в форматах
ods, xls или xlsx, аудио в формате mp3, flash-ролик
формата swf, видео в формате avi и т. д.

Описание языка запросов

  • Как трактуются слова

Независимо от
того, в какой форме вы употребили слово
в запросе, поиск учитывает все его формы
по правилам русского языка.

Например, если
задан запрос ‘идти’, то в результате
поиска будут найдены ссылки на документы,
содержащие слова ‘идти’, ‘идет’, ‘шел’,
‘шла’ и т.д. На запрос ‘окно’ будет выдана
информация, содержащая и слово ‘окон’,
а на запрос ‘отзывали’ — документы,
содержащие слово ‘отозвали’.

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

Например, запрос
‘лебедь’ найдет и птицу, и генерала.
Запрос ‘Лебедь’ — генерала и те случаи
упоминания птицы, когда она написана с
большой буквы.

По умолчанию поиск
учитывает все формы заданного слова
согласно правилам русского языка. Однако
существует возможность поиска по точной
словоформе, для этого перед словоформой
надо поставить восклицательный знак
‘!’.

Так по запросу
‘!Лужкову’ будут найдены все документы,
содержащие словоформу ‘Лужкову’, а по
запросу ‘Лужков ~~ !Лужкову’ — документы,
в которых упоминается Лужков, кроме
тех, которые были найдены по первому
запросу.

Понимание запросов на естественном языке? — Хабр Q&A

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

Сейчас я занимаюсь дипломной работой, важной частью которой будет система парсинга запросов на естественном языке. Ранее я занимался просто поисковыми технологиями, без углубления в «понимание» запроса, там можно было обойтись известными простыми алгоритмами на метриках типа tf-idf и теории вероятностей с матстатистикой. Но сейчас же система должна «понимать» некоторые виды запросов и уметь преобразовать его, грубо говоря, в запрос к БД. Если совсем упрощать, на запрос «какие мои друзья живут в Москве» или «мои знакомые живущие в Москве» система должна обратиться к таблице «люди» и выбрать всех, у кого «город=Москва». Надеюсь понятно объяснил.

Последнее время таких систем стало появляться всё больше (хотя в литературе «общение с системой на естественном языке» упоминается последние лет 50). Всякие Siri, Google Now, Facebook Graph Search, умеют «понимать» запрос и давать не просто ранжированную выдачу как классические поисковые системы, а правильное оформление для запрошенного типа информации.

Мне была бы интересна любая информация, любые ссылки, книги, да даже правильные запросы в гугл, которые помогли бы мне в изучении подобных систем и написании собственной (конечно же не такой мощной). Я приму любые источники (можно в личку, если стесняетесь «ляпнуть»), я сам отберу, а при необходимости и достаточном количестве найденой информации могу написать summary-пост на хабр.

P.S.: Уже гуглил по темам «natural language query parsing», «natural language database interface», «syntax/semantic analysis», начинал читать старую-старую книжку «общение с ЭВМ на естественном языке» (бросил, потому что показалось, что «не туда идем»), но исчерпывающей информации всё равно не нашел. Не хватает какого-то такого «толчка» для понимания как всё это объединить в системе.

обработка естественных языков / Wunder Fund corporate blog / Habr

Это третья статья из серии “Обзор исследований в области глубокого обучения” (Deep Learning Research Review) студента Калифорнийского университета в Лос-Анджелесе Адита Дешпанда (Adit Deshpande). Каждые две недели Адит публикует обзор и толкование исследований в определенной области глубинного обучения. В этот раз он сосредоточил свое внимание на применении глубокого обучения для обработки текстов на естественном языке.

Введение в обработку естественных языков

Введение

Под обработкой естественных языков (Natural Language Processing, NLP) понимается создание систем, обрабатывающих или “понимающих” язык с целью выполнения определенных задач. Эти задачи могут включать:

  • Формирование ответов на вопросы (Question Answering) (то, что делают Siri, Alexa и Cortana)
  • Анализ эмоциональной окраски высказываний (Sentiment Analysis) (определение, имеет ли высказывание положительную или отрицательную коннотацию)
  • Нахождение текста, соответствующего изображению (Image to Text Mappings) (генерация подписи к входному изображению)
  • Машинный перевод (Machine Translation) (перевод абзаца текста с одного языка на другой)
  • Распознавание речи (Speech Recognition)
  • Морфологическая разметка (Part of Speech Tagging) (определение частей речи в предложении и их аннотирование)
  • Извлечение сущностей (Name Entity Recognition)

Традиционный подход к NLP предполагал глубокое знание предметной области – лингвистики. Понимание таких терминов, как фонемы и морфемы, было обязательным, так как существуют целые дисциплины лингвистики, посвященные их изучению. Посмотрим, как традиционное NLP распознало бы следующее слово:

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

Мы понимаем, что приставка (prefix) un- означает отрицание, и знаем, что -ed может означать время, к которому относится данное слово (в данном случае – прошедшее время). Распознав значение однокоренного слова interest, мы легко можем сделать вывод о значении и эмоциональной окраске всего слова. Вроде бы просто. Тем не менее, если принять во внимание все многообразие приставок и суффиксов английского языка, понадобится очень умелый лингвист, чтобы понять все возможные комбинации и их значения.


Пример, показывающий количество приставок суффиксов и корней в английском языке

Как использовать глубокое обучение

В основе глубокого обучения лежит обучение представлениям. Например, сверточные нейронные сети (Convolutional Neural Network, CNN) включают в себя объединение различных фильтров, предназначенных для классификации объектов по категориям. Здесь мы попытаемся применить похожий подход, создавая представления слов в больших наборах данных.

Структура статьи

Эта статья организована таким образом, чтобы мы могли пройти по основным элементам, из которых можно строить глубокие сети для NLP, а затем перейти к обсуждению некоторых приложений, которых касаются недавние научные работы. Ничего страшного, если вы не будете точно знать, почему, например, мы используем RNN, или чем полезен LSTM, но, надеюсь, изучив эти работы, вы поймете, почему глубокое обучение так важно для NLP.

Векторы слов

Так как глубокое обучение не может жить без математики, представим каждое слово в виде d-мерного вектора. Возьмем d=6.

Теперь подумаем, как заполнить значения. Мы хотим, чтобы вектор был заполнен таким образом, чтобы он каким-то образом представлял слово и его контекст, значение или семантику. Один из способов – построить матрицу совместной встречаемости (cooccurrence matrix). Рассмотрим следующее предложение:

Мы хотим получить векторное представление для каждого слова.

Матрица совместной встречаемости содержит количество раз, которое каждое слово встретилось в корпусе (обучающем наборе) после каждого другого слова этого корпуса.

Строки этой матрицы могут служить в качестве векторных представлений наших слов.


Обратите внимание, что даже из этой простой матрицы мы можем почерпнуть довольно важные сведения. Например, заметим, что векторы слов “love” и “like” содержат единицы в ячейках, отвечающих за их соседство с существительными (“NLP” и “dogs”). У них также стоит “1” там, где они соседствуют с “I”, показывая, что это слово, скорее всего, глагол. Можете себе представить, насколько проще выявлять подобные схожие черты, когда набор данных больше, чем одно предложение: в этом случае векторы таких глаголов, как “love”, “like” и других синонимов, будут похожи, так как эти слова будут использоваться в схожих контекстах.

Хорошо для начала, но здесь мы обращаем внимание, что размерность вектора каждого слова будет линейно возрастать в зависимости от размера корпуса. В случае миллиона слов (что немного для стандартных задач NLP), мы получили бы матрицу размерности миллион на миллион, которая, к тому же, была бы очень разреженной (с большим количеством нулей). Это определенно не лучший вариант с точки зрения эффективности хранения данных. В вопросе нахождения оптимального векторного представления слов было сделано несколько серьезных подвижек. Самая известная из них – Word2Vec.

Word2Vec

Главная цель всех методов инициализации вектора слова – хранить в этом векторе как можно больше информации, сохраняя разумную размерность (в идеале, от 25 до 1000). В основе Word2Vec лежит идея научиться прогнозировать окружающие слова для каждого слова. Рассмотрим предложение из предыдущего примера: “I love NLP and I like dogs”. Сейчас нас интересуют только три первые слова. Пусть размер нашего окна и будет равен трем.

Теперь мы хотим взять центральное слово “love” и предсказать слова, идущие до и после него. Как же мы это осуществим? Конечно же, с помощью максимизации и оптимизации функции! Формально наша функция пытается максимизировать логарифмическую вероятность каждого слова-контекста для текущего центрального слова.

Изучим вышеприведенную формулу подробнее. Из нее следует, что мы будем складывать логарифмическую вероятность совместной встречаемости как “I” и “love”, так и “NLP” и “love” (в обоих случаях “love” – центральное слово). Переменная T означает количество обучающих (training) предложений. Рассмотрим логарифмическую вероятность поближе.

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

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

(Дополнительно: дальше авторы работы подробно рассказывают о том, как с помощью негативного семплирования (negative sampling) и взятия подвыборок (subsampling) можно получить более точные векторы слов).

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


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

Бонус: еще один классный метод инициализации векторов слов – GloVe (Global Vector for Word Representation) (сочетает идеи матрицы совместной встречаемости с Word2Vec).

Рекуррентные нейронные сети (Recurrent Neural Networks, RNN)

Теперь посмотрим, как с нашими векторами будет работать рекуррентная нейронная сеть. RNN – палочка-выручалочка для большинства современных задач обработки естественного языка. Главное преимущество RNN в том, что они могут эффективно использовать данные с предыдущих шагов. Вот так выглядит маленький кусочек RNN:

Внизу изображены векторы слов (). У каждого вектора на каждом шаге есть скрытый вектор состояния (hidden state vector) (). Будем называть эту пару модулем (module).

Скрытое состояние в каждом модуле RNN – это функция от вектора слова и вектора скрытого состояния с прошлого шага.

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

Для получения выходных значений каждого модуля (Yhat) служит еще одна матрица весов – , умноженная на h.


Теперь давайте посмотрим со стороны и поймем, в чем состоят преимущества RNN. Наиболее явное отличие RNN от традиционной нейронной сети в том, что RNN принимает на вход последовательность входных данных (в нашем случае слов). Этим они отличаются, например, от типичных CNN, на вход которым подается целое изображение. Для RNN же входными данными может служить как короткое предложение, так и сочинение из пяти абзацев. Кроме того, порядок, в котором подаются данные, может влиять на то, как в процессе обучения меняются матрицы весов и векторы скрытых состояний. К концу обучения в векторах скрытых состояний должна накопиться информация из прошлых шагов.

Управляемые рекуррентные нейроны (Gated recurrent units, GRU)

Теперь давайте познакомимся с понятием управляемого рекуррентного нейрона, с помощью которых производится вычисление векторов скрытых состояний в RNN. Такой подход позволяет сохранять информацию о более отдаленных зависимостях. Давайте порассуждаем о том, почему отдаленные зависимости для обычных RNN могут стать проблемой. В время работы метода обратного распространения ошибки (backpropagation) ошибка будет двигаться по RNN от последнего шага к самому раннему. При достаточно малом начальном градиенте (скажем, менее 0.25) к третьему или четвертому модулю градиент почти исчезнет (так как по правилу производной сложной функции градиенты будут перемножаться), и тогда скрытые состояния самых первых шагов не обновятся.

В обычных RNN вектор скрытых состояний вычисляется по следующей формуле:


Метод GRU позволяет вычислять h(t) иначе. Вычисления разбиваются на три блока: фильтр обновления (update gate), фильтр сброса состояния (reset gate) и новый контейнер памяти (memory container). Обы фильтра – функции от входного векторного представления слова и скрытого состояния на предыдущем шаге.


Главное отличие состоит в том, что для каждого фильтра используются свои веса. Это обозначено разными верхними индексами. Фильтр обновления использует и , а фильтр сброса состояния – и .

Теперь рассчитаем контейнер памяти:


(пустой кружок здесь обозначает произведение Адамара).

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

Окончательную формулу h(t) можно записать как

– функция от всех трех компонентов: фильтра обновления, фильтра сброса состояния и контейнера памяти. Можно лучше понять это, визуализируя, что происходит с формулой, когда близится к 1 и когда близко к 0. В первом случай вектор скрытого состояния в большей степени зависит от предыдущего скрытого состояния, а текущий контейнер памяти не принимается во внимание, так как (1 – ) стремится к 0. Когда же близится к 1, новый вектор скрытого состояния , наоборот, зависит в основном от контейнера памяти, а предыдущее скрытое состояние не учитывается. Итак, наши три компонента можно интуитивно описать следующим образом:

Приведем пример, иллюстрирующий работу GRU. Допустим, у нас есть следующие несколько предложений:

и вопрос: “Чему равна сумма двух чисел?” Так как предложение посередине никак не влияет на ответ, фильтры сброса и обновления позволят модели “забыть” это предложение и понять, что изменять скрытое состояние может только определенная информация (в данном случае, числа).

Нейроны с длительной кратковременной памятью (Long short-term memory, LSTM)

Если вы разобрались с GRU, то LSTM не составит для вас трудности. LSTM также состоит из последовательности фильтров.

LSTM определенно принимает на вход больше информации. Так как ее можно считать расширением GRU, я не буду разбирать ее подробно, а чтобы получить детальное описание каждого фильтра и каждого шага вычислений, вы можете обратиться к прекрасно написанному блог-посту Криса Олаха (Chris Olah). На текущий момент это самый популярный тьюториал по LSTM, и точно поможет тем из вас, кто ищет понятное и интуитивное объяснение работы этого метода.

Сравнение LSTM и GRU

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

Различие между двумя методами состоит в количестве фильтров (GRU – 2, LSTM – 3). Это влияет на количество нелинейностей, которое приходит от входных данных и в конечном итоге влияет на процесс вычислений. Кроме того, в GRU отсутствует ячейка памяти , как в LSTM.

Перед тем, как углубиться в статьи

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

Теперь, когда мы начали хорошо разбираться в рекуррентных нейронных сетях применительно к NLP, давайте ознакомимся с некоторыми работами в этой области. Так как NLP включает в себя несколько различных областей задач (от машинного перевода до формирования ответов на вопросы), мы могли бы рассмотреть довольно много работ, но я выбрал те три, которые нашел особенно информативными. В 2016 году случился ряд серьезных продвижений в области NLP, но начнем с одной работы 2015 года.

Введение

Первая работа, которую мы обсудим, оказала большое влияние на развитие области формирования ответов на вопросы. В этой публикации авторства Джейсона Вестона (Jason Weston), Сумита Чопры (Sumit Chopra) и Антуана Бордеса (Antoine Bordes) был впервые описан класс моделей под названием ”сети с памятью”.

Интуитивно-понятная идея состоит в следующем: для того, чтобы точно ответить на вопрос, относящийся к фрагменту текста, необходимо каким-то образом хранить предоставленную нам исходную информацию. Если бы я спросил вас: “Что означает аббревиатура RNN?”, вы смогли бы ответить мне, потому что информация, которую вы усвоили, читая первую часть статьи, сохранилась где-то в вашей памяти. Вам понадобилось бы лишь несколько секунд, чтобы найти эту информацию и озвучить ее. Я понятия не имею, как это получается у мозга, но мысль о том, что необходимо пространство для хранения этой информации, остается неизменной.

Сеть с памятью, описанная в данной работе, уникальна, так как у нее есть ассоциативная память, в которую она может писать и из которой она может читать. Интересно заметить, что подобную память не используют ни CNN, ни Q-Network (для обучения с подкреплением (reinforcement learning), ни традиционные нейронные сети. Это отчасти связано с тем, что задача формирования ответов на вопросы в большой степени полагается на способность моделировать или прослеживать отдаленные зависимости, например, следить за героями истории или запоминать последовательность событий. В CNN или Q-Networks память как бы встроена в веса системы, так как она обучается различным фильтрам или картам соответствий состояний и действий. На первый взгляд, можно было бы использовать RNN или LSTM, но обычно они не способны запоминать входные данные из прошлого (что является критичным для задач формирования ответов на вопросы).

Архитектура сети

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

Следующий шаг – взять представление в пространстве признаков I(x) и считать в память новую порцию входных данных x.

Память m можно рассматривать как подобие массива, составленного из отдельных блоков памяти . Каждый такой блок может быть функцией от всей памяти m, представления в пространстве признаков I(x) и/или самого себя. Функция G может просто хранить все представление I(x) в блоке памяти mi. Функцию G можно изменить так, чтобы она обновляла память о прошлом на основе новых входных данных. Третий и четвертый шаги включают в себя чтение из памяти с учетом вопроса, чтобы найти представление признаков o, и его декодирование, чтобы получить окончательный ответ r.

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

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


Мы находим аргумент максимизации (argmax) оценочной функции, чтобы найти представление, наиболее соответствующее вопросу (можно также выбрать несколько блоков с самыми высокими оценками, не обязательно ровно один). Оценочная функция вычисляет матричное произведение между различными векторными представлениями вопроса и выбранным блоком (или блоками) памяти (подробности вы найдете в самой работе). Можете представить этот процесс как перемножение двух векторов из двух слов, чтобы определить, равны ли они. Выходное представление о затем передается RNN, LSTM или другой оценочной функции, которая вернет человекочитаемый ответ.

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

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

Введение

Следующая работа рассказывает о прогрессе в области анализа эмоциональной окраски – задачи определения, имеет высказывание положительную или отрицательную коннотацию (значение). Формально эмоциональную окраску можно определить как “взгляд на ситуацию или событие или отношение к ним”. На тот момент наиболее распространенным инструментом для задач распознавания эмоциональной окраски были LSTM. Работа авторства Кай Шенг Тай (Kai Sheng Tai), Ричарда Сочера (Richard Socher) и Кристофера Маннинга (Christopher Manning) вводит принципиально новый способ объединения нескольких LSTM-нейронов в нелинейную структуру.

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

Архитектура сети

Одно из отличий Tree-LSTM от обычного LSTM состоит в том, что во последнем скрытое состояние – функция от текущих входных данных и и скрытого состояния на предыдущем шаге. В Tree-LSTM скрытое состояние – функция от текущих входных данных и скрытых состояний его дочерних нейронов.

Вместе с новой структурой – деревом – вводятся также некоторые изменения в математике сети, например, у дочерних нейронов теперь есть фильтры забывания. С подробностями можно познакомится в самой работе. А я хотел бы уделить внимание объяснению, почему такие сети работают лучше линейных LSTM.

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

Введение

Последняя работа, которую мы сегодня рассмотрим, описывает подход к решению задачи машинного перевода. Авторы этой работы – специалисты Google по машинному обучению Джефф Дин (Jeff Dean), Грег Коррадо (Greg Corrado), Ориал Виньялс (Orial Vinyals) и другие – представляют систему машинного обучения, которая лежит в основе широко известного сервиса Google Translate. С введением этой системы количество ошибок перевода сократилось в среднем на 60% по сравнению с прежней системой, используемой Google.

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

Архитектура сети

Авторы этой статьи описывают глубокую сеть LSTM, которая может быть от обучена с помощью восьми слоем энкодеров и декодеров. Мы можем разделить систему на три компонента: энкодер RNN, декодер RNN и модуль “внимания” (attention module). Энкодер работает над задачей преобразования входного предложения в векторное представление, декодер возвращает выходное представление, затем модуль внимания сообщает декодеру, на чем следует заострить внимание во время операции декодирования (здесь вступает идея использования всего контекста предложения).

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

Заключение

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

О, а приходите к нам работать? 🙂wunderfund.io — молодой фонд, который занимается высокочастотной алготорговлей. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.

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

Присоединяйтесь к нашей команде: wunderfund.io

Генерация программы из описания на естественном языке / Habr

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

Авторы исследования тренировали RNN-сеть, используя базу с короткими программами, которые писались студентами и были определены как валидные (путем запуска системой проверки заданий). Описания заданий были сокращены до такого: «найти максимальное и следующее за ним по величине число».

В результате был сгенерирован следующий код (стиль отступов и пунктуация «автора» сохранены без изменений):


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

Важно, что сгенерированный код не содержал в чистом виде ни одного из исходных примеров. В противном случае, пришлось бы признать, что таким извращенным способом удалось написать обычную систему поиска по базе кода. С помощью ccfinder были найдены наиболее близкие примеры из обучающей выборки (более 500 образцов исходного кода):

Из первого примера взята структура, из второго — наименования идентификаторов.

Интересно, что сеть сама определила синонимичность конструкций “i<n” и “i<=n-1”.

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

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *