|
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>...";
|
|