Генериране на почти смислени текстове на Haskell, бележки на програмиста
Генериране на почти смислени текстове на Haskell
Наскоро в блога на Darkus беше повдигната темата за генериране на уникални текстове, съдържащи някакво значение. Тоест говорим за генериране на нормални текстове, като това, което четете в момента, а не просто за бъркотия от думи. Темата ме „закачи“ и при втория опит успях да напиша доста добър, както ми се струва, генератор. Въпреки това, като графичен блогър, ще започна малко отдалеч ...
Как обикновено се опитват
Синтезът на текст е една от областите на изкуствения интелект, което означава, че хората са започнали сериозно да се замислят за това преди поне 50 години. В днешно време тази задача засяга особено умовете на уеб администраторите по очевидни причини. Въпреки това сред конструкторите на сайтове са широко разпространени само най-примитивните подходи за генериране на текст. Някои от тях:
- Синонимизацията е, когато изрази или отделни думи се заменят със семантични аналози в завършения текст. Нещо повече, синонимизирането често се извършва ръчно или полуавтоматично, въпреки че би било много по-ефективно да се индексират няколко милиона уеб страници, да се намерят няколко хиляди от най-често използваните фрази в тях и въз основа на тях ръчно да се състави база на регулярен израз за извършване на замествания в текста. Този подход автоматично ще пренапише новини от всеки новинарски сайт.
- Възпроизвеждането е подобно на синонимизацията, но включва пренареждане на фрази, изречения или дори цели параграфи. Възпроизвеждането на текст обикновено се извършва полуавтоматично. умножен текст, от който с помощта на скрипт се създават няколкостотин почти уникални статии. Можете да намерите пример за такъв скрипт за разпространение в 4-ти абзац на тази бележка.
- Марковските вериги, както се оказа, също отдавна са известни сред SEO. Използвайки този подход, можете да генерирате както смислени текстове, така и бъркотия от думи. Търсачките обаче разпознават мишмаш и за да генерирате смислени текстове, трябва да седнете и да помислите добре. Следователно SEO оптимизаторите са по-любими на синонимизацията и възпроизвеждането.
Както обикновено, не се опитвайте да правите
За да бъда честен, първо се опитах да генерирам бъркотия от думи, използвайки вериги на Марков. Генерираният текст изглеждаше по следния начин:
те го предпочитат, последван от мегафон и билайн не е записан, отбелязва вестникът, говорител на МВФ Дейвид Хоули отказва да предостави каквато и да е информация за имейли на потребители на къпина и други точки в новата игра ще преследват значително повече зомбита оцелели
Това не е точно това, което бихме искали да получим. Въпреки че подобен текст може да служи като, да речем, малко допълнение към copy-paste.
Вторият опит беше по-успешен. Същността на идеята е, че съществува определен модел на света, един вид сцена, изпълнена със случайни обекти от определена предметна област. Обектите имат някои свойства (тегло, цена, цвят, ...) и най-вероятно са някак свързани помежду си (програма X е инсталирана на компютър Y). Освен това на сцената се случват някои произволни действия, прехвърлящи сцената от едно състояние в друго.
Всеки съвременен език за програмиране улеснява описанието на такава сцена и действията върху нея. Броят на обектите, техните свойства и действия на сцената могат да бъдат много големи. След като написахме програма, способна да създаде текстово описание на сцена, действия на сцената и резултата от тези действия, ще получим добър генератор на текст. Вече имаме под ръка почти всичко, от което се нуждаем. Съществителните съответстват на обекти, прилагателните съответстват на техните свойства, а глаголите съответстват на действия върху обекти. Остава само да се свърже всичко в смислен текст.
Всъщност описаната идея трудно може да претендира за нова. Сигурен съм, че хората с изкуствен интелект смятат, че програмирането на подобни неща е глупост.
Думите са евтини, покажете ми кода
Като модел на света избрах подреден набор от триизмерни геометрични фигури с различни цветове. В света има три възможни действия - добавяне на фигура, изтриване на фигура и пренареждане на две фигури. Можете да изтеглите източниците на получения генератор (около 250 непразни реда в Haskell) тук.
Описанието на световния модел може да бъде намерено във файла Model.hs:
-- (в) Александър А Алексеев 2011 | http://eax.me/
модул Модел където
система за импортиране. Случайно
импортиране на данни. Списък
данни Цвят = Червен | Зелено | Синьо | Черен | Бяло | Портокал | Жълто |
Лилаво | Кафяво
производно (Eq, Enum, Bounded, Show)
форма на данни = куб | Пирамида | Цилиндър | Паралелепипед | Сфера
производно (Eq, Enum, Bounded, Show)
данни Обект = Обект < color: Color, shape: Shape >
производно (Eq, Bounded, Show)
екземпляр Enum Обект къде
fromEnum t = отEnum (цвят t) *
(1 + отEnum (maxBound: Shape)) +
отEnum (форма t)
toEnum n =
Обект < color = toEnum cn, shape = toEnum sn >
където
cn = n `div` (1 + отEnum (maxBound: Shape))
sn = n `mod` (1 + отEnum (maxBound: Shape))