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