Каждый веб-оптимизатор знает, что для того чтобы сайт любили поисковики, он должен содержать уникальные тексты. Причем не абы какие наборы слов, а осмысленные предложения, желательно по теме сайта. Особо это проблема для агрегаторов, которые берут информацию с других сайтов, и интернет-магазинов, где параметры и данные о товарах в целом одинаковые. Поэтому стандартная практика в этой ситуации — заказывать уникальные тексты копирайтерам. Стоимость такого удовольствия от 50 до 300 руб. за 1000 знаков. Если на вашем сайте 10000 страниц, то уникальные тексты быстро становятся значительной статьей расхода.
В этой статье поговорим методах алгоритмической генерации текстов и расскажем о нашем опыте работы с ними.
Сразу уточним, что речь пойдет о генерации осмысленных и полезных текстов, а не текстоподобного мусора, который можно легко создать в огромных количествах. Не редко высказывается мнение, что автоматически эту задачу решить нельзя, но на практике это убеждение уже устарело.
В качестве задачи, рассмотрим вопрос автоматической генерации описаний товара на основании отзывов. Т.е. имея несколько отзывов пользователей товара, полученных с разных сайтов, создать автоматически небольшой уникальный текст, подытоживающий сведения из отзывов. Эта задача более сложна, чем, скажем, генерация текста на основании характеристик товара, т. к. мы должны сначала извлечь некую информацию из отзывов, а потом на ее основании создать новый текст.
Допустим мы работаем с отзывами о телефонах. Какую информацию мы можем извлечь? На поверхностном уровне, мы можем определить, является ли отзыв положительным или отрицательным, с помощью классификатора текстов, а затем извлечь список упоминаемых аспектов телефона. Например, самый простой способ это анализ по словарю вхождений слов, таких как «удобство», «экран», «батарея», «громкость» и т. п. Более точный способ выделения аспектов и их оценок может опираться на обучаемую систему выделения информации из текста.
Таким образом, мы можем получить данные вида {удобство:+, громкость -, экран+...}. Не очень много информации, но для начала сойдет. Теперь нужно создать текст. Посмотрим, как это можно сделать.
Шаблоны. Первое, что приходит в голову — использовать шаблоны. Т.е. заготовить заранее предложения вида «Этот телефон очень удобный», «Громкость хорошая» и т. п. Потом пройтись по списку признаков и вставить соответствующие предложения. Для нашего примера получится что-то вроде.
Этот телефон очень удобный. Громкость оставляет желать лучшего. Экран достаточно хороший.
Текст относительно осмысленный, и более или менее читаемый, но уникальным он быстро перестанет быть, так как разнообразие вариантов невелико. Это плохо для поисковых систем, да и читателя со временем будет раздражать.
Формальные грамматики. Представим себе такой набор правил:
$удобство ← $phone $conv
$phone ← $this $phone-ex
$conv ← $mod $conv-ex
$mod ← очень
$mod ← достаточно
$mod ←
$phone-ex ← телефон
$phone-ex ← девайс
$this ← этот
$this ←
$conv-ex ← удобный $use
$conv-ex ← удобен
$use ← в использовании
$use ←
начнем с самого верхнего правила и будем подставлять значения символов справа: $удобство => $phone $conv => $this $phone-ex $mod $conv-ex => этот девайс достаточно удобен
Если выбирать правило для следующей подстановки случайным образом, то получаются разные предложения. Например, тот же самый набор правил может сгенерировать: телефон очень удобный и данный девайс очень удобен в использовании
Такой набор правил описывает много различных вариантов предложений и обеспечивает значительно большую вариабельность. При известном трудолюбии можно написать правила, которые позволят генерировать разнообразные и достаточно удобочитаемые тексты.
Для примера приведу сгенерированное таким образом описание телефона с reviewdot.ru
Минусы же такого метода — ограниченный словарный запас, достаточно большая трудоемкость (создание правил требует времени и сил).
Для английского языка существует много готовых пакетов генерации языка, которые включают в себя также основанные на правилах системы планирования предложения и собственного его генерации. Например, SimpleNLG, ну и масса других, от простых до очень продвинутых. С русским языком ситуация несколько хуже, но как мы видели, написать простой генератор языка на формальной грамматике относительно не сложно, и умеет он достаточно много.
Нейронные сети. Наша последняя разработка — генерирующая тексты нейронная сеть. Статья о ней недавно опубликована в материалах конференции Диалог-2015 (статья на английском доступна тут). Эта система учится генерировать новые тексты на примерах.
Принцип ее работы похож на тот, который мы уже описывали в статье про чатбот. Разница заключается в том, что имеется дополнительный слой нейронов, который получает одновременно информацию о текущем слове предложения и наборе аспектов, которые в это предложение входят. Таким образом, список аспектов кодируется вектором, где каждому измерению соответствует один аспект, а значение этого измерения (1 или 0) кодирует присутствие или отсутствие этого аспекта в данном предложении. Задачей нейронной сети является предсказать следующее слово, зная текущее слово и вектор аспектов. Ниже приведена схема из нашей статьи, с переведенными на русский подписями:
Обученная нейронная сеть, получив на вход список аспектов способна генерировать новые предложения. Вот пример текстов, которые получаются в результате:
Главный минус — некоторая корявость текстов, грамматические и смысловые ошибки. Плюс — разнообразие, более естественное ощущение, нет необходимости вручную разрабатывать правила. Как вариант применения — можно нагенерировать много текстов, а потом вручную исправить кривые места — все же значительно быстрее, чем писать вручную с нуля, особенно если предполагается написание текстов на основании анализа реальных отзывов.
Ну и конечно, модель не ограничена только предметной областью отзывов — ее можно обучить в принципе на любых текстах.
В заключении, мне хочется процитировать небольшой фрагмент фантастического рассказа Пьера Буля «Идеальный робот», 1953 года:
Фразы типа „картридер, который не кирпич, вполне миниатюрный“ неизменно напоминают мне „жидкий баран летает в заостренном небе“, но в целом, можно сказать, что спустя полвека задача автоматического создания текстов перешла из области фантастики в область практических приложений.
В этой статье поговорим методах алгоритмической генерации текстов и расскажем о нашем опыте работы с ними.
Сразу уточним, что речь пойдет о генерации осмысленных и полезных текстов, а не текстоподобного мусора, который можно легко создать в огромных количествах. Не редко высказывается мнение, что автоматически эту задачу решить нельзя, но на практике это убеждение уже устарело.
В качестве задачи, рассмотрим вопрос автоматической генерации описаний товара на основании отзывов. Т.е. имея несколько отзывов пользователей товара, полученных с разных сайтов, создать автоматически небольшой уникальный текст, подытоживающий сведения из отзывов. Эта задача более сложна, чем, скажем, генерация текста на основании характеристик товара, т. к. мы должны сначала извлечь некую информацию из отзывов, а потом на ее основании создать новый текст.
Допустим мы работаем с отзывами о телефонах. Какую информацию мы можем извлечь? На поверхностном уровне, мы можем определить, является ли отзыв положительным или отрицательным, с помощью классификатора текстов, а затем извлечь список упоминаемых аспектов телефона. Например, самый простой способ это анализ по словарю вхождений слов, таких как «удобство», «экран», «батарея», «громкость» и т. п. Более точный способ выделения аспектов и их оценок может опираться на обучаемую систему выделения информации из текста.
Таким образом, мы можем получить данные вида {удобство:+, громкость -, экран+...}. Не очень много информации, но для начала сойдет. Теперь нужно создать текст. Посмотрим, как это можно сделать.
Шаблоны. Первое, что приходит в голову — использовать шаблоны. Т.е. заготовить заранее предложения вида «Этот телефон очень удобный», «Громкость хорошая» и т. п. Потом пройтись по списку признаков и вставить соответствующие предложения. Для нашего примера получится что-то вроде.
Этот телефон очень удобный. Громкость оставляет желать лучшего. Экран достаточно хороший.
Текст относительно осмысленный, и более или менее читаемый, но уникальным он быстро перестанет быть, так как разнообразие вариантов невелико. Это плохо для поисковых систем, да и читателя со временем будет раздражать.
Формальные грамматики. Представим себе такой набор правил:
$удобство ← $phone $conv
$phone ← $this $phone-ex
$conv ← $mod $conv-ex
$mod ← очень
$mod ← достаточно
$mod ←
$phone-ex ← телефон
$phone-ex ← девайс
$this ← этот
$this ←
$conv-ex ← удобный $use
$conv-ex ← удобен
$use ← в использовании
$use ←
начнем с самого верхнего правила и будем подставлять значения символов справа: $удобство => $phone $conv => $this $phone-ex $mod $conv-ex => этот девайс достаточно удобен
Если выбирать правило для следующей подстановки случайным образом, то получаются разные предложения. Например, тот же самый набор правил может сгенерировать: телефон очень удобный и данный девайс очень удобен в использовании
Такой набор правил описывает много различных вариантов предложений и обеспечивает значительно большую вариабельность. При известном трудолюбии можно написать правила, которые позволят генерировать разнообразные и достаточно удобочитаемые тексты.
Для примера приведу сгенерированное таким образом описание телефона с reviewdot.ru
Мы изучили 295 отзывов. Есть основания считать, что такого количества достаточно для получения анализа. Основное большинство людей довольно этим телефоном, но имеются некоторые не очень хорошие мнения.
Достоинства: пользователи, оставившие отзывы, как правило выделяют cреди преимуществ дизайн и достаточное удобство в использовании. В дополнение к этому в общем удовлетворены пользователи, отзывы которых удалось обнаружить, качеством батареи, громкости, звука, камеры, клавиатуры, корпуса, пластика, прочности, экрана.
Недостатки: в качестве недостатков обыкновенно упоминаются надежность.
Минусы же такого метода — ограниченный словарный запас, достаточно большая трудоемкость (создание правил требует времени и сил).
Для английского языка существует много готовых пакетов генерации языка, которые включают в себя также основанные на правилах системы планирования предложения и собственного его генерации. Например, SimpleNLG, ну и масса других, от простых до очень продвинутых. С русским языком ситуация несколько хуже, но как мы видели, написать простой генератор языка на формальной грамматике относительно не сложно, и умеет он достаточно много.
Нейронные сети. Наша последняя разработка — генерирующая тексты нейронная сеть. Статья о ней недавно опубликована в материалах конференции Диалог-2015 (статья на английском доступна тут). Эта система учится генерировать новые тексты на примерах.
Принцип ее работы похож на тот, который мы уже описывали в статье про чатбот. Разница заключается в том, что имеется дополнительный слой нейронов, который получает одновременно информацию о текущем слове предложения и наборе аспектов, которые в это предложение входят. Таким образом, список аспектов кодируется вектором, где каждому измерению соответствует один аспект, а значение этого измерения (1 или 0) кодирует присутствие или отсутствие этого аспекта в данном предложении. Задачей нейронной сети является предсказать следующее слово, зная текущее слово и вектор аспектов. Ниже приведена схема из нашей статьи, с переведенными на русский подписями:
Обученная нейронная сеть, получив на вход список аспектов способна генерировать новые предложения. Вот пример текстов, которые получаются в результате:
Удобный, плеер, батарея. Удобный звук, металлический корпус,. Маленькая цена, да и простой в использовании. Экран, 2 сим карты, 2 аккумулятор.
Большой вес, большой экран, привлекательный, хорошая камера. Садится дизайн+хорошая супер камера, идут почти все игры ( некоторые просят оперативки ) большой.
Аккумулятор, скорость красивая,. Дизайн, звук, функционал, масса разных дней хватает. Красив, том несколько назад, процессор, отзывчивый сенсор. Красивый экран, цветопередача. Дизайн, батарея, не тормозят, практичный.
Качество сборки, удобный интерфейс. Великолепный амолед дисплей, кнопки, камера, и все игры. дизайн, быстрый интернет, хорошо ловит сеть. Яркий размер, приятно тяжелый, хорошо лежит в руке. Красивый экран, быстродействие, интернет, java. Богатый аккумулятор, быстрый функционал, надёжность. сильный, дорогой проц, отличный звук, быстрый проц
Имеет флешку, джава приложения, картридер, который не кирпич, вполне миниатюрный, динамик не глючит. Корпус качественный особенно большие кнопки, хорошая комплектация.
Главный минус — некоторая корявость текстов, грамматические и смысловые ошибки. Плюс — разнообразие, более естественное ощущение, нет необходимости вручную разрабатывать правила. Как вариант применения — можно нагенерировать много текстов, а потом вручную исправить кривые места — все же значительно быстрее, чем писать вручную с нуля, особенно если предполагается написание текстов на основании анализа реальных отзывов.
Ну и конечно, модель не ограничена только предметной областью отзывов — ее можно обучить в принципе на любых текстах.
В заключении, мне хочется процитировать небольшой фрагмент фантастического рассказа Пьера Буля «Идеальный робот», 1953 года:
«Если будет выбрано существительное «баран» робот сумеет скомбинировать это слово грамматически с подходящим прилагательным, иначе говоря — выбрать нужное из таких словосочетаний, как «жидкий баран», «туманный баран»или «белый баран», исключая те, что нарушают правила соответствия грамматического рода и числа, как, например, «лучезарная баран»или «белые баран».
— «Жидкий баран» —бессмысленное словосочетание, — прервал профессора Дух противоречия.
— Дай же мне закончить! Все в свое время… Мы не предвидим особых осложнений и на следующем этапе: при образовании законченной фразы по правилам синтаксиса. Эти правила точно определены, так что машина сумеет принять их так же, как человеческий мозг, а может быть, и еще лучше. Так мы добьемся образования некоторого количества грамматически правильных фраз, вроде «жидкий баран летает в заостренном небе» или же «белый баран ест траву»…
— Вот тут-то я тебя и поймал! — обрадовался Дух противоречия. — Большинство твоих фраз, как ты говоришь, грамматически правильных, будут бессмысленны!
Они будут безупречны с точки зрения формы...»
Фразы типа „картридер, который не кирпич, вполне миниатюрный“ неизменно напоминают мне „жидкий баран летает в заостренном небе“, но в целом, можно сказать, что спустя полвека задача автоматического создания текстов перешла из области фантастики в область практических приложений.