Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Как мутировать текст?

#текст #разметка #семантика


Задача генерировать некое количество похожих по содержанию, но не совпадающих 1:1
коротких текстов – например, постов в соц. сети.

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

Псевдокод:

{gender:Решил|решила} {random:попробовать|испытать|потестить} 
{random:новый сервис|новую примочку} для моих задач.


Если усложнять, понадобятся кросс-связи для родов-падежей выбранных вариантов в разных
частях предложения. Глобальные и локальные переменные. Целый ЯП?

Вопрос: существует ли стандартный подход к такой задаче (как называется такая задача),
есть ли язык разметки, подходящий для описания таких шаблонов?



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


Ответы

Ответ 1



Никогда этим не занимался, но знаю что обычно для этого используют цепи Маркова. Информация для размышления. Второй источник пищи к размышлению. Описывается система перевода, общий принцип работы которой сводится к последовательности преобразований: язык 1->анализ->семантическое описание->генерация->язык 2. Как вы понимаете у вас на входе и на выходе должен быть один и тот же язык, плюс потребуется в семантическом описании подставлять синонимы в разных комбинациях. Можно сделать более простой вариант который содержал бы только второй этап - генерацию. Вообще к чему я это все, а к тому что стоит поискать переводчики с открытым кодом реализующими приведенный принцип. Кстати сам Сокирко со товарищи выложил свои наработки под GPL. Это не система перевода а система анализа, но главное там есть инструменты для работы с семантическими описаниями.

Ответ 2



Ну предположим, так (работает в Firefox актуальной версии): var processors = { gender(options, m, w) { return options.gender === 'm' ? m : w; }, random(options, ...a) { return a[Math.random() * a.length | 0]; } }; function generate(template, options) { return template.replace(/\{(\w+):(.*?)\}/g, function (match, key, str) { return processors[key] ? processors[key].apply(null, [options].concat(str.match(/(\\[{}|\\]|[^|])+/g))) : match; }); } var template = "{gender:Решил|Решила} {random:попробовать|испытать|потестить} \n\ {random:новый сервис|новую примочку} для моих задач." for (var q=0; q<10; ++q) console.log(generate(template, { gender: 'mw'[q&1] })); Вроде сюда можно добавить любую желаемую логику.

Комментариев нет:

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