Pers.narod.ru. PHP. Генератор синтаксически правильного русского текста Geniot |
Подозрительные идиотические тени идеалистической подвыпившей души - это развития. Авторы баз, не упрощав, защищайте себя ребенком хронического безобразия лекций, обеспечивающих четверг среды общественной основе.
© программа Geniot
Слово "гениот" принадлежит перу Григория Климова - лучшего из известных мне авторов, писавших о законах и тайных пружинах развития человеческого общества. Оно обозначает буквально "гениальный идиот", человек, чрезвычайно активно несущий заумную чушь и навязывающий другим эту чушь в качестве откровений. Такими гениотами кажется мне подавляющее большинство политиков и общественных деятелей, чья фразеология, возможно, повлияла на словарь программы, несущей подобный же бред :)
Описание скрипта Geniot, демо, ссылка для скачивания |
Скрипт Geniot предназначен для генерации синтаксически правильного русского текста на основе набора слов, словоформ и настраиваемых парадигм предложений. Это только демка, она не претендует на безошибочность, также при реальном использовании я бы исключил некоторые чрезмерно сложные и редко используемые конструкции фраз. О найденных ошибках и несоблюдаемых программой правилах русского языка можно сообщить мне (желательно, вместе с самими правилами, которых я почти не знаю :)
Посмотреть в работе: ссылка (новое окно)
Скачать: geniot.zip, 17 Кб. Версия 1.0 (28.10.2008)
Написано 24-26 октября 2008 г. на PHP без использования MySQL, совместимо с любым PHP 4.0.2 и выше.
Настройки скрипта просты. В начале файла config.php можно изменить путь к папке с даннными скрипта и число создаваемых фраз по умолчанию:
//Путь к папке с файлами *.dat и *.txt, БЕЗ слеша в конце $datapath="./data"; //Число выводимых фраз по умолчанию (параметр n) $default_phrases = 100;
Можно создать собственные файлы data/head.inc и data/foot.inc, представляющие собой обычный HTML-код, выводимый в начале и в конце каждой страницы. В файле head.inc содержится также пример формы для вызова скрипта извне (настроена на URL http://127.0.0.1/geniot/index.php, т.е., при размещении на локальном хосте Windows скрипт можно кинуть в папку c:\\Inetpub\\wwwroot\\geniot).
Скрипт реагирует только на 2 параметра, передаваемые методом GET:
Очевидные изменения, которые можно сделать, следующие:
Буду признателен, если вы пришлете мне что-либо полезное для развития скрипта. Также замечу, что скрипт не предназначен для SEO и создания поискового спама, если Вы используете его с подобными целями - это целиком остается на вашей совести.
Словари |
Далее следует краткое описание файлов программы, сделанное для себя в процессе ее написания.
СУЩЕСТВИТЕЛЬНЫЕ: файл such.txt слово род(м/ж/c) одушевленность(н/о) номер парадигмы из such.dat Например: абстракция ж н 11 МАССИВЫ В ПРОГРАММЕ: $such['such_word'] $such['such_r'] $such['such_o'] $such['such_num'] КОЛИЧЕСТВО СУЩЕСТВИТЕЛЬНЫХ: $such_count ФОРМЫ СУЩЕСТВИТЕЛЬНЫХ: файл such.dat В каждой строке 12 окончаний - единственное, затем множественное число по падежам: ИП (кто/что) РП (кого/чего) ДП (кому/чему) ВП (кого/что) ТП (кем/чем) ПП (о ком/о чем) 0 обозначает, что окончания нет. Например: 0 а у 0 ом е а ов ам а ами ах #дом Во всех файлах данных не читаются пустые строки и концы строк после знака # МАССИВЫ В ПРОГРАММЕ: $sp['sp_IP1'] $sp['sp_RP1'] $sp['sp_DP1'] $sp['sp_VP1'] $sp['sp_TP1'] $sp['sp_PP1'] $sp['sp_IP2'] $sp['sp_RP2'] $sp['sp_DP2'] $sp['sp_VP2'] $sp['sp_TP2'] $sp['sp_PP2'] КОЛИЧЕСТВО ПРИЛАГАТЕЛЬНЫХ: $sp_count Функция генерации: word_such(ч,р,п,о) При разборе всегда отбрасываем окончание слова в именительном падеже единственного числа (если таковое есть), затем подставляем нужные окончания с конца слова. ПРИЛАГАТЕЛЬНЫЕ: файл pril.txt слово (м.р., ед.ч.) форма (1-10) Например: абстрактный 1 Массивы в программе: $pril['pril_word'] $pril['pril_num'] КОЛИЧЕСТВО $pril_count Например: абсолютный 1 Формы прилагательных; файл pril.dat Всего 21 окончание, сначала 16 для единственного числа мужской род (5): ИП (Какой) РП (какого) ДП (какому) ВП - как ИП(*) ТП (каким) ПП (о каком) //0-4 женский род (6): ИП (Какая) РП (какой) ДП (какой) ВП (какую) ТП (какой) ПП (о какой) //5-10 средний род (5): ИП (Какое) РП (какого) ДП (какому) ВП - как ИП(*) ТП (каким) ПП (о каком) //11-15 затем 5 для множественного числа множ. число (5): ИП (Какие) РП (каких) ДП (каким) ВП - как ИП(*) ТП (какими) ПП (о каких) //16-20 **** - формы нет в файле, она может определяться программно. Массивы в программе - $pp[]. Их 24 (с учетом отсутствующих в файле падежей) $pp['pp_IPM1'] $pp['pp_RPM1'] $pp['pp_DPM1'] $pp['pp_VPM1'] $pp['pp_TPM1'] $pp['pp_PPM1'] - Муж. 6 пад.ед.ч. Z - Жен. 6 пад.ед.ч. S - Сред.6 пад.ед.ч. $pp['pp_IP2'] $pp['pp_RP2'] $pp['pp_DP2'] $pp['pp_VP2'] $pp['pp_TP2'] $pp['pp_PP2'] - Все, 6 пад.мн.ч. КОЛИЧЕСТВО $pp_count Например: ый ого ому ым ом ая ой ой ую ой ой ое ого ому ым ом ые ых ым ыми ых Функция генерации: word_pril(ч,р,п,о) ГЛАГОЛЫ: файл glag.txt слово (неопр.форма) парагдигма (1-44) glag_word glag_num есть ли причастия: 5 штук - дейст.наст. и прош., страд.наст. и прош., деепр. glag_prich (5) соверш.вид (что сделать), н - несоверш. (что делать) glag_v управляет ли род.падежом : н - никогда, п - может, с - всегда glag_p (5) управляет ли дат.падежом : н - никогда, п - может, с - всегда управляет ли вин.падежом : н - никогда, п - может, с - всегда; м - модальный управляет ли твор.падежом : н - никогда, п - может, с - всегда; для модальных - вид второго: н, б или * (любой) управляет ли пред.падежом (с предлогом о):н - нет, п - может, с - всегда управляет ли обст.места (где?) : н - нет, п - может, с - всегда glag_ob (3) управляет ли обст.обр.действ. (как?) : н - нет, п - может, с - всегда управляет ли обст.места (куда?) : н - нет, п - может, с - всегда Например: абстрагировать 2 +++-+ н ннпнн ппн КОЛИЧЕСТВО $glag_count Формы глаголов: файл glag.dat --- окончание определяется отбрасыванием от слова окончания неопределенной формы --- ? обозначает, что форма не существует $gp[] 19 элементов неопр. форма //0 gp_NF я... ты... он... мы... вы... они... (настоящее время по лицу и числу) //1-6 //gp_PNVED1 gp_PNVED2 gp_PNVED3 gp_PNVMN1 gp_PNVMN2 gp_PNVMN3 он_совал она_совала оно_совало они_совали (прошедшее время по роду и числу) //7-10 gp_PPVED3M gp_PPVED3Z gp_PPVED3S gp_PPVMN3 для будущего времени также учесть #буду будешь будет будем будете будут ты_делай вы_делайте (повелительное наклонение) //11-12 gp_PNED, gp_PNMN, включающий включавший (действит. пр. - наст. и прош. время) ДЗ //14-14 gp_PDZNV gp_PDZPV включаемый включенный (страдат. пр. - наст. и прош. время) СЗ //15-16 gp_PSZNV gp_PSZPV включая включав (деепричастие - наст. и прош. время) //17-18 gp_DNV gp_DPV Например: ть ю ешь ет ем ете ют л ла ло ли й йте ющий вший емый нный я в КОЛИЧЕСТВО $gp_count Функция генерации: глаг0(число,род,лицо,время?,залог,падеж,одушевленность, двин.падеж.,дтворит.падеж,ддат.падеж,дместа,двремени) число лицо = 1,2,3 время = НФ(неопр.форма) ДЕЕП, ППВ ПНВ (причастия прош. и наст. времени), ? любое значение залог = ДЗ СЗ падеж = ИП РП ДП ВП ТП ПП двп,дтп,ддп,дм,дв = - или + или * (любое) НАРЕЧИЯ и прочие слова: файл nar.txt $nar['nar_word'] $nar['nar_cat'] Например: архиважно как КОЛИЧЕСТВО $nar_count личмест (число,род,лицо,падеж) - генеирует личные местоимения. #я меня мне меня мной мне //число ед., любой род, лицо 1, 6 падежей #ты тебя тебе тебя тобой тебе //число ед., любой род, лицо 2, 6 падежей #он его ему его им нем //число ед., муж.род, лицо 3, 6 падежей #она ее ей ее ей ней //число ед., жен.род, лицо 3, 6 падежей #оно его ему его им нем //число ед., ср.род, лицо 3, 6 падежей #мы нас нам нас нами нас //число множ., любой род, лицо 1, 6 падежей #вы вас вам вас вами вас //число множ., любой род, лицо 2, 6 падежей #они их им их ими них //число множ., любой род, лицо 3, 6 падежей См. также функции sebya(), budu() в коде.
Правила и парадигмы фраз |
Ниже приводится (почти) формальное описание правил генерации фраз, по которым работает программа. После символа # следуют комментарии, при первом вхождении указаны также имена соответствующих функций в коде.
фраза = #$phrase в главной программе случайное число(ч) #get_ch случайное существительное(р,о) #gen_such случайное существительное(р1,о1) случайное время(в) #get_vr случайное время(в1) 1. гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчк #gen_gp gen_gs 2. до + зпт + гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчк #gen_do 3. гс(ч,р,3,в) + гп(ч,р,ИП,о) + "и" + гс(ч,р,3,в) + тчк 4. гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчкзпт + личмест(ч,р,3 ИП) + гс(ч,р,3,в1) + тчк 5. гп(ч,р,ИП,о) + гс(ч,р,3,в) + "и" + гс(ч,р,3,в) + тчк 6. гп(ч,р,ИП,о) + гс(ч,р,3,в) + зпт + "но не" + гс(ч,р,3,в) + тчк 7. гп(ч,р,ИП,о) + тире + "это" + гп(ч,р1,ИП,о1) + тчк 8. гп(ч,р,ИП,о) + воскл + гс(ч,?,?,ПН) + воскл 9. гп(ч,р,ИП,о) + воскл + "не" + гс(ч,?,?,ПН) + воскл 10. гс(ч,р,2,в) + зпт + гп(ч,р,ИП,о) + зпт + "или" + гс(ч,р,2,в) + впр 11. личмест(ч,р,2,ИП) + зпт + гп(ч,р,ИП,о) + зпт + гс(ч,р,2,в1) + тчк 12. гп(ч,р,ИП,о) + зпт + "не" + до + зпт + гп(ч,р1,РП,о1) + тчк 13. гп(ч,р,ИП,о) + зпт + глаг0(ч,р,2,в,'?','?',о,'+','+','+','+','+') + "ли" + личмест(ч,р,2,ИП) + зпт + гс(ч,р,2,в) + "или" + гс(ч,р,2,в) + впр 14. гп(ч,р,ИП,о) + гс (ч,р,3,в) + зпт + до + тчк 15. личмест(ч,р,1,ИП)+гс(ч,р,3,в)+"прочее слово"(как)+"и"+"прочее слово"(как)+зпт+до+ зпт + глаг0(ч,р,?,НФ,?,?,о,'-','-','-','-','*') + сущ (ч,р1,ТП,о1) + тчк 16. гп(МН,р,ИП,о)+зпт+"прочее слово"(куда)+гс(МН,?,?,ПН)+тчк 17. до + гп(ч,р,ИП,о) +"прочее слово"(когда)+гс(ч,р,2,ПВ)+тчк гп(ч,р,п,о) = #ген.подлежащее (сущ.) число-род-падеж-одушевленность gen_gp случайное число(ч1) случайное существительное(р1,о1) 1. гп0(ч,р,п,о) #Существительное gen_gp0 2. гп0(ч,р,п,о) + гп0(ч1,р1,РП,о1) #Существительное существительного 3. гп0(ч,р,п,о) + зпт + по(ч,р,п,о) + зпт #Существительное, существительное 4. по(ч,р,п,о) + гп0(ч,р,п,о) #Прилагательное Существительное gen_po гп0(ч,р,п,о) = #gen_gp0 случайное число(ч1) случайное существительное(р1,о1) 1. сущ(ч,р,п,о) #word_such #компьютер 2. прил(ч,р,п,о) + сущ(ч,р,п,о) #word_pril #активный компьютер 3. прил(ч,р,п,о) + прил(ч,р,п,о) + сущ(ч,р,п,о) #активный осмелевший компьютер 4. сущ(ч,р,п,о) + сущ(ч1,р1,РП,о1) #вертолеты анархий 5. сущ(ч,р,п,о) + прил(ч1,р1,РП,о1) + сущ(ч1,р1,РП,о1) #вертолеты естественных анархий 6. сущ(ч,р,п,о) + сущ(ч1,р1,РП,о1) + прил(ч,р,п,о) #вертолеты анархий естественных 7. прил(ч1,р1,РП,о1) + сущ(ч1,р1,РП,о1) + сущ(ч,р,п,о) #естественных анархий вертолеты 8. "себя"(п) ----- при п!=ИП гс(ч,р,л,в) = #Ген. сказуемое (глагол): число-род-лицо-время gen_gs 1. гс0(ч,р,л,в,-,-,-,-,-) 2. гс0(ч,р,л,в,-,-,-,+,дв) + гс0(-,-,-,НФ,-,-,-,- дв) 3. гс0(ч,р,л,в,-,-,-,-,-) + зпт + до + зпт #gen_do гс0(ч,р,л,в,двп,дтп,ддп,дм,дв) = $gen_gs0 случайное число(ч1) случайное число(ч2) случайное существительное(р1,о1) случайное существительное(р2,о2) если в!=НФ то дв=* 1. глаг(ч,р,л,в,-,-,-,дм,дв) 2. глаг(ч,р,л,в,-,-,-,дм,дв) + обст.места ----- далее только при дм!=+ 3. глаг(ч,р,л,в,-,-,+,-,дв) + гп0(ч1,р1,ДП,о1) 4. глаг(ч,р,л,в,-,+,-,-,дв) + гп0(ч1,р1,ТП,о1) 5. глаг(ч,р,л,в,+,-,-,-,дв) + гп0(ч1,р1,ВП,о1) 6. гп0(ч2,р2,ТП,о2) + глаг(ч,р,л,в,+,+,-,-,дв) + гп0(ч1,р1,ВП,о1) 7. глаг(ч,р,л,в,+,+,-,-,дв) + гп0(ч2,р2,ВП,о2) + гп0(ч1,р1,ТП,о1) 8. глаг(ч,р,л,в,+,-,+,-,дв) + гп0(ч2,р2,ВП,о2) + гп0(ч1,р1,ДП,о1) по(ч,р,п,о) = #причастный оборот: число-род-падеж-одушевленность gen_po 1. по0(ч,р,ПНВ,ДЗ,п,о) #падеж настоящего времени - действительный залог 2. по0(ч,р,ППВ,ДЗ,п,о) 3. по0(ч,р,ПНВ,СЗ,п,о) 4. по0(ч,р,ППВ,СЗ,п,о) #падеж прошедшего времени - страдательный залог по0(ч,р,в,з,п,о) = #причастный оборот gen_po0 случайное число(ч1) случайное число(ч2) случайное существительное(р1,о1) случайное существительное(р2,о2) 1. прич(ч,р,в,з,п,о,-,-,-,-,*) 2. прич(ч,р,в,з,п,о,-,-,-,-,*) + обст.места #gen_obstmesta 3. прич(ч,р,в,з,п,о,-,-,+,-,*) + гп0(ч1,р1,ДП,о1) 4. прич(ч,р,в,з,п,о,-,+,-,-,*) + гп0(ч1,р1,ТП,о1) ----- далее только при з==ДЗ 5. прич(ч,р,в,з,п,о,+,-,-,-,*) + гп0(ч1,р1,ВП,о1) 6. гп0(ч2,р2,ТП,о2) + прич(ч,р,в,з,п,о,+,+,-,-,*) + гп0(ч1,р1,ВП,о1) 7. прич(ч,р,в,з,п,о,+,+,-,-,*) + гп0(ч2,р2,ВП,о2) + гп0(ч1,р1,ТП,о1) 8. прич(ч,р,в,з,п,о,+,-,+,-,*) + гп0(ч2,р2,ВП,о2) + гп0(ч1,р1,ДП,о1) обст.места = #gen_obstmesta случайное число(ч) случайное существительное(р,о) 1. "прочее слово"(где) #word_other 2. "прочее слово"(где...) + гп0(ч,р,РП,о) 3. "в" + гп0(ч,р,ПП,о) до = #деепричастный оборот gen_do случайное число(ч) случайное число(ч1) случайное существительное(р,о) случайное существительное(р1,о1) 1. деепр(-,-,-,-,*) 2. деепр(-,-,-,-,*) + обст.места 3. деепр(-,-,+,-,*) + гп0(ч,р,ДП,о) 4. деепр(-,+,-,-,*) + гп0(ч,р,ТП,о) 5. деепр(+,-,-,-,*) + гп0(ч,р,ВП,о) 6. гп0(ч,р,ТП,о) + деепр(+,+,-,-,*) +','+ гп0(ч,р,ВП,о) #p1,o1? 7. деепр(+,+,-,-,*) + гп0(ч,р,ВП,о) + гп0(ч,р,ТП,о) #p1,o1? 8. деепр(+,-,+,-,*) + гп0(ч,р,ВП,о) + гп0(ч,р,ДП,о) #p1,o1? 9. деепр(-,-,-,-,*) + и + деепр(-,-,-,-,*) 10. деепр(-,-,-,-,*) + глаг0(ч,р,?,НФ,?,?,о,-,-,-,-,*) деепр(двп,дтп,ддп,дм,дв) = #gen_deepr глаг0(?,?,?,ДЕЕП,?,?,?,двп,дтп,ддп,дм,дв) глаг(ч,р,л,в,двп,дтп,ддп,дм,дв) = #gen_glag глаг0(ч,р,л,в,?,?,?,двп,дтп,ддп,дм,дв) #word_glag0 прич(ч,р,в,з,п,о,двп,дтп,ддп,дм,дв) = #gen_prich если з==СЗ то двп=+ если в==ППВ и з==СЗ то дв=+ если в==ПНВ и з==ДЗ то дв=- если в==ПНВ и з==СЗ и ддп==+ то дв=- если в==ПНВ и з==СЗ и ддп==- то дв=+ глаг0(ч,р,?,в,з,п,о,двп,дтп,ддп,дм,дв) #word_glag0
В исходнике оставлено много закомментаренной отладочной печати вида
//print "<br>...";
гостевая; E-mail |