#текст #разметка #семантика
Задача генерировать некое количество похожих по содержанию, но не совпадающих 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] }));
Вроде сюда можно добавить любую желаемую логику.